Página principal
Artículos y trucos
Catálogo de productos
Ejemplos y descargas
Mis libros
Cursos de formación
Investigación y desarrollo
Libros recomendados
Mis páginas favoritas
Acerca del autor
 
En colaboración con Amazon
 
Intuitive Sight
 

Solución al Koan #4

ARMAGEDDON: EL DIA DEL JUICIO FINAL

Que no cunda el pánico: el destructor se ejecuta. ¿Por qué no se muestra el mensaje? Bueno, ¿quién ha dicho que no se muestra? El mensaje aparece en pantalla, pero desaparece tan rápidamente que no nos percatamos de su existencia. Hagamos una prueba: sustituya la llamada a ShowMessage por una llamada al método MessageBox de Application:

TObjetoExhibicionista::~TObjetoExhibicionista() 
{
   char buffer[255];

   strcpy(buffer, "¡Adiós, mundo cruel!\nFirmado: ");
   strcat(buffer, fName.c_str());
   Application->MessageBox(buffer, "Last Famous Words",
                           MB_OK | MB_ICONEXCLAMATION);
}

¡Ahora sí debe aparecer el mensaje! La explicación es sencilla, y se basa en una afirmación chocante, a primera vista:


¡Delphi no tiene cuadros de dialogo!... si se entiende por "cuadro de diálogo" aquellos objetos de ventana cuya definición visual se realiza mediante un fichero de recursos, y que se ejecutan mediante la función del API CreateDialog.

Lo que Delphi ofrece es un "sustituto": un formulario o ventana "normal", no modal, pero que ejecuta un ciclo modal de mensajes. El método que se encarga del ciclo de mensajes es, naturalmente, el conocidísimo ShowModal. Y la implementación de ShowModal es esquemáticamente similar a la siguiente:

int TCustomForm::ShowModal()
{
   // ... 
   do {
      // ... leer mensaje ...
      // ... procesar mensaje ...
   } while (! Application->FTerminate);
   // ...
}

¿Puede ver ya la solución? ShowMessage crea un formulario y lo ejecuta llamando a ShowModal. Pero cuando se ejecuta el destructor de la clase exhibicionista, el bucle de mensajes principal de la aplicación ya ha terminado. Lo que implica que el atributo FTerminate de Application ya es verdadero. Por supuesto, el bucle modal termina apenas ha comenzado. Aunque la ventana se muestra en pantalla, desaparece tan rápidamente que no nos damos cuenta.

Por el contrario, TApplication::MessageBox llama a la función MessageBox del API de Windows, que sí se implementa mediante un verdadero cuadro de diálogo.