Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Antares en 25 de Septiembre de 2003, 05:21:56 PM

Título: Guardar Antes De Cerrar
Publicado por: Antares en 25 de Septiembre de 2003, 05:21:56 PM
 enasss.

Quiero que si el usuario de mi programa cierra la aplicacion se ejecuten algunas funciones para comprobar cambios y guardar los archivos.

Entre otras cosas lo he intentado sobre todo añadiendo la funcion OnClose a la clase MiProgramaView.


void CReempView::OnClose()
{
OnGuardar();
CFormView::OnClose();
}


Si entro paso a paso se sale de la funcion al programa y no lo cierra.
Si lo ejecuto sin breaks simplemete sale y no hace nada.

¿Cuando se ejecuta OnClose, ya hay algo destruido?
¿Tengo que usar otro mensaje diferente del WM_CLOSE?
¿Cual es el lugar apropiado para guardar los cambios si tu aplicacion tiene un formulario como vista principal?

Asiasss :P

Antares
Título: Guardar Antes De Cerrar
Publicado por: DraKKaR en 25 de Septiembre de 2003, 11:10:25 PM
 Creo que WM_CLOSE se ejecuta cuando la ventana quiere ser destruida, y WM_DESTROY cuando ya lo ha sido... no estoy seguro, hablo de memoria, consulta la msdn.
Título: Guardar Antes De Cerrar
Publicado por: Antares en 26 de Septiembre de 2003, 02:35:52 PM
 La MSDN dice segun entiendo yo con mi parco ingles que esa funcion se llama cuando no hay nada destruido. Osea que WM_CLOSE es el mensaje que necesito interceptar pero no me funciona.

Remarks
An application can prompt the user for confirmation, prior to destroying a window, by processing the WM_CLOSE message and calling the DestroyWindow function only if the user confirms the choice.
Título: Guardar Antes De Cerrar
Publicado por: nostromo en 28 de Septiembre de 2003, 08:10:39 PM
 El problema que creo que tienes es que la clase de MFC CFormView llama a DestroyWindow por si sola (dentro de OnClose), es decir que solo te avisa...

Citar
afx_msg void OnClose( );

Remarks

The framework calls this member function as a signal that the CWnd or an application is to terminate. The default implementation calls DestroyWindow

Tienes que tratar de capturar el evento WM_CLOSE a lo bruto(antes de que que lo haga el MFC). Y dentro de este evento llamar a OnClose según te convenga.  Aunque lo dificil es capturar el WM_CLOSE.

Otra opción que puede funcionar es implementar la función virtual CWnd::DestroyWindow  :
virtual BOOL DestroyWindow( );

Y llamar desde ahi a DestroyWindow según sea...

Y la mejor opción es pasarse a C++Builder que ya va preparado para estas cosas :)

Un saludo

Nostromo
Título: Guardar Antes De Cerrar
Publicado por: ethernet en 02 de Octubre de 2003, 10:36:20 PM
 
template <class saver>
struct save
{
  saver &s;
   save(saver &_s):s(_s){};
    ~save(){ s.Save(); }

};


main()
{
miventanadeputamadre win;
{
saver(win);
win.loop();
}
}


YEAH!
Título: Guardar Antes De Cerrar
Publicado por: Zaelsius en 02 de Octubre de 2003, 11:10:59 PM
 Has probado a capturar el mensaje WM_QUIT?

CitarThe WM_QUIT message indicates a request to terminate an application and is generated when the application calls the PostQuitMessage function. It causes the GetMessage function to return zero.

Edit:

Es MFC, no?

Yo usé algo así para cerrar mi sniffer de teclado(MFC tb)
Citar
int CSniffXApp::ExitInstance()
{
   FlushLoggedKeys(true);
   ExitDirectInput();

   return CWinApp::ExitInstance();
}

Esto funciona(casi siempre, ya sabeis k es windows) cuando alguien termina el proceso desde el administrador de tareas, y tb funciona cuando cierras windows, dandole tiempo al programa para realizar sus tareas de finalización.

El código fuente lo tienes en zs games por si quieres echarle un vistazo. Usé MFC por las facilidades para el acceso FTP, no por otra cosa(pq el sniffer no tiene ventana visible claro).