Passar Parametro para Form criado por variável
Estou com o seguinte problema, preciso passar parâmetros para um form, até ai tudo bem, poderia criar um construtor create e passar o parâmetro, o problema é que o form será criado pelo nome que vier em uma variável.
Como Exemplo, imagine um menu que leu um arquivo onde tem os nomes dos FORMS do sistema.
pega a variável que vem o nome do FORM para cria-la e faço conforme codigo abaixo
Procedure CriaForm( FrmCad: String);
var
FrmClass: TFormClass;
Frm: TForm;
begin
FrmClass := TFormClass( FindClass( ''TFrmCFGTabelasDoSistemaCadastro'' ));
Frm := FrmClass.Create(Application);
frm.ShowModal;
com o exemplo acima eu crio o form normal, funciona certinho, mas antes de dar o showmodal eu preciso passar alguns parâmetros para o Form. Nao acho nada de como fazer isso.
logicamente que o codigo abaixo nao funciona
frm.MeuParametro := ''1'';
Como Exemplo, imagine um menu que leu um arquivo onde tem os nomes dos FORMS do sistema.
pega a variável que vem o nome do FORM para cria-la e faço conforme codigo abaixo
Procedure CriaForm( FrmCad: String);
var
FrmClass: TFormClass;
Frm: TForm;
begin
FrmClass := TFormClass( FindClass( ''TFrmCFGTabelasDoSistemaCadastro'' ));
Frm := FrmClass.Create(Application);
frm.ShowModal;
com o exemplo acima eu crio o form normal, funciona certinho, mas antes de dar o showmodal eu preciso passar alguns parâmetros para o Form. Nao acho nada de como fazer isso.
logicamente que o codigo abaixo nao funciona
frm.MeuParametro := ''1'';
Renato Benedetti
Curtidas 0
Respostas
Arthur Heinrich
16/07/2024
A classe TForm certamente não possuirá os parâmetros que você criou na classe TFrmCFGTabelasDoSistemaCadastro.
Uma coisa que você pode fazer é um cast:
(Frm as TFrmCFGTabelasDoSistemaCadastro).Parametro1 := '1';
Um cast como este, se for feito com o tipo errado, pode levar a erros. Então, a menos que tenhamos certeza de que tipo foi utilizado para instanciar a classe, você pode proteger o seu código checando o tipo antes:
if (Frm is TFrmCFGTabelasDoSistemaCadastro) then (Frm as TFrmCFGTabelasDoSistemaCadastro).Parametro1 := '1';
Porém, como a classe será passada por um parâmetro, é muito provável que esta funcionalidade não se aplique ao seu caso.
Uma "gambiarra" que você pode fazer é não herdar seus forms do TForm, mas sim de uma classe genérica RFrmCFG, por exemplo, onde você crie métodos abstratos para setar parâmetros e, em cada form, você implementa estes métodos.
Por exemplo, um método TFrmCFG.SetParameter(nome, valor : String);
Uma outra forma de fazer isso, sem precisar setar os parâmetros, seria criar a classe TFrmCFG com um TStringList para armazenar os parâmetros.
TFrmCFG = class(TForm)
Params : TStringList;
procedure SetParam(Name, Value : String);
constructor TFrmCFG.Create(...);
begin
inherited;
Params:=TStringList.Create;
end;
procedure TFrmCFG.SetParam(Name, Value : String);
begin
Params[Name]:=Value;
end;
destructor TFrmCFG.Destructor(...);
begin
Params.Free;
inherited;
end;
Aí, na sua rotina de criação dos forms. você utilizaria:
Frm: TFormCFG;
begin
FrmClass := TFormClass( FindClass( ''TFrmCFGTabelasDoSistemaCadastro'' ));
Frm := FrmClass.Create(Application);
Frm.SetParam('Parameter1','1');
frm.ShowModal;
Uma coisa que você pode fazer é um cast:
(Frm as TFrmCFGTabelasDoSistemaCadastro).Parametro1 := '1';
Um cast como este, se for feito com o tipo errado, pode levar a erros. Então, a menos que tenhamos certeza de que tipo foi utilizado para instanciar a classe, você pode proteger o seu código checando o tipo antes:
if (Frm is TFrmCFGTabelasDoSistemaCadastro) then (Frm as TFrmCFGTabelasDoSistemaCadastro).Parametro1 := '1';
Porém, como a classe será passada por um parâmetro, é muito provável que esta funcionalidade não se aplique ao seu caso.
Uma "gambiarra" que você pode fazer é não herdar seus forms do TForm, mas sim de uma classe genérica RFrmCFG, por exemplo, onde você crie métodos abstratos para setar parâmetros e, em cada form, você implementa estes métodos.
Por exemplo, um método TFrmCFG.SetParameter(nome, valor : String);
Uma outra forma de fazer isso, sem precisar setar os parâmetros, seria criar a classe TFrmCFG com um TStringList para armazenar os parâmetros.
TFrmCFG = class(TForm)
Params : TStringList;
procedure SetParam(Name, Value : String);
constructor TFrmCFG.Create(...);
begin
inherited;
Params:=TStringList.Create;
end;
procedure TFrmCFG.SetParam(Name, Value : String);
begin
Params[Name]:=Value;
end;
destructor TFrmCFG.Destructor(...);
begin
Params.Free;
inherited;
end;
Aí, na sua rotina de criação dos forms. você utilizaria:
Frm: TFormCFG;
begin
FrmClass := TFormClass( FindClass( ''TFrmCFGTabelasDoSistemaCadastro'' ));
Frm := FrmClass.Create(Application);
Frm.SetParam('Parameter1','1');
frm.ShowModal;
GOSTEI 0