Verificar se o form já foi criado
como fazer para saber se um determinado form já foi criado (instanciado)?
Raserafim
Curtidas 0
Respostas
Truck1n
20/01/2006
assigned(form);
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
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
GOSTEI 0
Raserafim
20/01/2006
funcionou parcialmente.
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?
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?
GOSTEI 0
Edilcimar
20/01/2006
troque o cafree por release
GOSTEI 0
Raserafim
20/01/2006
edilcimar, não funcionou não
GOSTEI 0
Edilcimar
20/01/2006
eu uso o formX.release e libera memória
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.
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.
GOSTEI 0
Aasn
20/01/2006
Olá raserafim,
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:
[]´s
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
GOSTEI 0
Vinicius2k
20/01/2006
Colega,
Utilize Assigned mas, acrescente ao evento OnClose de SeuForm:
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+
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+
GOSTEI 0
Raserafim
20/01/2006
foi mal pessoal mas não está dando certo não.
no OnClose do form já testei a sugestão de edilcimar, AASN e de vinicius. nenhuma deu certo.
a verificação está sendo esta:
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)
GOSTEI 0
Edilcimar
20/01/2006
tente assim veja se dá certo
if Assigned(FrmClientes) = false then
TFrmClientes := TFrmClientes.Create(Self) ;
no onclose do form coloque
TFrmClientes.Release;
if Assigned(FrmClientes) = false then
TFrmClientes := TFrmClientes.Create(Self) ;
no onclose do form coloque
TFrmClientes.Release;
GOSTEI 0
Aasn
20/01/2006
Caro raserafim,
para verificar o form na criação uso assim:
ao fechar o form mdi, no evento on close, uso assim:
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
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
GOSTEI 0
Vinicius2k
20/01/2006
no OnClose do form já testei a sugestão de edilcimar, AASN e de vinicius. nenhuma deu certo.
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.
GOSTEI 0
Raserafim
20/01/2006
ainda não está dando certo.
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
e a verificação:
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;
GOSTEI 0
Raserafim
20/01/2006
alguma solução para uma plicação MDI?
GOSTEI 0
Gardel
20/01/2006
Cara eu uso assim....
Crio uma função que recebe o nome do form como parametro e retorna verdadeiro caso o form exista.
dai na chamada do form eu faço assim
é isso ai espero que ajude...
Até mais
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
GOSTEI 0
Renato.pavan
20/01/2006
ainda não está dando certo.
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
e a verificação:
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;
GOSTEI 0
Raserafim
20/01/2006
gardel, muito bom.
era isso mesmo que queria.
valeu.
era isso mesmo que queria.
valeu.
GOSTEI 0