Problemas com CreateForm
22/03/2006
0
Exemplo de um trecho do código
procedure ShowForm (FormT:TComponentClass;Form:TForm);
...
Application.CreateForm(FormT,Form);
...
Bem, o procedimento esta funcionando, mas estou tendo um problema em relação ao parâmetro FormT, que é do tipo TComponentClass, pois ao chamar o método: Ex.: ShowForm(TfrmCliente,frmCliente);, o parametro onde eu passeo o TfrmCliente me retorna como nil, o formulário ateh abre numa boa, soh q qdo eu preciso me referenciar a este formulário, eu não consigo.
Obs: Já fiz testes aplicando o CreateForm sem utilizar esta minha rotina e funcionou blz, bem como eu quero, porém eu preciso chamar o form por esta rotina.
Mrmarcelojr
Posts
22/03/2006
Martins
procedure CForm(Frm: TFormClass; nFrm: TForm); begin Application.CreateForm(Frm, nFrm); nFrm.ShowModal; end;
procedure TForm1.Button1Click(Sender: TObject); begin CForm(TForm2, Form2); end;
Boa sorte :!: .
22/03/2006
Paullsoftware
procedure CForm(Frm: TFormClass; nFrm: TForm); begin Application.CreateForm(Frm, nFrm); nFrm.ShowModal; end;
procedure TForm1.Button1Click(Sender: TObject); begin CForm(TForm2, Form2); end;
Martins, não seria viável tirar o form da memória criando ele no try finally
procedure CForm(Frm: TFormClass; nFrm: TForm); begin Try Application.CreateForm(Frm, nFrm); nFrm.ShowModal; Finally nForm.Release; nForm:=Nil; end; end;
22/03/2006
Mrmarcelojr
procedure CForm(Frm: TFormClass; nFrm: TForm); begin Application.CreateForm(Frm, nFrm); nFrm.ShowModal; end;
procedure TForm1.Button1Click(Sender: TObject); begin CForm(TForm2, Form2); end;
eu já faço isso, mas eu naum consigo passar nenhum comando para o formulário criado com este metodo. Ah, esqueci de dizer, eu utilizo MDI.
22/03/2006
Paullsoftware
procedure CForm(Frm: TFormClass; nFrm: TForm); begin Application.CreateForm(Frm, nFrm); nFrm.ShowModal; end;
procedure TForm1.Button1Click(Sender: TObject); begin CForm(TForm2, Form2); end;
eu já faço isso, mas eu naum consigo passar nenhum comando para o formulário criado com este metodo. Ah, esqueci de dizer, eu utilizo MDI.[/quote:c4ff1f8108]
ae, se vc usa MID tente dessa maneira:
// Verifica se o form a ser criado já esta carregado
function FormExiste(aberto: Tform): Boolean; var I:Integer; begin FormExiste := false; for I := 0 to Screen.FormCount -1 do if Screen.Forms[i] = aberto then begin FormExiste := true; Break; end end;
If FormExiste(FUSUARIOS) then begin FUSUARIOS.BringToFront; FUSUARIOS.Focused; end else begin FUSUARIOS := TFUSUARIOS.Create(Self); FUSUARIOS.Focused; end;
22/03/2006
Mrmarcelojr
´Access violation at adress 00540cff in module ´AProd.exe´. Read of adress 000003c4.´
22/03/2006
Mrmarcelojr
procedure CForm(Frm: TFormClass; nFrm: TForm); begin Application.CreateForm(Frm, nFrm); nFrm.ShowModal; end;
procedure TForm1.Button1Click(Sender: TObject); begin CForm(TForm2, Form2); end;
eu já faço isso, mas eu naum consigo passar nenhum comando para o formulário criado com este metodo. Ah, esqueci de dizer, eu utilizo MDI.[/quote:a967631ec7]
ae, se vc usa MID tente dessa maneira:
// Verifica se o form a ser criado já esta carregado
function FormExiste(aberto: Tform): Boolean; var I:Integer; begin FormExiste := false; for I := 0 to Screen.FormCount -1 do if Screen.Forms[i] = aberto then begin FormExiste := true; Break; end end;
If FormExiste(FUSUARIOS) then begin FUSUARIOS.BringToFront; FUSUARIOS.Focused; end else begin FUSUARIOS := TFUSUARIOS.Create(Self); FUSUARIOS.Focused; end;
paullsoftware,
Fiz como voce me mostrou, ms continua dando o mesmo erro quando tento passar algum comando para o form criado.....
estou ficando malucoo...eu preciso urgentemente fazer isso funcionarr!!!
22/03/2006
Paullsoftware
justo, normalmente isso ocorre quando vc usar o showModal... testou o código que te mostrei :?: :?:
22/03/2006
Thiago Vidal
segue exemplo:
procedure CriaForm(FormClass: TComponentClass; var Form: TForm); begin Applicattion.CreateForm(FormClass, Form); // ou melhor ainda: // Form := FormClass.Create(Application); end;
a diverença, está no [u:9daa7b5429]var[/u:9daa7b5429] que retorna a referencia ao form criado, e não o deixa perdido como nos exemplos anteriores.
o erro de access violation ocorre porque a variavel Form continuava como nil mesmo após a chamada da rotina.
talvez seja ainda melhor usar FormClass: TFormClass, para restringir classes de Form, pq TComponentClass é mais abrangente.
não sei se fui muito claro, mas se tiver mais dúvidas sobre o assunto, pode me contatar.
22/03/2006
Mrmarcelojr
procedure CriaForm(FormClass: TComponentClass; var Form: TForm); begin Applicattion.CreateForm(FormClass, Form); // ou melhor ainda: // Form := FormClass.Create(Application); end;
thiago_vidal
seguinte fera, agora apareceu o seguinte erro quando eu chamo o procedimento: ´Types of actual and formal var parameters must be identical´.
Chamei o procedimento da seguinte forma: CriaForm(TfrmCliente,frmCliente);
22/03/2006
Thiago Vidal
procedure CriaForm(FormClass: TFormClass; var Form); begin Application.CreateForm(FormClass, Form); end;
desculpa, não tinha testado no Delphi...
o correto é var Form apenas, sem o : TForm na frente.
acho que agora vai, testei aqui!
um abraço!
22/03/2006
Martins
procedure CriaForm(FormClass: TFormClass; var Form); begin Application.CreateForm(FormClass, Form); end;
Assim como postado pelo [b:ebae2285af]Thiago Vidal[/b:ebae2285af] funciona direitino, pode testar q vai funcionar, boa [b:ebae2285af]Thiago[/b:ebae2285af], vc está passando o From como Reference, o colega tb deveria ter especificado q se tratava de uma aplica MDI, mas tudo bem valew, problema solucionado.
:wink:
22/03/2006
Mrmarcelojr
Ah, e desculpem por naum ter posto que se tratava de MDI...esqueci!!! :oops:
brigadão a todos! :D
22/03/2006
Martins
relaxa :wink:
24/12/2006
Mmoreira
Estou tendo a seguinte dificuldade em adaptar para minha necessidade:
procedure Abre_Form_MDI( FormClass: TFormClass; var Form ); begin if Form = nil then Application.CreateForm(FormClass, Form); end;
Nao compila, da o seguinte erro: ´Incompatible types´
Se eu tiro a condição IF ai funciona perfeitamente ... o problema é que eu gostaria de impedir que o mesmo Form fosse criado mais de uma vez.
Eu até poderia fazer esta verificação fora da Procedure mas para ficar mais simples gostaria de deixar tudo dentro da Procedure mesmo se possivel.
valew!!!
Clique aqui para fazer login e interagir na Comunidade :)