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