Wracko 1 Denunciar post Postado Fevereiro 14, 2008 Olá! Estou procurando um modo de criar uma procedure para carregar os formulários dinamicamente. Ou seja, ao invés de escrever para todos os formulários a mesma coisa: Application.CreateForm(TFormulario1,Formulario1); TFormulario1.ShowModal; TFormulario1.Release; Eu quero uma procedure que faça isso por mim. Algo como abrirFormulario(TFormulario1); Por que assim, no futuro eu vou precisar fazer verificações antes de dar o showmodal, e com a procedure ficaria muito mais fácil do que implementar um a um. Seguem minhas tentativas (todas frustradas): procedure TFMenu.criaform(const FormName : string);var fc : TFormClass; f : TForm;begin fc := TFormClass(FindClass(FormName)); f := fc.Create(Application); f.ShowModal; f.Release; //adaptado de: http://delphi.about.com/library/weekly/aa080905a.htmend;procedure TFMenu.criaform(NomeForm: TForm);//var// Form: TForm; // isto é somente para omitir uma parametro na xamada da procedurebegin try //troquei esta linha pela de baixo, também dá erro //TForm(NomeForm).Create(application); application.CreateForm(TFormClass(FindClass(TForm(NomeForm).Name)),TForm(NomeForm)); TForm(NomeForm).ShowModal; finally TForm(NomeForm).Release; end;end;//adaptado de: http://imasters.com.br/artigo/3832/delphi/resumindo_programacao///abaixo a procedure original:Procedure CriaForm (NomeForm: TFormClass); Begin Try TForm (ClassForm) := ClassForm.Create(self); TForm (ClassForm).ShowModal; Finally FreeAndNil(ClassForm); End; // Try end; // CriaForm Alguma idéia? Compartilhar este post Link para o post Compartilhar em outros sites
rento 0 Denunciar post Postado Fevereiro 14, 2008 Faz assim; if frmCadastro <> nil then frmCadastro := TfrmCadastro.Create(Application); frmCadastro.showmodal; freeandnil(frmCadastro); O FreeAndNil só é chamado quando o frmCadastro é fechado. Se mesmo assim não quiser acima isso: procedure rLoadForm( pFormCham: TForm; var pForm; const pComp : TComponentClass; const pCaput : string); var lvInst: TComponent; wkStr : string; lvInt : integer; //------------------------------------------------------------------------------ begin if (pCaput <> '') then wkStr := pCaput + ' ' + '(' + plNmLog + ')'; lvInst := TComponent(pComp.NewInstance); TComponent(pForm) := lvInst; try lvInst.Create(nil); rLoadImgBtn(); if (wkStr <> '') then TForm(pForm).Caption := wkStr; if (pFormCham <> nil) then plInf := TForm(pForm).ClassName; TForm(pForm).ShowModal; finally FreeAndNil(TForm(pForm)); end; end;Para usar:rLoadForm(Self, frmCadastro, TfrmCadastro, 'Pesquisa de horários'); Compartilhar este post Link para o post Compartilhar em outros sites
Wracko 1 Denunciar post Postado Fevereiro 14, 2008 Bom, descobri um jeito. Declarei na public do formulario principal: procedure criaform(form:TFormClass); E embaixo do implementation coloquei: procedure TFormulario1.criaform(form:TFormClass); var ff:TForm; begin application.CreateForm(form,ff); ff.showmodal; ff.release; end; Daí é só chamar criaform(TFormularioClientes); Lindo que só vendo. Mas teve um detalhe: no onShow do FormularioClientes tinha assim: FormularioClientes.width:=screen.width; FormularioClientes.hegth:=screen.heigth-75; E estava dando erro. Daí eu troquei para: width:=screen.width; hegth:=screen.heigth-75; E funcionou. Fica então o aviso, se alguém usar essa procedure e der erro, tenta desse jeito http://forum.imasters.com.br/public/style_emoticons/default/grin.gif Compartilhar este post Link para o post Compartilhar em outros sites
Wracko 1 Denunciar post Postado Fevereiro 14, 2008 Rento, muito obrigado, mas já descobri um jeito, como podes ver acima http://forum.imasters.com.br/public/style_emoticons/default/grin.gif Compartilhar este post Link para o post Compartilhar em outros sites
Leandro Araújo 0 Denunciar post Postado Dezembro 26, 2013 class procedure TGUIUtils.CreateModalForm(AForm: TFormClass); var Form : TForm; begin try Application.CreateForm(AForm, Form); Form.ShowModal; finally // Finaliza objeto e libera memória: Form.Release; Form := nil; end; end; Tópico antigo, mas... Eu deixei o meu assim, com base no seu código. Obrigado. :) Compartilhar este post Link para o post Compartilhar em outros sites