Verificar se o form já foi criado

Delphi

20/01/2006

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


Raserafim

Raserafim

Curtidas 0

Respostas

Truck1n

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


GOSTEI 0
Raserafim

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?


GOSTEI 0
Edilcimar

Edilcimar

20/01/2006

troque o cafree por release


GOSTEI 0
Raserafim

Raserafim

20/01/2006

edilcimar, não funcionou não


GOSTEI 0
Edilcimar

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.


GOSTEI 0
Aasn

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:

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

Vinicius2k

20/01/2006

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+


GOSTEI 0
Raserafim

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



GOSTEI 0
Edilcimar

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;


GOSTEI 0
Aasn

Aasn

20/01/2006

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


GOSTEI 0
Vinicius2k

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

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


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



GOSTEI 0
Raserafim

Raserafim

20/01/2006

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


GOSTEI 0
Gardel

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.
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

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
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;



GOSTEI 0
Raserafim

Raserafim

20/01/2006

gardel, muito bom.

era isso mesmo que queria.

valeu.


GOSTEI 0
POSTAR