Formulario por string
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
Curtidas 0
Respostas
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.
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
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
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 );
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
05/08/2009
ORC, no seu form você deve declarar o seguinte método
Note que você precisa sobreescrever o construtor usando override.
O Método fica assim:
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
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
Note que você precisa sobreescrever o construtor usando override.
O Método fica assim:
public { Public declarations }
constructor Create(aOwner :TComponent; seuParam:TSeuTipo);override;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
05/08/2009
Poste o código do seu construtor e o código da chamada.
GOSTEI 0
Emerson Nascimento
05/08/2009
tente:
onde [i:4d25476044]TClassePai[/i:4d25476044] deve ser substituído pela classe da qual os forms de cadastro são herdeiros.
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