Pra que serve a função NIL

Delphi

20/01/2004

pra que serve a função nil


Josimar

Josimar

Curtidas 0

Melhor post

Marcelo Saviski

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


GOSTEI 1

Mais Respostas

Lucas Silva

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.


GOSTEI 0
Beppe

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

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.


GOSTEI 0
Vinicius2k

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.


GOSTEI 0
Beppe

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

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

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

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

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.


GOSTEI 0
Vinicius2k

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

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

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.

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
POSTAR