sistema - Cerrar y reiniciar la aplicación actual en DELPHI.
obtener la hora del sistema en delphi (4)
Hay otra forma de cerrar y reiniciar la aplicación:
Guarde una tarea programada en poco tiempo después del cierre de la aplicación. Esto tendrá que ser lo ÚLTIMO que haga su aplicación antes de salir (no más procesamiento de datos, guardado, carga o lo que sea)
p.ej.
- obtener la hora del sistema primero
- configura la tarea programada algún tiempo después de este tiempo (el evento programado tendrá que iniciar tu ejecutable)
- Salga de su aplicación (cerrando el formulario principal o application.terminate lo hará)
Cuando el programa se inicie de nuevo, debe verificar si hay alguna tarea programada y eliminarlas. Esta debe ser la MUY PRIMERA acción que su aplicación debe realizar al iniciar. (limpiar)
- verifica cualquier tarea programada creada por tu ejecutable
- removerlos
AFAIK, el conjunto de componentes Delphi Jedi tiene un componente con el que puedes hacer la tarea de programación.
¿Cómo puedo hacer esto?
Por alguna razón o seleccionado por el usuario, "pregunte" a la aplicación actual para reiniciarla.
Podría tener un programa separado de restart.exe simple que ejecute desde su programa y pasarle el nombre de su archivo ejecutable. Luego cierra tu programa. El programa de reinicio puede esperar un tiempo, o hasta que el archivo ejecutable se pueda leer, lo que parece significar que no se está ejecutando, luego puede ejecutarlo y cerrarse.
Espero que haya una mejor manera de hacerlo, tal vez sombody puede proporcionar una mejor solución, pero esta función parece decirme si un ejecutable se está ejecutando actualmente:
function CanReadWriteFile(const f: TFileName): boolean;
var
i: integer;
begin
Result := false;
i := FileOpen(f, fmOpenReadWrite);
if i >= 0 then begin
Result := true;
FileClose(i);
end;
end;
Puedo agregar a la respuesta de @Andreas Rejbrand:
Si el código se realiza en el archivo .dpr antes de Application.Initialize.
Para mí es mejor llamar a Halt(0)
lugar de Application.Terminate
. Lo necesito porque en el primer programa de inicio hace alguna instalación y luego se reinicia. Si llamo a Application.Terminate
formulario principal parpadea durante unos segundos (¡pero no se debe crear en absoluto!) Y luego la aplicación se cierra. Así que mi código es el siguiente:
proyecto.dpr:
if FirstRun then
begin
DoFirstRunStuff();
ShellExecute(Application.Handle, nil, PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
Halt(0);
end;
...
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
uses ShellAPI;
...
procedure TForm1.RestartThisApp;
begin
ShellExecute(Handle, nil, PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
Application.Terminate; // or, if this is the main form, simply Close;
end;