Pra que serve a função NIL
pra que serve a função nil
Josimar
Curtidas 0
Melhor post
Marcelo Saviski
20/01/2004
não
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
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
GOSTEI 1
Mais Respostas
Lucas Silva
20/01/2004
pelo que sei é pra liberar mémoria.
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.
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
Beppe
20/01/2004
[b:fd9b0da6e2]nil[/b:fd9b0da6e2] é uma constante. Ela não tem um tipo definido, mas é compatível com qualquer tipo de ponteiro, classe ou array dinâmico. Significa que não há memória alocada para o objeto. Isto é, não foi criado nem recebeu um objeto válido. Pode ser considerado como valor inválido.
GOSTEI 0
Aroldo Zanela
20/01/2004
Colega,
Só acrescentando que NIL não é uma função e sim uma palavra reservada. Veja mais detalhes no próprio help.
Só acrescentando que NIL não é uma função e sim uma palavra reservada. Veja mais detalhes no próprio help.
GOSTEI 0
Vinicius2k
20/01/2004
[quote:40a006be42=´Marcelo Saviski´]para destruir deve-se chamar [color=green:40a006be42]free[/color:40a006be42]
[/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.
[/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
Beppe
20/01/2004
[quote:895abe00fc=´Marcelo Saviski´]para destruir deve-se chamar [color=green:895abe00fc]free[/color:895abe00fc]
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
Vinicius2k
20/01/2004
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á.
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...
Será que ninguém sabe como utilizar Release? Bem, eu nunca vi!
O Release deve ser usado no caso de você querer liberar o form(e todos os seus subcomponentes) ativo. Ele posta uma mensagem que só executa quando todos os manipuladores de evento deste form tiverem terminada, garantindo assim que nenhum método execute usando dados já liberados(o Free libera instanteneamente).
Ataliba.
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
Maicongabriel
20/01/2004
Concordo com o fato do Free não ser o mais indicado para se utilizar com Form´s, mas voltando a questão do [b:6a98a6468a]josimar[/b:6a98a6468a] e falando sobre qualquer outro tipo de objeto, por exemplo uma StringList, poderia-se unir o util ao agradável (free + nil) = (liberar e anular) da segunte forma ::
[i:6a98a6468a]Claro que a StringList não é o melhor exemplo, mas é somente para constar...[/i:6a98a6468a]
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
Beppe
20/01/2004
vinicius2K, eu apenas resolvi simplificar a história, porque o vício em Release continua. O release sim pode ser usado sempre* no lugar do Free, mas o inverso não é correto. Só que existem Close, e Application.Terminate na jogada. Estas duas últimas figurantes são as responsáveis por eu nunca realmente ter usado Release na minha vida. Simplesmente pelo fato de que se eu quisesse fechar o form por si mesmo, chamo Close. Se o processo de criação/exibição/destruição está em outro form, chamo Free. Ou ainda, uso Application.Terminate.
*Release não funciona no form principal, a aplicação fica como um zumbi na tela.
*Release não funciona no form principal, a aplicação fica como um zumbi na tela.
GOSTEI 0
Vinicius2k
20/01/2004
Simplesmente pelo fato de que se eu quisesse fechar o form por si mesmo, chamo Close. Se o processo de criação/exibição/destruição está em outro form, chamo Free. Ou ainda, uso Application.Terminate.
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
Paulo_amorim
20/01/2004
vinicius2K, eu apenas resolvi simplificar a história, porque o vício em Release continua. O release sim pode ser usado sempre* no lugar do Free, mas o inverso não é correto. Só que existem Close, e Application.Terminate na jogada. Estas duas últimas figurantes são as responsáveis por eu nunca realmente ter usado Release na minha vida. Simplesmente pelo fato de que se eu quisesse fechar o form por si mesmo, chamo Close. Se o processo de criação/exibição/destruição está em outro form, chamo Free. Ou ainda, uso Application.Terminate.
*Release não funciona no form principal, a aplicação fica como um zumbi na tela.
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
Beppe
20/01/2004
Criei um sample que demonstra alguns casos.
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.
O TAboutBox é um form modal. Ele é chamado via um método estático.
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.
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