Ver Mensaje Individual
  #13  
Antiguo 21-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 31
Lepe Va por buen camino
Hasta donde yo tenía entendido (aprendido de estos foros), es que Release debe llamarse desde un método de la propia clase, no desde fuera, de hecho lo dice aquí:
Cita:
Any event handlers of the form should use Release instead of Free
Esto si está bien:
Código Delphi [-]
procedure TForm1.Button1Click
begin 
  Release;
end;

Esto funciona, pero quizás no como uno espera (lo explico más adelante)
Código Delphi [-]
procedure TForm1.Button1Click
begin 
  Form2.Release;
end;

Atacando la ayuda:
Cita:
Note:
Release returns immediately to the caller. It does not wait for the form to be freed before returning
porque su implementación es:
Código Delphi [-]
procedure TCustomForm.Release;
begin
  PostMessage(Handle, CM_RELEASE, 0, 0);
end;
Lo que quiere decir que tras una llamada a Release, no está garantizado que la ventana se haya destruido completamente, y este punto es importante.

Se podría llamar a Release, y la ventana seguir en pantalla durante 3 minutos, porque está realizando un proceso largo, o tiene mensajes pendientes en su cola de mensaje (incluso mensajes de repintado de la pantalla que, dado que queremos destruirla, no tiene sentido que se realicen).

Al llamar a Free, se está obligando a liberar todos los componentes que haya en el Form, cortando el flujo de mensajes y destruir todo inmediatamente. Además no se procesarán todos los mensajes de la cola de espera (por tanto, los mensajes de repintado, jamás se realizarán). Después de llamar a Free, si está garantizado que la ventana se ha liberado.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 21-11-2007 a las 17:07:39.
Responder Con Cita