Alle Frames auf einer Form schließen



  • Hi,

    der folgende Code sollte doch alle Frames schließen,
    macht er aber nicht 😞 Wo steckt denn der Fehler ?

    for(int i=0; i < Form1->ComponentCount; i++)
        {
            if (Form1->Components[i]->ClassNameIs("TFrame"))
            {
               ShowMessage("Frame schließen");
              // frame auf visible false setzen ...
            }
        }
    


  • Siehe diesen Beitrag aus der FAQ 🙂



  • ja ich kenne denn thread und daher ja auch mein ansatz aber es geht nicht!
    ich versteh nicht warum 😞



  • "geht nicht" ist keine gültige Fehlerbeschreibung... Offensichtlich gibst du ja bisher erst eine Meldung aus. erscheint denn eine solche?

    Hast du die Frames ev. auf einem Panel oder so?

    -junix



  • erläutere "Geht nicht", bzw. Beschreib es etwas genauer.

    Edit: Heureka jetzt hab ich aber lang gebraucht für 8 wörter 🙂



  • also hier mein source:

    for(int i=0; i < Form1->ComponentCount; i++)
        {
            // Alle Labels verändern
            if (Form1->Components[i]->ClassNameIs("TFrame"))
            {
              dynamic_cast<TFrame*>(Form1->Components[i])->Visible = false;
            }
        }
    

    ich geh in mein formular und klick auf einen button das mir auf pannel2 eine frame anzeigt. wenn ich nun auf denn botton alle frames schließen klicke steht der obige source und sollte diese frame ja auch schließen. aber es passiert nichts ! die frame bleibt offen ohne fehlermeldung ohne das es sie stört und ich versteh nicht warum!



  • Wenn das Frame auf Panel2 sitzt, dann musst du wohl auch die Kompos die Panel2 besitzt durchsuchen und nicht Form1...

    -junix



  • warte mal,

    form1 -> darauf liegt panel2 -> darauf werden verschiedene frames mit parent gesetzt.

    wenn ich nun form1 durchsuche muss es doch auch diesese frames auf dem panel finden da sie auch ein teil der form sind.

    dennoch hier mal der abgeänderte source mit deiner idee:

    for(int i=0; i < Panel2->ComponentCount; i++)
    {
    // TFrames schließen
    if (Form1->Components[i]->ClassNameIs("TFrame"))
    {
    dynamic_cast<TFrame*>(Panel2->Components[i])->Visible = false;
    }
    }



  • Also, ich glaub ja eher

    for(int i=0; i < Panel2->ComponentCount; i++) 
    { 
      // TFrames schließen 
      if (Panel2->Components[i]->ClassNameIs("TFrame")) 
      { 
        dynamic_cast<TFrame*>(Panel2->Components[i])->Visible = false; 
      } 
    }
    

    (Codezeile 4!)



  • geht dennoch nicht.

    es geht zwar auch anders:

    Frame1->Visible = true;
    Frame2->Visible = false;
    Frame3->Visible = false;
    Frame4->Visible = false;
    ...
    Frame20->Visible = false;
    

    aber ich denk das ist ja nicht gerade die feine englische art 😞

    nuja möglich wäre dann ja auchnoch die frames erst zur laufzeit zu erzeugen indem ich dann sage:

    // Erzeuge Frame1 von Typ TFrame1 und reserviere dafür Speicher
      TFrame1 *Frame1 = new TFrame1(this);
      Frame1->Parent = Panel2;
      Frame2->Visible = true;
    

    blöd ist nun nur wenn jemand nochmals auf dem button klickt kommt eine Schutzverletzung das Frame1 bereits existiert. Aber eine if davor mit:

    if(!Frame1)
    { ... code }
    

    hat nichts bewirkt.



  • so, hab nun was getestet:

    void __fastcall TfrmMain::Button1Click(TObject *Sender)
    {
      for(int i=0; i < frmMain->ComponentCount; i++)
      {
        ShowMessage(frmMain->Components[i]->ClassName());
    
        if(frmMain->Components[i]->ClassNameIs("TFrame"))
        {
          dynamic_cast<TFrame*>(pnlMain->Components[i])->Visible = false;
        }
      }
    }
    

    komisch ist alle komponenten werde mir mit der zeile showmessage genannt, timage, tpanel usw. nur frames kommen darin nicht vor ? wieso und was kann ich dagegen machen ?

    danke



  • halt, sollte natürlch so heißen.
    pnlMain war nur ein Test:

    for(int i=0; i < frmMain->ComponentCount; i++)
      {
        ShowMessage(frmMain->Components[i]->ClassName());
    
        if(frmMain->Components[i]->ClassNameIs("TFrame"))
        {
          dynamic_cast<TFrame*>(frmMain->Components[i])->Visible = false;
        }
      }
    


  • Dein ShowMessage-Versuch hätte es dir eigentlich zeigen müssen: der ClassName deiner Frames ist nicht TFrame sondern TFrame2, TFrame3 etc., oder welche Namen auch immer du ihnen gegeben hast.

    Verzichte auf die ClassName-Abfrage, dynamic_caste einfach alle Komponenten nach TFrame (dabei eine temporäre TFrame-Instanz anlegen) und prüfe, ob das Resultat != Null ist. Wenn ja, dann war der Cast erfolgreich, du hast also ein Frame erwischt, das du dann bearbeiten kannst.


Anmelden zum Antworten