Array
(
)

Verificar se o form já foi criado

Raserafim
   - 20 jan 2006

como fazer para saber se um determinado form já foi criado (instanciado)?


Truck1n
   - 20 jan 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


Raserafim
   - 21 jan 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?


Edilcimar
   - 21 jan 2006

troque o cafree por release


Raserafim
   - 22 jan 2006

edilcimar, não funcionou não


Edilcimar
   - 22 jan 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 should use Release instead of Free (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.


Aasn
   - 22 jan 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:

#Código

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;


#Código
if ContarMdi > 3 then
ShowMessage(´Número máximo de fichas já foi aberto!´);

[]´s
AASN


Vinicius2k
   - 22 jan 2006

Colega,

Utilize Assigned mas, acrescente ao evento OnClose de SeuForm:
#Código

SeuForm := nil;


Utilizar SeuForm.Free, SeuForm.Release, ou Action := caFree 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 Assigned.

T+


Raserafim
   - 22 jan 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:
#Código


if Assigned(FrmClientes) = false then
Application.CreateForm(TFrmClientes, FrmClientes)



Edilcimar
   - 22 jan 2006

tente assim veja se dá certo
if Assigned(FrmClientes) = false then
TFrmClientes := TFrmClientes.Create(Self) ;
no onclose do form coloque
TFrmClientes.Release;


Aasn
   - 22 jan 2006

Caro raserafim,

para verificar o form na criação uso assim:

#Código

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:

#Código
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


Vinicius2k
   - 22 jan 2006


Citação:
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 acrescentar ao evento OnClose ´SeuForm := nil;´, por isso você deve mater ´Action := caFree;´ exatamente como demonstrado pelo colega AASN em seu último post.


Raserafim
   - 23 jan 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
#Código


self := nil;
Action := caFree;


e a verificação:
#Código

if Assigned(FrmClientes) = false then
Application.CreateForm(TFrmClientes, FrmClientes)
else
FrmClientes.Show;



Raserafim
   - 26 jan 2006

alguma solução para uma plicação MDI?


Gardel
   - 26 jan 2006

Cara eu uso assim....

Crio uma função que recebe o nome do form como parametro e retorna verdadeiro caso o form exista.
#Código


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
#Código

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


Renato.pavan
   - 26 jan 2006


Citação:
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
#Código


self := nil;
Action := caFree;


e a verificação:
#Código

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:

#Código
Action := caFree;


E no form herdado no evento OnClose faço assim:

#Código
inherited;
if Action = caFree then frmHerdado := NIL;


E no menu principal chamo o form desta forma:

#Código
if frmherdado = NIL then
frmHerdado := TfrmHerdado.Create(self);
frmHerdado.Show;



Raserafim
   - 31 jan 2006

gardel, muito bom.

era isso mesmo que queria.

valeu.