none
Problem: MDI Anwendung mit List<> und mehreren Forms RRS feed

  • Frage

  • Hi Leute,

    ich hab mal wieder ein problematisches Anliegen. Ich habe eine MDI Anwendung geschrieben, die ihre ChildWindows mithilfe einer Liste erzeugt. Das erzeugen eines solchen Childwindows geschieht so:

    List<NewForm^> ^newForm = gcnew List<NewForm^>(); //Liste erzeugen 
    ....
    newForm->Add(gcnew NewForm(data)); //ein Listenelement hinzufügen 
    newForm[newForm->Count-1]->MdiParent = this; 
    newForm[newForm->Count-1]->Show();
    
    Bis hierher funktioniert es auch super. Ein Problem bekomme ich allerdings, wenn der User während er mit dem Programm arbeitet ein Child-Fenster schließt (Click aufs X). Das Fenster wird dann durch den Destructor "zerstört", aber in der Liste bleibt es erhalten. Da ich im weiteren Verlauf mit der Liste weiter arbeite, kommt es dann zu Fehlern, wenn ein Element mitten drin geschlossen wurde. Wie kann ich der Liste verklickern dass ein Fenster geschlossen wurde?

    Mittwoch, 8. Juni 2011 13:10

Antworten

  • Warum willst Du das überhaupt. Du benötigst diese Liste doch gar nicht, denn Du kannst ja auch alle Kindfenster des MDI-Windows ablaufen.
    Das System führt doch selbst für Dich diese Liste ;)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 8. Juni 2011 14:48
    Moderator

Alle Antworten

  • Warum willst Du das überhaupt. Du benötigst diese Liste doch gar nicht, denn Du kannst ja auch alle Kindfenster des MDI-Windows ablaufen.
    Das System führt doch selbst für Dich diese Liste ;)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 8. Juni 2011 14:48
    Moderator
  • Mhn.. prinzipiell wär es mir schon lieber, wenn es ohne Liste gänge. Ich dachte ich muss das so machen, da ich ja mit dem selben Code immer wieder ein neues/zusätzliches Fenster erzeugen möchte. Ich habe es auch schonmal so probiert:

    NewForm ^newForm = gcnew NewForm(daten);
    newForm->MdiParent = this;
    newForm->Show();
    newForm->WindowState = System::Windows::Forms::FormWindowState::Maximized;
    
    Das war halt mein erster Versuch. Das Problem dabei war, dass mir damit immer nur ein Fenster erzeugt wurde, welches anscheinend das vorhergehende (falls schon eins offen war) überschrieb. Also egal wie oft ich ein Childwindow per Click erzeugte, es war immer nur eins offen, und zwar immer das zuletzt erzeugte. Ich dachte mir es sei deswegen, weil die Fenster sich irgendwie überschreiben (schließlich heißen sie auch alle gleich, wenn sie kein Listen-/Arrayelement sind). Oder hab ich da was falsch gemacht?

    Donnerstag, 9. Juni 2011 06:30
  • Was meinst Du mit überschreiben?

    Du maximierst die Fenster. Die liegen also alle übereienander...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 9. Juni 2011 07:01
    Moderator
  • Das schon, ich habe die Fenster auch minimiert und geguckt ob andere dahinter liegen ;) aber da war immer nur eins da. Aber irgendwo habe ich anscheinend wirklich nen Fehler gemacht. Habe gerade ein neues Testprojekt angelegt, wo ich mir nur schnell ein MDI-Parent Window mit nem Button erzeugt habe, und per Button Click mit eben geposteten Code (ohne Liste) neue Windows erzeuge... und da funktioniert es wunderbar... *grübel*

    Ich werde mein eigentliches Projekt noch einmal umschreiben und es ohne Liste probieren. Und die entsprechenden Fenster dann per "this->MdiChildren" ansprechen. Ich meld mich dann nochmal :)

    Donnerstag, 9. Juni 2011 07:14
  • Tja... jetzt klappt es auf einmal... Was soll ich sagen... Danke Martin :)
    Donnerstag, 9. Juni 2011 07:25