Fórum Pra que serve a função NIL #207857
20/01/2004
0
Josimar
Curtir tópico
+ 0Post mais votado
20/01/2004
se vc fizer form := nil, só desreferencia a varavel do form para a instancia do objeto
[color=green:d06c862ceb][b:d06c862ceb]nil [/b:d06c862ceb]= Pointer(0);[/color:d06c862ceb]
quando voc~e cria o formulário, a váriavel Form só recebe uma referencia para o objeto, um ponteiro que ´aponta´ para a memória do formulário, se você fizer form := nil não destroi o form, só faz com que a variavel do form não aponte mais para o formulário
para destruir deve-se chamar [color=green:d06c862ceb]free[/color:d06c862ceb]
o nil serve para limpar um campo, por exemplo, Table.dataset := nil;
é o equivalente a ir no ObjectInspector e deixar a propriedade dataSet em branco
Marcelo Saviski
Gostei + 1
Mais Posts
20/01/2004
Lucas Silva
Tipo assim.. o form tá sendo usado, ai quando você não vai usar mais ele você dá um [b:5861f14769]nil[/b:5861f14769], que ele é destruido.
Gostei + 0
20/01/2004
Beppe
Gostei + 0
20/01/2004
Aroldo Zanela
Só acrescentando que NIL não é uma função e sim uma palavra reservada. Veja mais detalhes no próprio help.
Gostei + 0
20/01/2004
Vinicius2k
[/quote:40a006be42]
Marcelo, se me permitir discordar, acredito que o método free não seja o ideal para destruir o form, visto que ele não aguarda o término dos posts, podendo causar exceções (os famigerados Access Violation)... acredito de que o método [color=green:40a006be42]Release[/color:40a006be42] seja o mais indicado para forms.
Gostei + 0
20/01/2004
Beppe
Marcelo, se me permitir discordar, acredito que o método free não seja o ideal para destruir o form, visto que ele não aguarda o término dos posts, podendo causar exceções (os famigerados Access Violation)... acredito de que o método [color=green:895abe00fc]Release[/color:895abe00fc] seja o mais indicado para forms.[/quote:895abe00fc]
Isto só realmente importa se você quiser destruir a si mesmo, tipo, se o clique de um botão é pra fechar o for em que está.
Gostei + 0
21/01/2004
Vinicius2k
mas não é forma mais comum? normalmente a liberação é disparada pelo proprio form ou pela rotina q o criou, assim q ele é fechado...
pô Ataliba, fiquei até feliz quando, há algum tempo vc foi um dos poucos que concordou comigo em relação ao release...
veja bem, não é uma crítica... mas um questinamento... algum estudo mais detalhado seu o fêz concluir que o release é desnecessário nestes casos ?...
Gostei + 0
21/01/2004
Maicongabriel
var
sl : TStringList;
begin
sl := TStringList.Create;
sl.Clear;
{ mexe com a sl }
{ libera da memoria e anula o objeto }
FreeAndNil(sl);
end;[i:6a98a6468a]Claro que a StringList não é o melhor exemplo, mas é somente para constar...[/i:6a98a6468a]
Gostei + 0
21/01/2004
Beppe
*Release não funciona no form principal, a aplicação fica como um zumbi na tela.
Gostei + 0
21/01/2004
Vinicius2k
Beppe,
era essa questão que não estava clara para mim... então, se um form principal, cria + mostra(modal) + destroi, um segundo form, o método close do segundo form é seguro, digamos assim, ele não é um simples ´fecha isso ae meu filho´... ele irá realizar todas as operações necessárias para que o free da rotina criadora seja seguro de ser aplicado... eh isso?
Gostei + 0
21/01/2004
Paulo_amorim
realmente, sempre que eu preciso uso o Free devido ao Close...no Form em si o Close eh mais que suficiente, e o free apenas libera memoria...
apesar de util, o Release acaba nao sendo imprescindivel...
Obrigado Beppe por postar essa msg porque eu ja estava considerando começar a usar o release devido a essa ´melhora´ :) que tem sobre o Free...
Até+
Gostei + 0
21/01/2004
Beppe
Código: [url]http://www.afw.hpg.com.br/Release.tar[/url]
O TForm1 é o form principal. Através dele outros form são chamados. Um Close é usado para terminar a aplicação.
O TForm2 é um form não-modal. Pode haver várias instâncias dele. Ele é liberado quando é fechado.
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end;
O TAboutBox é um form modal. Ele é chamado via um método estático.
class procedure TAboutBox.ShowAbout(const Title, Thanks, Web: String); begin with TAboutBox.Create(nil) do try Caption := Title; Label1.Caption := Thanks; StaticText1.Caption := Web; ShowModal; finally Free; end; end;
Não usei Release porque considero uma má prática. No modelo OO, conceitualmente o objeto não sabe quando se liberar, apenas como se finalizar. A liberação da memória deve ser delegada ao possuidor do objeto. Por conveniência, usei o OnClose para destruir instâncias do TForm2. Este manipulador poderia estar no TForm1, mas resolvi deixar no próprio TForm2.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)