Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Guardar Antes De Cerrar

Iniciado por Antares, 25 de Septiembre de 2003, 05:21:56 PM

« anterior - próximo »

Antares

 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

DraKKaR

 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.

Antares

 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.

nostromo

 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

ethernet

 
template <class saver>
struct save
{
  saver &s;
   save(saver &_s):s(_s){};
    ~save(){ s.Save(); }

};


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


YEAH!

Zaelsius

 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).






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.