Page 1 of 1

reiniciar una aplicación

PostPosted: Fri Oct 28, 2005 10:19 pm
by José Luis Sánchez
Hola:
Me gustaría saber si existe la manera de reiniciar una aplicación desde dentro de la misma. Hay situaciones como un cambio de idioma, coger datos de configuración,... que hacen necesario reiniciar la aplicación, y me gustaría saber como se hace.

Saludos,

Es una forma poco ortodoxa pero me funciona

PostPosted: Sat Oct 29, 2005 8:11 am
by jesus
Es una forma poco ortodoxa pero me funciona,
donde quieras que se reinicie tu aplicación,
1º llamas a un exe que va a volver a llamar a tu aplicación
2º te sales de la aplicación

Espero te sirva,
Saludos

.... tu codigo de tu aplicacion ...
Ejecuta("LlamaNuevoExe.EXE )
ErrorLevel(3)
PostQuitMessage(0)
__Quit()
.... fin


--- LlamaNuevoExe.EXE ---
// LLamaNuevoExe.prg sólo tiene una función y es llamar a tu aplicación.
function LlamaNuevoExe()
Ejecuta("TuAplicación.EXE")
Return nil

-- Function Ejecuta --
*******************************
* Ejecutar Programas Externos *
*******************************
FUNCTION Ejecuta(cEjecuta, lSeparate)
LOCAL hInstance
DEFAULT lSeparate TO .F.
IF IsWinNT()
IF lSeparate
hInstance := WinExec("cmd.exe /c start /SEPARATE "+cEjecuta ,0)
ELSE
hInstance := WinExec("cmd.exe /c start "+cEjecuta ,0)
ENDIF
ELSE
hInstance := WinExec("Start "+cEjecuta ,0)
ENDIF
RETURN hInstance

re:

PostPosted: Sun Oct 30, 2005 4:03 pm
by José Luis Sánchez
Gracias Jesús. Lo que quiero hacer es que el mismo exe se llame a si mismo. Lo que me propones está bien, pero no es lo que quiero hacer.

Saludos,

PostPosted: Sun Oct 30, 2005 6:42 pm
by Antonio Linares
Jose Luis,

Con WinExec() podrías volver a ejecutar el EXE, luego darle foco a la nueva aplicación y finalmente terminar la primera.

De un modo esquemático sería asi:

WinExec( <aplicacion> )
SetFocus( <ventana_principal_aplicacion_nueva_instancia> )
<ventana_principal>:End()

Asi terminaría la actual, y la nueva quedaría activa.

PostPosted: Sun Oct 30, 2005 7:18 pm
by José Luis Sánchez
Antonio:

¿ y como le doy foco a la nueva instancia de la aplicación ?

PostPosted: Sun Oct 30, 2005 7:47 pm
by Antonio Linares
Puedes usar FindWindow() para encontrar el handle de la ventana.

Posiblemente habría que esperar un poco desde que arrancas la aplicación con WinExec() hasta que la ventana se crea y está visible.

Habría que revisar las opciones de WinExec() ó usar alguna función que aguarde un cierto tiempo (Sleep(), bucle con SysRefresh(), etc.)