Alle Dialogs manuell schließen bevor das Programm beendet wird...



  • Sagen wir mal, du benutzt gerade ein Browser (tust du auch ;))... Oben ist doch ein menü...Wenn du jetzt z.B. auf Einstellungen (oder wie auch immer das bei dir heißt)
    gehst, öffnet sich ein Dialog... jetzt möchte ich die änderungen die in so ein dialog vorgenommen worden sind abfangen, auch wenn du dein browser schließt ohne vorher das Dialog zu schließen... Dieses Dialog ist nicht modal... mit der WM_CLOSE kann ich die änderungen abfangen, aber nur wenn du das Dialog schließt bevor du das Programm beendest, manuell... Wenn du das Programm schließt ohne vorher das Dialog manuell zu schließen, überspringt das Programm mein WM_CLOSE...



  • Pellaeon schrieb:

    Kannst dir in deinem Hauptfenster nicht einfach ne Struktur aufbauen, wo du dir alle Dialoge merkst, die geöffnet wurden, was weis ich die Zeiger in nem CObArray speichern ...

    Genau so was wollte ich mir sparen wenn es geht... Ich dachte es gibt ein Befehl womit ich überprüfen kann ob noch dialogs offen sind... Mit GetActiveWindow( ) habe ich schon versucht, klappt aber nicht...



  • Wenn die alle an der Titelzeile erkennbar sind und dein Programm nie doppelt offen sein wird, könntest du mit FindWindow arbeiten.
    Zeiger merken ist aber definitiv besser.



  • Gute Nachricht, mein Programm darf nur einmal laufen...
    Schlechte Nachricht, die Dialogs können mehrmals offen sein...
    Bleibt mir also nichts anders übrig als mir die zeiger zu merken???



  • Ich weis nicht, ob es andere Möglichkeiten gibt, vorstellen könnte ich es mir.
    Aber das mit dem Zeiger merken wäre ne einfach Sache, wie gesagt nimm CObArray, da müsst dich um nichts weiter kümmern. Du brauchst nur " Methoden, wo sich die Dialoge beim Hauptfenster an- und auch wieder abmelden können und das ist ja nun nicht viel Arbeit

    //edit
    Mir fällt da noch was anderes ein: Werden die Dialoge beim Schließen ordnungsgemäß zerstört, also wenn du das Hauptfenster schließt, ohne das die Dialoge geschloss wurden?
    Falls ja kannst deine Auswertung ja in den Destruktor machen, falls das nicht passiert mach mal schnell den Memleak weg^^ 😉



  • Pellaeon schrieb:

    Du brauchst nur " Methoden, wo sich die Dialoge beim Hauptfenster an- und auch wieder abmelden können und das ist ja nun nicht viel Arbeit

    Kannst du mir kurz erklären wie das funktionieren wurde? Kann mir das irgendwie nicht vorstellen...
    Danke im Voraus...



  • also in deinem Hauptfenster hast du ein Objekt von CObArray ("CObArray m_diagArray" z.B.)

    void CHauptfenster::addActiveDialaog(CDialog* pDiag)
    {
         m_diagArray.Add(pDiag);  //kann Exception werfen, also evtl abfangen :-)
    } 
    
    //
    void CHauptfenster::removeActiveDialog(CDialog* pDiag)
    {
        for(int i = 0;i < m_diagArray.GetSize();i++)
        {
             if (pDiag == (CDialog*) m_diagArray[i])
             {
                 m_diagArray.RemoveAt(i); //hier wird nur der Zeiger aus dem Array
                                          //entfernt, der Dialog wird nicht gelöscht
                 break;
             } 
        }
    }
    

    Beim Remove wird wie gesagt nur der Zeiger aus dem Array entfernt, den Dialog wieder freigeben muss außerhalb extra noch gemacht werden.

    Du musst dir allerdings noch überlegen, wie du, wenn du einen Dialog schließt, Zugriff auf die Methode bekommst, also z.B. nen Zeiger der Hauptanwendung im Dialog speichern, damitz dieser sich auch abmelden kann.

    Und wenn das Hauptfenster geschlossen wurde ohne das alle Dialoge zu sind, stehen alle Dialoge als Zeiger in dem Array und sind abrufbar



  • Danke für die Mühe, werde es ausprobieren und melde mich wieder...



  • kann ich bei WM_CLOSE vom Hauptfenster nicht mehr auf m_diagArray zugreifen??? Ist irgendwie immer leer... m_diagArray ist public deklariert...



  • klingt nicht wirklich normal, wirst wohl mal mit dem Debugger an dein Programm rangehen müssen.


Anmelden zum Antworten