Pues estaba yo codificando y me he dado cuenta de un detalle tonto.
Tengo que hacer un programa que funciona solo. Se le mete en el "programador de eventos" para que se ejecute, por ejemplo, cada 24h y él trabaja solito y cuando termina su tarea pues se cierra y hasta la siguiente. Se me ocurrió que, en lugar de ser silencioso, abriera una ventana principal con TMemo de sólo lectura en el que fuera escribiendo qué es lo que va haciendo y, cuando termine, que lo vuelque todo en un archivo de texto a modo de cuaderno de bitácora (log). Si se produce un error durante la ejecución, el programa no se cierra y así se puede ver cuándo ha fallado y qué es lo que estaba haciendo cuando se rompió. Hasta aquí todo bien.
Ahora viene lo gordo. Estoy utilizando el evento OnCreate para inicializar el programa, pero no sé como "comenzar el trabajo". Por ahora he hecho algo así como:
Código Delphi
[-]
procedure TVentanaPrincipal.FormCreate(Sender: TObject);
begin
Log ('Inicio del programa');
InicializaPrograma;
Log ('Carga la configuración');
Configuracion := DVC_CONFIGURACION.create;
Configuracion.LeerDe (NombreArchivoConf);
EscribeConsola (LogTab + 'Configuración leída');
WindowState := wsNormal;
Show;
RealizaTrabajo;
end;
Pero claro, no me parece muy correcto y aunque por ahora funciona tal vez me de problemas más adelante. También había pensado en quitar el "Show" y el "RealizaTrabajo" de este evento y ponerlas en el evento "onShow", pero tampoco. Como el trabajo (por ahora) es muy corto el progama termina casi antes de mostrar la ventana, en ambos casos, así que no sé si lo hace bien o no.
Se me había ocurrido hacerlo todo en el módulo principal (el archivo "dpr"). Ahora este archivo es así:
Código Delphi
[-]
begin
TRY
Application.Initialize;
Application.CreateForm(TVentanaPrincipal, VentanaPrincipal);
Application.Run;
EXCEPT
ON E:Exception DO
ShowMessage ('¡¡¡¡¡¡Excepción incontrolable!!!!!!' + #13 + E.Message);
END;
end;
Y yo querría hacer algo así como:
Código Delphi
[-]
begin
TRY
Application.Initialize;
Application.CreateForm(TVentanaPrincipal, VentanaPrincipal);
WITH VentanaPrincipal DO
BEGIN
Log ('Inicio del programa');
InicializaPrograma;
Log ('Carga la configuración');
Configuracion := DVC_CONFIGURACION.create;
Configuracion.LeerDe (NombreArchivoConf);
EscribeConsola (LogTab + 'Configuración leída');
WindowState := wsNormal;
Show;
RealizaTrabajo;
Free;
EXCEPT
ON E:Exception DO
ShowMessage ('¡¡¡¡¡¡Excepción incontrolable!!!!!!' + #13 + E.Message);
END;
end;
Evidentemente eliminaría todo el código de los eventos de la ventana. Sin embargo, eso de quitar el "Application.Run" no termina de gustarme, y si lo pongo no me ejecutará el resto, ¿o sí?
¿Me arriesgo o alguien conoce una forma mejor de hacerlo?