Verificar se o form já foi criado

20/01/2006

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


Raserafim

Respostas

20/01/2006

Truck1n

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


Responder Citar

21/01/2006

Raserafim

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?


Responder Citar

21/01/2006

Edilcimar

troque o cafree por release


Responder Citar

22/01/2006

Raserafim

edilcimar, não funcionou não


Responder Citar

22/01/2006

Edilcimar

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.


Responder Citar

22/01/2006

Aasn

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:

function TForm1.ContarMdi : integer;
var i, nf : integer;
begin 
nf := 0;
with Form1 do
    for I := MDIChildCount-1 downto 0 do
       if MDIChildren[i&93; is TFormMDI then
         Inc(nf);
Result := nf;
end;


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

[]´s
AASN


Responder Citar

22/01/2006

Vinicius2k

Colega,

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+


Responder Citar

22/01/2006

Raserafim

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:
  if Assigned(FrmClientes) = false then
    Application.CreateForm(TFrmClientes, FrmClientes)



Responder Citar

22/01/2006

Edilcimar

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


Responder Citar

22/01/2006

Aasn

Caro raserafim,

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


Responder Citar

22/01/2006

Vinicius2k

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.


Responder Citar

23/01/2006

Raserafim

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
self := nil;
Action := caFree;


e a verificação:
  if Assigned(FrmClientes) = false then
    Application.CreateForm(TFrmClientes, FrmClientes)
  else
    FrmClientes.Show;



Responder Citar

26/01/2006

Raserafim

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


Responder Citar

26/01/2006

Gardel

Cara eu uso assim....

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&93;.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


Responder Citar

26/01/2006

Renato.pavan

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
self := nil;
Action := caFree;
e a verificação:
  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;



Responder Citar