Fórum Diferença entre comandos de formulário (Free e Release) #356704
07/04/2008
0
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
Curtir tópico
+ 0Posts
07/04/2008
Rodc
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:
Gostei + 0
07/04/2008
Helio Nascimento
Pegando carona neste Post eu utilizo o FreeAndNil(FrmClientes);
E esta função como se processa internamente?
Abraços/Hélio
Gostei + 0
07/04/2008
Rodc
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;
Quando você faz
FrmClientes := TForm.Create(Application) //ou Application.CreateForm(TFrmClientes, FrmClientes); //Não lembro se é assim no Delphi
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.
Gostei + 0
07/04/2008
Helio Nascimento
O melhor mesmo então é o release FrmClientes;
Gostei + 0
07/04/2008
Rodc
Teste os dois códigos abaixo. Coloque-os no evento de um botão na tela do form principal.
Self.Free; Self.Close;
Self.Release; Self.Close
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)