Beim OnClick auf Button überprüfen ob ein MDI-Child schon geöffnet ist



  • Wie kann ich beim Button-Klick überprüfen, ob ein Child schon geöffnet ist und nur, wenn es nicht geöffnet ist soll es aufgerufen werden?



  • Hallo,

    so müsste das schematisch aussehen:

    ButtonClick()
    {
        if(!Child existiert)
        {
            erstelle Child;
        }
    }
    

    [Edit]
    bzw.:

    ButtonClick()
    {
        if(!Child wird angezeigt)
        {
            zeige Child;
        }
    }
    

    [/Edit]
    Oder wolltest du doch etwas anderes fragen?

    MfG



  • Ja genau das meine ich, aber nicht den Pseudocode sondern den richtigen.
    Ich habe es bereits so probiert:

    if (!Form_Test)
    {
        Form_Test = new TForm_Test(Application);
    }
    

    Das funktioniert aber nicht richtig. Öffne ich so das Formular und klicke dann noch einmal auf den Button, wird es nicht erneut angezeigt...so, wie es sein soll. Schließe ich das Formular wieder und möchte es dann erneut öffnen, dann passiert nichts. Ich muss sicherlich das Form_Test wieder zerstören...



  • Was willst du denn nun? Das Formular (ANZEIGEN und AUSBLENDEN) oder (ERSTELLEN und ZERSTÖREN inklusive Anzeigen)? Das sind doch zwie verschiedene paar Schuhe...



  • Ich möchte es erstellen und zerstören



  • Dann zum Beispiel so:

    void __fastcall TFormMain::Button1Click(TObject *Sender)
    {
        TForm1 *pInstanzA= new TForm1(0);     // instanziieren
        pInstanzA->ShowModal();               // anzeigen
        delete pInstanzA;                     // Instanz löschen
        // ...
    }
    

    Edit: Da die Instanz gleich nach dem Schliessen des Formulars automatisch gelöscht wird, brauchst du bei Button1Click keine Abfrage ob bereits eine Instanz existiert.

    Allerdings kannst du mit diesem Code erst wieder auf das Formular mit Button1 zugreifen, nachdem die Instanz geschlossen wurde (ShowModal)!



  • bool bFormFound=false;
    
    for (int i = MDIChildCount - 1; i >= 0; i--) {
    	if ((AnsiString)MDIChildren[i]->ClassName() == "TForm_Test") {
    		MDIChildren[i]->Show();
    		bFormFound=true; //set found bool to true
    	}
    }
    
    if (!bFormFound) { //if no form exists
    	TForm_Test *Form_Test = new TForm_Test(Application);
    	if (Form_Test) {
    		Form_Test->Show();
    	}
    }
    


  • Ansonsten vielleicht so:

    void __fastcall TFormMain::Button1Click(TObject *Sender)
    {
        if(!pInstanzA)
        {
            TForm1 *pInstanzA= new TForm1(0);     // instanziieren
            pInstanzA->Show();                    // anzeigen
        }
    //  delete pInstanzA;                         // Instanz löschen muss dann an anderer Stelle aufgerufen werden
        // ...
    }
    


  • Hmm, das Problem bei einer MDI ist, dass das Form schon beim Instanziieren angezeigt wird. Also fällt das

    ...->ShowModal();
    

    weg. Wenn ich dann aber anschließend das delete mache, dann ist das Formular auch gleich wieder weg.



  • Ähhmm... MDI...? Kann es sein, dass du im falschen Forum gepostet hast?



  • Würde ich jetzt eigentlich nicht sagen, warum?



  • Du in der Titelüberschrift steht

    Beim OnClick auf Button überprüfen ob ein MDI-Child schon geöffnet ist

    scheibar bist du hier falsch?



  • @Kolumbus
    du hast etwas vergessen, er meinte MDI-Child-Fenster und davon können mit deiner Methode x-beliebige erstellt werden. Ausserdem funktioniert ShowModal dabei nicht.
    diese kleine Funktion sollte helfen:

    bool CheckForm(String name)
    {
    for (int i=0; i<Screen->FormCount; i++)
    	{
    	if (UpperCase(Screen->Forms[i]->Name) == UpperCase(name))
    		{
    		Screen->Forms[i]->WindowState = wsMaximized;
    		Screen->Forms[i]->BringToFront();
    		return true;
    		}
    	}
    return false;
    }
    
    //Verwendung
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if (!CheckForm("ChildForm1"))
      {
      TChildForm1 * ChildForm1= new TChildForm1(Application);
      }
    }
    

    [Edit] etwas langsam heute 🙄



  • @Linnea

    Wiso machst du den Umweg über Screen->Forms und nimmst nicht gleich die
    MDI Childs?

    for (int i = MDIChildCount - 1; i >= 0; i--) { 
        if ((AnsiString)MDIChildren[i]->ClassName() == "TForm_Test") { 
            MDIChildren[i]->Show(); 
        } 
    }
    


  • ok, geht natürlich auch 😉



  • Man hab ich gerade lange auf'm Schlauch gestanden... 🙄



  • 😃
    Ich wunder mich schon, bin noch am probieren. aber ich denke so wird es klappen. Gebe gleich nochmal Info.



  • Funktioniert einwandfrei!

    Vielen Dank!


Anmelden zum Antworten