Criar e Destruir Forms

Delphi

24/04/2005

Olá, alguem poderia me explicar sobre criar e destruir forms (ou componentes).

1) Já vi vários tópicos com comandos como free, destroy, nil... qual a diferença deles?

2) Na criação, por exemplo, form1:=TForm1.Create(Application); o ´Application´ seria o local onde o form será criado? (na aplicação). Se eu fosse criar qqer outro componente, como um edit, por ex, eu colocaria oq no parênteses?

Obrigado desde já, e desculpa pelas perguntas... é que sou iniciante ainda.

VLW!!!


Sérgio Gobbo

Sérgio Gobbo

Curtidas 0

Respostas

Yallebr

Yallebr

24/04/2005

1) Já vi vários tópicos com comandos como free, destroy, nil... qual a diferença deles? 


O Free chama o Destroy.
O Nil seta seu objeto depois de destruido para Nil. (Se vc destruir seu objeto vc não seta automaticamente para Nil, e sim apenas livra a memoria. Vc teria um ponteiro para memoria inválida qd usa Free.)

O nil resolve o problema acima.

O FreeAndNIl faz tudo em uma unica função. Ele tem suas restrição. Leia elas no F1.


2) Na criação, por exemplo, form1:=TForm1.Create(Application); o "Application" seria o local onde o form será criado? (na aplicação). Se eu fosse criar qqer outro componente, como um edit, por ex, eu colocaria oq no parênteses? 


Quem é o responsável para manipular e liberar o objeto. Vc pode colocar Application, Nil, ou qualquer outro componente que é reponsável para manipular o objeto q vc está criando. Veja a classe TComponente. ´AOwner´.

Espero ter dado um caminho claro para vc seguir e achar o restante de suas dúvidas.

Abraços.


GOSTEI 0
Yuri_fatec

Yuri_fatec

24/04/2005

Olá, alguem poderia me explicar sobre criar e destruir forms (ou componentes). 1) Já vi vários tópicos com comandos como free, destroy, nil... qual a diferença deles? 2) Na criação, por exemplo, form1:=TForm1.Create(Application); o ´Application´ seria o local onde o form será criado? (na aplicação). Se eu fosse criar qqer outro componente, como um edit, por ex, eu colocaria oq no parênteses? Obrigado desde já, e desculpa pelas perguntas... é que sou iniciante ainda. VLW!!!



[b:1bfa228449]
frmForm2 := TForm.Create([color=blue:1bfa228449]Self[/color:1bfa228449])[/b:1bfa228449] ---> O parâmetro do método create indica a quem pertence o objeto criado... Self indica que o objeto frmForm2 pertence ao próprio objeto onde ele foi criado. imagine que vc está criando frmForm2 no código do objeto frmForm1. Quando frmForm1 for destruído, automaticamente, tudo o que foi criado definindo ele como proprietário (frmForm2, por exemplo), será destruído automaticamente. Mas, e se vc quiser que ele não seja destruído??? Aí vc o cria assim:

[b:1bfa228449]frmForm2 := TForm.Create([color=blue:1bfa228449]Application[/color:1bfa228449])[/b:1bfa228449] ---> Aqui vc diz que o proprietário de frmForm2 é a aplicação, ou seja somente quando A APLICAÇÃO for destruída, o obejto frmForm2 será destruído.

Faça um teste! Crie forms das duas formas e feche o form que os criou... me diga o que acontece! 8)

[u:1bfa228449]Quanto ao fechamento do form e liberação de memória consumida por ele (VIA CÓDIGO MESMO):[/u:1bfa228449]

Para fechar um Form via código, chamamos seu método Close. Mas isso não é o suficente para liberar a memória consumida pelo Form criado. Para liberar mesmo a memória consumida por ele, precisamos chamar o método Free para fazê-lo (acho que o Destroy tem função semelhante). Além disso, para completar, temos que atribuir o valor nil ao form, para que ele aponte para NADA, ou seja para, que ele não aponte mais para o espaço de memória que ele apontava quando o objeto foi criado.

[b:1bfa228449]Exemplo:[/b:1bfa228449]
frmForm2.Close; // Fecha o form
frmForm2.Free;   // Libera a memória
frmForm2 := nil;  // Elimina a referência ao endereço de memória

[u:1bfa228449]Quanto ao fechamento do form e liberação de memória consumida por ele (VIA MANIPULADORES DE EVENTO):[/u:1bfa228449]

Crie um manipulador de evento para o evento OnClose (Vá no object inpesctor --> events e clique duas vezes no OnClose para o Delphi criar o manipulador), e codifique as linhas abaixo dentro dele, como mostrado à seguir:

procedure TfrmForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   // Aqui é que está o segredo! O Delphi, por padrão, não 
   // libera a memória ocupada por um formulário. Se vc
   // não escreve a linha abaixo, a ação adotada na verdade
   // é a de esconder o formulário. Por isso, definimos Action
   // com caFree, para ele realmente tirar o danado da memória.
   Action := caFree;
   // idem ao apresentado no último exemplo. 
   frmForm2 := nil;
end;


Sendo assim, quando vc clica no botãozinho de fechar ou mesmo chamar o método close, o seguinte evento será disparado, realizando as ´operações de limpeza´, rsrsr...

Bom, isto é o que o meu breve conhecimento pode lhe oferecer... Se tiverem soluções melhores, poste aqui pra eu aprender tb! rsrsr

Espero ter ajudado de alguma forma...

[ ]´s


GOSTEI 0
Dbergkamps

Dbergkamps

24/04/2005

eu uso assim:
criar:
Application.CreateForm(TForm1, form1);

destruir:
Form1:=nil;
form1.free;


GOSTEI 0
José Henrique

José Henrique

24/04/2005

Deve-se usar o método Free ao invés de Destroy porque Free verifica primeiro se objeto existe para, depois, chamar o Destroy.
Destroy sempre vai tentar destruir o objeto, mas se ele já tiver sido destruído (por outra thread, por exemplo) um exceção será gerada.


GOSTEI 0
Yallebr

Yallebr

24/04/2005

O correto vc primeiro dá um Free depois um Nil. Não é sempre necessário colocar Nil. APenas qd o escopo do objeto não é privado vc usa o NIL.


GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

24/04/2005

Pow gente... vlw msm... vcs esclareceram tds as minhas dúvidas sobre o assunto.... Brigadão!!!

VLW!!!


GOSTEI 0
POSTAR