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.


Olá,
ResponderExcluirmuito boa essa dica, mas será que vc saberia me dizer como usar com forms que passa parametros ?
Grato,
Alessandro.
Você tem 3 opções, sem causar dependência ou acoplamento:
ResponderExcluir1) 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 ;)
Este comentário foi removido pelo autor.
ResponderExcluirOlá Vitor, obrigado pela atenção.
ResponderExcluirPor 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.
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?
ResponderExcluirSe 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.