Formulario por string

Delphi

05/08/2009

tenho um código onde eu tenho cadastrado no banco de dados a classe do meu formulário para abertura dinamica em uma treeview quando clico na treeview ela verifica aclasse cadastrada no banco e abre o formulário, só que estou com um problema queria abrir um form só que estou usanco um constructor onde passo alguns parametros essencias para uso nos formularios gostaria de saber como faço para chamar no create um constructor passando meus parametros e não passando somente o create com self ???



procedure TFrmPrincipal.ChamaFormPelaString(const vNomedoForm: string);
Var
  vFc : TFormClass;
  vF  : TForm;
  vTipoFormulario : String;
begin
  //
  vTipoFormulario := Copy( Trim( vNomedoForm ), 0, 7 );
  vFc := TFormClass(FindClass( vNomedoForm ));
  { * Verifica o Tipo do Formulário para uma abertura diferenciada * }
  { * Rotina para Formulários de Cadastro * }
  if vTipoFormulario = ´TFrmCad´ then
  begin
    if not JanelaAberta( vFc.ClassName ) then
    begin
      vF := vFc.Create( Self );
    end;
  end
  else
  begin
    { * abre formulários que não tenham construtor e só dependam do create* }
    vF  := vFc.Create(Application);
    vF := Create( Self );
  end;
end;



Orc

Orc

Curtidas 0

Respostas

Osocram

Osocram

05/08/2009

no seu form é so declarar o metodo Create usando os parametros que precisa

dentro do metodo vc inicia assim

begin
inherited create(aowner); <--- aqui vc força mesmo não sendo um override usar herança do metodo create;
//tudo q vc precisa aqui....
end;


---------------------------------------

No seu metodo generico vc vai ter q fazer um cast p ele reconhecer este metodo.


GOSTEI 0
Orc

Orc

05/08/2009

o constructor eu construi o problema é que não consigo passar ele ao chamar o metodo create no formulario principal ele so apresneta o metodo create original, gostaria de saber como faço utilizando aquela procedure acima para chamar o formulario com o constructor do create


GOSTEI 0
Osocram

Osocram

05/08/2009

Por isso que eu falei que tem q fazer cast.

Em qual classe que vc criou esse constructor?

por exemplo
if not JanelaAberta( vFc.ClassName ) then
begin
vF := vFc.Create( Self );

Teria que ser algo parecido com isso
if not JanelaAberta( vFc.ClassName ) then
begin
vF := TSeuFormComNovoCreate(vFc).Create( Self,outroParametro );




o constructor eu construi o problema é que não consigo passar ele ao chamar o metodo create no formulario principal ele so apresneta o metodo create original, gostaria de saber como faço utilizando aquela procedure acima para chamar o formulario com o constructor do create



GOSTEI 0
Diegotiemann

Diegotiemann

05/08/2009

ORC, no seu form você deve declarar o seguinte método

 public   { Public declarations }
    constructor Create(aOwner :TComponent; seuParam:TSeuTipo);override;


Note que você precisa sobreescrever o construtor usando override.

O Método fica assim:

constructor TSeuForm.Create(aOwner: TComponent; seuParam: TSeuTipo);
begin
  inherited Create(aOwner);
  //aqui você faz o que quer com seu parâmetros
end;



GOSTEI 0
Orc

Orc

05/08/2009

diego o problema não esta sendo o constructor ele esta certinho o problema esta sendo chamar o construtor dinamicamente com o código acima que demonstrei pq quando passo a classe ele não sabe ainda que a classe possui um con strutor mais sim apenas sua classe original que vem com o create


ORC, no seu form você deve declarar o seguinte método
 public   { Public declarations }
    constructor Create(aOwner :TComponent; seuParam:TSeuTipo);override;
Note que você precisa sobreescrever o construtor usando override. O Método fica assim:
constructor TSeuForm.Create(aOwner: TComponent; seuParam: TSeuTipo);
begin
  inherited Create(aOwner);
  //aqui você faz o que quer com seu parâmetros
end;



GOSTEI 0
Diegotiemann

Diegotiemann

05/08/2009

Poste o código do seu construtor e o código da chamada.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

05/08/2009

tente:
procedure TFrmPrincipal.ChamaFormPelaString(const vNomedoForm: string);
Var
  vFc : TFormClass;
  vF  : TForm;
  vTipoFormulario : String;
begin
  //
  vTipoFormulario := Copy( Trim( vNomedoForm ), 0, 7 );
  vFc := TFormClass(FindClass( vNomedoForm ));
  { * Verifica o Tipo do Formulário para uma abertura diferenciada * }
  { * Rotina para Formulários de Cadastro * }
  if (vTipoFormulario = ´TFrmCad´) and not JanelaAberta(vFc.ClassName) then
    vF := TClassePai(vFc).Create( Self, [demais parametros] )
  else
    { * abre formulários que não tenham construtor e só dependam do create* }
    vF  := vFc.Create(Self);
end;

onde [i:4d25476044]TClassePai[/i:4d25476044] deve ser substituído pela classe da qual os forms de cadastro são herdeiros.


GOSTEI 0
POSTAR