Fórum Criar e Destruir Forms #278641
24/04/2005
0
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
Curtir tópico
+ 0Posts
24/04/2005
Yallebr
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
24/04/2005
Yuri_fatec
[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
24/04/2005
Dbergkamps
criar:
Application.CreateForm(TForm1, form1);
destruir:
Form1:=nil;
form1.free;
Gostei + 0
24/04/2005
José Henrique
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
24/04/2005
Yallebr
Gostei + 0
24/04/2005
Sérgio Gobbo
VLW!!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)