Fórum Formulario por string #373152

05/08/2009

0

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

Responder

Posts

05/08/2009

Osocram

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.


Responder

Gostei + 0

05/08/2009

Orc

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


Responder

Gostei + 0

05/08/2009

Osocram

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



Responder

Gostei + 0

05/08/2009

Diegotiemann

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;



Responder

Gostei + 0

05/08/2009

Orc

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;



Responder

Gostei + 0

05/08/2009

Diegotiemann

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


Responder

Gostei + 0

06/08/2009

Emerson Nascimento

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar