segunda-feira, 15 de agosto de 2011

Criando um lookup que chame uma de suas forms

Um leitor deu a dica de fazer um lookup que chame uma das forms do projeto. Há várias maneiras de se fazer isso, mas uma que encontrei foi usar formulários registrados com RegisterClass. Depois é só usar FindClass para encontrar o formulário, e FindComponent para encontrar o componente onde reside o valor a ser trazido. Se o componente for um TPersistentField, melhor ainda. Ele pode ser achado, e com um typecast para TField seu valor (o valor encontrado e escolhido no formulario de procura/cadastro padrão) pode ser trazido para o keyvalue.

Abaixo um exemplo de como isso pode ser feito. Primeiro o registro do formulario:
initialization

  RegisterClass(TfrmConsulta);

Depois a chamada dele. Repare que ele é desconhecido para o formulário principal: não está no uses.
procedure TfrmPrincipal.Button1Click(Sender: TObject);
var
  NewFormClass: TFormClass;
  NewForm: TForm;
begin
  NewFormClass := TFormClass(FindClass( 'TFrmConsulta' ));
  //detalhe: esse  string 'TFrmConsulta' pode vir de um campo, edit, banco de dados, arquivo de configuração etc
  try
    NewForm := NewFormClass.Create(nil);
    NewForm.ShowModal;
  finally
    FreeAndNil(NewForm);
  end;
end;

Esse exemplo mostra como registrar formularios e chamá-los sem colocar no uses e sem que o "cliente" saiba da sua existencia.
Assim que tiver um tempo coloco isso encapsulado em um lookup.

5 comentários:

  1. Olá,

    muito boa essa dica, mas será que vc saberia me dizer como usar com forms que passa parametros ?

    Grato,

    Alessandro.

    ResponderExcluir
  2. Você tem 3 opções, sem causar dependência ou acoplamento:

    1) Transforme o parâmetro em uma propriedade published e use RTTI para preenche-lo se ele existir.

    2) Faça com que os formulários com parâmetros herdem de uma form em comum que tenha esse parametro. Daí, em uma unit separada declare na seção interface:
    type
    MinhaFormComParametroClass = class of TMinhaFormComParametro (ponha no uses dessa unit a unit da sua TMinhaFormComParametro )

    substitua NewFormClass: TFormClass; por:
    NewFormClass: MinhaFormComParametroClass;

    substitua

    NewFormClass := TFormClass(FindClass( 'TFrmConsulta' ));


    por

    NewFormClass := MinhaFormComParametroClass(FindClass( 'TFrmConsulta' ));



    A terceira forma é com interfaces, a classe da form tem que implementar uma interface que aceite esse parâmetro através de um setter ou propriedade.

    Espero ter ajudado ;)

    ResponderExcluir
  3. Este comentário foi removido pelo autor.

    ResponderExcluir
  4. Olá Vitor, obrigado pela atenção.

    Por não ser tão experiente assim, gostaria que se possivel ver um exemplo da forma mais simples, pois não manjo nada sobre esses recursos que vc citou acima.

    eu aprendi a usar assim nos forms:

    constructor Create(AOwner: TComponent; Cliente: String; Valor: Real); overload;

    e por ai vai, depende dos parametros que tenho que passar para o form.

    Grato pela atenção.

    Alessandro.

    ResponderExcluir
  5. Você necessita mesmo usar constructor com parâmetros? Não tem como substituir os parâmetros por propriedades, ou atribuir um valor default a eles?

    Se você não pode usar constructor sem parâmetros é porque provavelmente você abre o seu dataset no evento oncreate do formulário ou até no próprio constructor para ele já abrir mostrando os dados. Não faça isso. Abra os datasets dentro de um método, e só chame o método depois que os parâmetros ou propriedades estiverem setados.

    Depois do create você tem que dar um show, certo? Então crie, sete os parâmetros através de propriedades ou métodos (ou já os passe no método que abrirá o dataset) e por último chame o método que abrirá o dataset.

    Agora estou meio que no desespero com trabalho e pós graduação, mas assim que tiver um tempo eu posto um artigo mostrando como fazer isso.

    ResponderExcluir

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)