Announcement

Collapse
No announcement yet.

MDI-Anwendung - nur ein Fenster..

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MDI-Anwendung - nur ein Fenster..

    Hallo,
    ich bin gerade an einer MDI-Anwendung welche verschieden Forms als Child verwendet.

    Einige dieser Childwindows dürfen allerdings nicht mehr als einmal aufgerufen werden. Also wenn schon ein Fenster dieses Typs offen ist, soll kein zweites mehr erstellt werden dürfen. Kann man das explizit festlegen? Also gibts dafür einen Style?

    Oder wie kann ich im Haupfenster abfragen ob ein Form existiert?

    Ich wollte etwas in dieser Richtung machen:
    Code:
    if(!MaterialWnd)
    {
    	MaterialWnd = gcnew mdiTest2::Material;
    	MaterialWnd->MdiParent = this;
    }
    MaterialWnd->Show();
    MaterialWnd ist dabei ein Objektzeiger der MDIParent-Klasse:
    private: mdiTest2::Material^ MaterialWnd;

    Beim ersten mal aufrufen funktioniert das auch.
    Wenn das Fenster MaterialWnd dann allerdings geschlossen wird
    kann ich es nicht wieder öffnen.

    Wie kann ich denn den Zeiger wieder auf NULL setzen?

  • #2
    Nachdem ich mich weitere Stunden damit beschäftigt hab, bin ich selbst auf ne Lösung gekommen...

    Ich bin dazu übergegangen meinen Fenstern Namen zu geben. Damit ist nicht das Text, sondern das Name-Attribut gemeint. Dann laufe ich in der Funktion, welche das Fenster öffnet, durch die Liste der geöffneten Fenster. Wenn ich eins mit dem betreffenden Namen finde, weiß ich das schon eins geöffnet wurde. Ich bring das dann ganz einfach nur noch in den Vordergrund, statt ein neues zu öffnen... Klingt erstmal kompliziert, ist aber ganz einfach:

    Hier der Quellcode
    (Wird im MdiParent Frame bei dem Versuch ein neues Child zu erstellen aufgerufen)...

    Code:
    int x = 0;
    mdiTest2::Material^ MaterialWnd;
    			 
    for(x = 0; x < this->MdiChildren->Length; x++)
    {
    	 //gefunden?
    	 if(String::Compare(this->MdiChildren[x]->Name, "Material") == 0)
    	{
    		this->MdiChildren[x]->Activate();	//jap -> aktivieren
    		return;						//und Funktion verlassen
    	}
    }
    
    //wenn wir hier landen gibts das Fenster noch nicht,
    //also können wirs erstellen
    MaterialWnd = gcnew mdiTest2::Material;
    MaterialWnd->MdiParent = this;
    MaterialWnd->Name = "Material";
    MaterialWnd->Show();
    Ich hoffe es hilft falls mal jemand ein ähnliches Problem hat..
    Zuletzt editiert von Lemontee; 20.01.2009, 14:23.

    Comment


    • #3
      Such mal nach dem Entwurfsmuster/Design Pattern Proxy. Damit kann man genau diesen Fall abhandeln.
      Schon länger kein C++ mehr gemacht, allerdings sollte es sowas auch für C++ geben.

      Comment

      Working...
      X