Verificar se o form já foi criado
20/01/2006
0
Raserafim
Posts
20/01/2006
Truck1n
ele sempre vai retornar um booleano
button1.enable := not (assigned(form));
se tiver falso ele vai retornar verdadeiro.... e vice e versa...
isso evita o If....
Alexandre
21/01/2006
Raserafim
o problema e o seguinte:
minha aplicação é MDI, então no evento OnClose eu coloco Actin := caFree.
ao colocar a verificação conforme vc indicou, ele retorna true, ou seja, ainda existe o form.
alguma coisa tenho que colocar no OnClose?
ou alguma outra verificação tenho que fazer?
22/01/2006
Edilcimar
abaixo tirei do help do delphi
Release method (TCustomForm)
TCustomFormSee also
Destroys the form and frees its associated memory.
Delphi syntax:
procedure Release;
C++ syntax:
void __fastcall Release(void);
Description
Use Release to destroy the form and free its associated memory.
Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form´s event queue are processed before the form is released. Any event handlers for the form or its children [b:4114dca35d]should use Release instead of Free [/b:4114dca35d](Delphi) or delete (C++). Failing to do so can cause a memory access error.
Note:Release returns immediately to the caller. It does not wait for the form to be freed before returning.
22/01/2006
Aasn
quando trabalhamos com forms mdi o Delphi os trata da seguinte forma:
Ao criarmos múltiplas instâncias do mesmo form mdi, o Delphi os renomeia internamente assim:
FormMDI; FormMDI_1; FormMDO_2 ...
então para liberar um form mdi o procedimento é o mesmo de um form sdi, ou seja, no evento OnClose do form colocamos: ´FormMDI := Nil; Action := caFree´. Internamente o Delphi se encarrega dos nomes.
Agora, para controlar o número de instâncias de um form mdi seria assim:
function TForm1.ContarMdi : integer; var i, nf : integer; begin nf := 0; with Form1 do for I := MDIChildCount-1 downto 0 do if MDIChildren[i] is TFormMDI then Inc(nf); Result := nf; end;
if ContarMdi > 3 then ShowMessage(´Número máximo de fichas já foi aberto!´);
[]´s
AASN
22/01/2006
Vinicius2k
Utilize Assigned mas, acrescente ao evento OnClose de SeuForm:
SeuForm := nil;
Utilizar [i:e9d5c8e776]SeuForm.Free[/i:e9d5c8e776], [i:e9d5c8e776]SeuForm.Release[/i:e9d5c8e776], ou [i:e9d5c8e776]Action := caFree[/i:e9d5c8e776] apenas libera o form da memória, mas não nula o ponteiro associado a ele. E é se o ponteiro tem valor ou não a analise feita pelo [b:e9d5c8e776]Assigned[/b:e9d5c8e776].
T+
22/01/2006
Raserafim
no OnClose do form já testei a sugestão de edilcimar, AASN e de vinicius. nenhuma deu certo.
a verificação está sendo esta:
if Assigned(FrmClientes) = false then Application.CreateForm(TFrmClientes, FrmClientes)
22/01/2006
Edilcimar
if Assigned(FrmClientes) = false then
TFrmClientes := TFrmClientes.Create(Self) ;
no onclose do form coloque
TFrmClientes.Release;
22/01/2006
Aasn
para verificar o form na criação uso assim:
procedure TForm1.Button1Click(Sender: TObject); begin if Form2 = Nil then Application.CreateForm(TForm2, Form2); Form2.Show; end;
ao fechar o form mdi, no evento on close, uso assim:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Form2 := Nil; Action := caFree; end;
Apesar de vc dizer que não funciona, testei agora e funcionou perfeitamente como o esperado!
Acho que vc está esquecendo algum detalhe. Olhe com um pouco mais de atenção a sua rotina!
[]´s
AASN
22/01/2006
Vinicius2k
Pode ter sido uma falha de interpretação... eu disse que você deveria [b:cdfd922564]acrescentar[/b:cdfd922564] ao evento OnClose ´SeuForm := nil;´, por isso você deve mater ´Action := caFree;´ exatamente como demonstrado pelo colega AASN em seu último post.
23/01/2006
Raserafim
tem dois detalhes que podem estar sendo decisivo:
1- a aplicação é MDI
2- utilizo um form padrão da qual os outros são herdados. no OnClose padrão tentei colocar
self := nil; Action := caFree;
e a verificação:
if Assigned(FrmClientes) = false then Application.CreateForm(TFrmClientes, FrmClientes) else FrmClientes.Show;
26/01/2006
Gardel
Crio uma função que recebe o nome do form como parametro e retorna verdadeiro caso o form exista.
function ExistForm(NomeForm: String):boolean; var iCont : Integer; begin Result := False; for iCont := 0 to Screen.FormCount - 1 do if Screen.Forms[iCont].Name = NomeForm then begin Result := True; Break; end; end;
dai na chamada do form eu faço assim
procedure TFmPrincipal.Clientes1Click(Sender: TObject); begin If not ExistForm(´FmClientes´) then begin Application.CreateForm(TFmClientes, FmClientes); FmClientes.Show end; end;
é isso ai espero que ajude...
Até mais
26/01/2006
Renato.pavan
self := nil; Action := caFree;
if Assigned(FrmClientes) = false then Application.CreateForm(TFrmClientes, FrmClientes) else FrmClientes.Show;
Tambem trabalho com form padrao e no evento onclose do meu form padrao faço assim:
Action := caFree;
E no form herdado no evento OnClose faço assim:
inherited; if Action = caFree then frmHerdado := NIL;
E no menu principal chamo o form desta forma:
if frmherdado = NIL then frmHerdado := TfrmHerdado.Create(self); frmHerdado.Show;
Clique aqui para fazer login e interagir na Comunidade :)