GARANTIR DESCONTO

Fórum Pra que serve a função NIL #207857

20/01/2004

0

pra que serve a função nil


Josimar

Josimar

Responder

Post mais votado

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


Marcelo Saviski

Marcelo Saviski
Responder

Gostei + 1

Mais Posts

20/01/2004

Lucas Silva

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.


Responder

Gostei + 0

20/01/2004

Beppe

[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.


Responder

Gostei + 0

20/01/2004

Aroldo Zanela

Colega,

Só acrescentando que NIL não é uma função e sim uma palavra reservada. Veja mais detalhes no próprio help.


Responder

Gostei + 0

20/01/2004

Vinicius2k

[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.


Responder

Gostei + 0

20/01/2004

Beppe

[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á.


Responder

Gostei + 0

21/01/2004

Vinicius2k

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 ?...


Responder

Gostei + 0

21/01/2004

Maicongabriel

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]


Responder

Gostei + 0

21/01/2004

Beppe

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.


Responder

Gostei + 0

21/01/2004

Vinicius2k

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?


Responder

Gostei + 0

21/01/2004

Paulo_amorim

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é+


Responder

Gostei + 0

21/01/2004

Beppe

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar