Funktion Ausführen wenn Anwendung geschlossen wird !



  • Hallo,

    wo muss sich meinen Funktionausfruf Logout() unterbringen damit er ausgeführt wird wenn ich meinen Dialog schließe.

    Dabei soll es egal sein ob ich den Button schließen auswaähle oder oben rechts auf das kleines x klicke!

    Kann mir da einer einen Rat geben ?

    Danke Coolsero



  • Hallo,
    wenn Du dein Dialog geschlossen hast dann springt die Funktion hier rein:

    BOOL CMyDialog ::InitInstance()
    {
    #ifdef _AFXDLL
    	Enable3dControls();			// Call this when using MFC in a shared DLL
    #else
    	Enable3dControlsStatic();	// Call this when linking to MFC statically
    #endif
    
    	CMyDialog dlg;
    
    	m_pMainWnd = &dlg;
    	int nResponse = dlg.DoModal();
            // hier steht die Ausführung
    	if (nResponse == IDOK) // 
    	{
    		// TODO: Place code here to handle when the dialog is
    		//  dismissed with OK
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// TODO: Place code here to handle when the dialog is
    		// dismissed with Cancel , egal ob Button Cancel oder das 'X' gedrückt
    	}
        // hier kann die Funktion auch aufgerufen werden
        LogOut();
    	// Since the dialog has been closed, return FALSE so that we exit the
    	//  application, rather than start the application's message pump.
    	return FALSE;
    }
    

    Du kannst es natürlich auch früher abfangen, in der Dialogklasse selber, bevor
    das Programm hier her kommt!

    Hoffe das hilft Dir weiter!

    mfg
    pixel



  • Hallo pixel,

    ich denke das wird mir weiterhelfen!

    Danle Coolsero



  • @Pixel: Bist du sicher, daß das Funktioniert? Die InitInstance() wird auch ziemlich am Anfang von DoModal() aufgerufen - und damit fängst du dir eine saubere *g* Endlosrekursion ein.

    @Coolsero: Ich würde eher die OnClose() oder DestroyWindow() dafür verwenden.



  • @CStoll,
    nein, bin nicht sicher, ich mach das eh immer in der Dialogklasse so wie Du das gesagt hat, in OnClose() oder OnCancel() befor das Dialog geschlossen wird!
    🙂 darum habe ich auch geschrieben:

    Du kannst es natürlich auch früher abfangen, in der Dialogklasse selber, bevor
    das Programm hier her kommt!

    Aber warum Endlosrekursion? Ich hab in die Zeile vor dem verlassen
    Eine einfache "AfxMessageBox(L"Das ist das Ende!")" eingefügt, bei einer Rekursion
    müste die doch dann laufend ausgeführt werden, oder nicht, wird Sie aber nicht sondern ausgeführt und geschlossen, ?? 😕
    Übrigens ich wusste einfach nicht genau was er braucht, dafür bin ich ja (Gott sei Dank) nicht aleine im Forum 😃

    mfg
    pixel



  • pixel schrieb:

    Aber warum Endlosrekursion? Ich hab in die Zeile vor dem verlassen
    Eine einfache "AfxMessageBox(L"Das ist das Ende!")" eingefügt, bei einer Rekursion
    müste die doch dann laufend ausgeführt werden, oder nicht, wird Sie aber nicht sondern ausgeführt und geschlossen, ?? 😕

    Die Rekursion ist auch etwas weiter oben:

    BOOL CMyDialog::InitInstance()
    {
        CMyDialog dlg;
    
        int nResponse = dlg.DoModal();// <- das hier führt zu einem rekursiven Aufruf von InitInstance()
        ...
    }
    

    (versuch's mal mit einer "AfxMessageBox(L"Es geht los!")" am Anfang der Funktion)

    PS: Wenn du selber sowieso OnClose() verwendest, warum schlägst du dann anderen solche abenteuerlichen Konstruktionen vor?



  • Meinst so:

    OnClose()
    {
        LogOut();
        // sonstige Aufräumarbeiten usw...
        ......................
        // Ende des Programms
    }
    
    // oder:
    
    OnOK()
    {
        LogOut();
        // sonstige Aufräumarbeiten usw...
        ......................
        // Ende des Programms
    }
    

    War nicht meine Absicht jemanden falsch zu beraten,ein Grund warum ist auch der weil ich selber einige Programme gesehen habe die einige Funktionen ausführen so wie ich es gemeint habe, ich habe so verstanden, dass er
    das LogOut() aufrufen möchte wenn das Dialog schon geschlossen wurde!? 😕
    Da könnte es dann nur noch Probleme geben wenn er an dieser Stelle auf die Dialogelemente zugreifen möchte, ich denke da würde sich ::IsWindow() melden,
    weil es kein Dialog mehr gibt?!

    pixel



  • Habe hier jetzt auch ein Problem: OnClose wird ausgeführt, aber er beendet das Programm nicht, also dieses "if (nResponse == IDOK)" wird nicht als true erkannt, obwohl der Button IDOK heisst. Ging eigentlich auch bis eben, bis ich den Abbrechen Button gelöscht habe und eine ListBox und ein Static... eigentlich kann da doch nichts verändert sein hmmm...


Log in to reply