GARANTIR DESCONTO

Fórum Diferença entre comandos de formulário (Free e Release) #356704

07/04/2008

0

Olá amigos,

Pesquisando na internet, me deparei com dois tipos de comando usados após a criação do formulário. Gosta de saber quais suas diferenças e o mais eficiente para ser usado:

(1)
FormXX := TFormXX.create ( application );
try
FormXX.ShowModal
finally
[b:f9b00e8f57]FormXX.Release;[/b:f9b00e8f57]
FormXX := nil;
end;

(2)
FormXX := TFormXX.create ( application );
try
FormXX.ShowModal
finally
[b:f9b00e8f57]FormXX.Free;[/b:f9b00e8f57]
FormXX := nil;
end;

Obrigado.


Pezzin

Pezzin

Responder

Posts

07/04/2008

Rodc

A Ajuda do Delphi diz que o Release faz com que o sistema termine de processar todas as mensagens que estão pendentes na lista de mensagens do formulário antes de destruí-lo.
Já o Free destroi o formulário sem se preocupar com as mensagens que ainda não foram processadas.
Ou seja, o Free destroi o objeto e continua o processamento e o Release apenas ´marca´ o objeto para destruição futura, retornando imediatamente da função.

A ajuda diz ainda que o Release deve ser usado dentro de procedimentos que processem as mensagens dos objeto ou em rotinas de filhos do objeto. Pois você não pode em uma rotina do próprio objeto destruí-lo com Free, pois caso tenha uma próxima linha que acesse alguma parte do objeto irá gerar erro.
Espero não ter sido muito confuso. :shock:


Responder

Gostei + 0

07/04/2008

Helio Nascimento

Caro rodc

Pegando carona neste Post eu utilizo o FreeAndNil(FrmClientes);

E esta função como se processa internamente?

Abraços/Hélio


Responder

Gostei + 0

07/04/2008

Rodc

[quote:bbfaa620c0=´Helio Nascimento´]...eu utilizo o FreeAndNil(FrmClientes);
E esta função como se processa internamente?[/quote:bbfaa620c0]
FreeAndNil é a mesma coisa que o código abaixo:
FrmClientes.Free;
FrmClientes := nil;

Quando você declara
FrmClientes: TForm;
você está apenas criando um ponteiro para uma estrutura do tipo TForm. Isto deve ocupar, se não me engano, apenas 4 bytes na memória.
Quando você faz
FrmClientes := TForm.Create(Application)
    //ou
Application.CreateForm(TFrmClientes, FrmClientes);   //Não lembro se é assim no Delphi
aí sim você está alocando em memória muitos bytes para a classe do tipo TForm. Os 4 bytes da variável FrmClientes indicam o começo do endereço de memória alocado com o Create.
Quando você faz um Free() você está desalocando todo o espaço reservado pelo Create, porém FrmClientes continua apontando para o endereço onde ele estava. Sendo assim, se você quizer testar se o ponteiro ainda é válido fica difícil, pois ele continua apontando para um endereço de memória onde os dados podem ser válidos (caso já não tenham sido sobrescritos por outras alocações de memória). Fazendo FreeAndNil() você ´limpa´ o ponteiro para esta estrutura.
Se você não atribuir ´nil´ à variável, quando você fizer um ´If Assigned(FrmClientes) then´ o retorno pode ser positivo, causando um grande problema.


Responder

Gostei + 0

07/04/2008

Helio Nascimento

Caro Rodc

O melhor mesmo então é o release FrmClientes;


Responder

Gostei + 0

07/04/2008

Rodc

O Delphi aconselha o Release para funções de tratamento de eventos e para filhos da classe que está sendo destruida. Por exemplo, se você tentar dentro do Form1 fazer um ´Form1.Free´, pode dar erro pois ele irá destruir o formulário e depois tentar continuar o procedimento que pertence ao Form1, mas Form1 já foi destruido. Entendeu? Neste caso, Você usaria o Form1.Release e depois conseguiria fazer outros procedimentos antes do form ser destruido.
Teste os dois códigos abaixo. Coloque-os no evento de um botão na tela do form principal.
Self.Free;
Self.Close;
e
Self.Release;
Self.Close
Não pude testar no Delphi, mas no C++ o primeiro caso dá erro, pois você está tentando destruir o formulário através de uma função que está dentro dele mesmo. Concorda comigo que depois do Free() a função Close() já não existe mais?

Conclusão: Como não é comum você destruir um objeto através de uma função do próprio objeto ou de seu filho, sugiro continuar usando o Free.


Responder

Gostei + 0

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

Aceitar