Koan #2: ¿Hay vida después de la muerte?
Con frecuencia, utilizo el evento OnClose de los formularios para hacer que estos se destruyan automáticamente al cerrarse:
procedure TDialogo.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
Si se trata de un formulario que debe ejecutarse modalmente (como un cuadro de diálogo), el código que utilizo habitualmente para crear el objeto, ejecutar el diálogo y permitir que se autodestruya es como el siguiente:
// ...
TDialogo.Create(nil).ShowModal;
// ...
Se supone que después de terminar la ejecución de la función ShowModal (porque el usuario cierra el diálogo), el objeto recién creado se destruye. ¿Hasta aquí de acuerdo? Antes de descubrir el truco con el evento OnClose, yo utilizaba esta otra variante, en la cual la destrucción es explícita:
// ...
with TOtroDialogo.Create(nil) do
try
ShowModal;
finally
Free;
end;
// ...
Sin embargo, un buen día descubrí por accidente que si en la clase TOtroDialogo definía un evento OnClose similar al de TDialogo, la última secuencia de creación/destrucción seguía funcionando estupendamente bien. Esto me planteó una serie de problemas teológicos: ¿acaso el truco con caFree no destruía realmente el objeto? ¿Cómo entonces, en caso contrario, la llamada a Free no reventaba, si al parece tratábamos de destruir un objeto dos veces? ¿Existía vida para los objetos después de la muerte? Hice pruebas exhaustivas y comprobé que:
- Los dos métodos (el uso de caFree y el uso explícito de Free), efectivamente, funcionan bien por separado.
- Al mezclar las dos técnicas, el algoritmo sigue funcionando bien, y el objeto se destruye una sola vez.
¿Cómo es posible?
|