Eigenschaft Color aller Panel-Komponente in einer Schleife ändern



  • In einem Programm möchte ich die Color-Eigenschaft von ca 50 Panels in einer Schleife ändern. Ich weiss nicht, ob das möglich ist. Probiert habe ich folgendes:

    for(int i=0;i<NMAX;i++)
    {
    if(meinTheater.getSitzbelegung(i))
    {
    FindComponent ("pnl"+IntToStr(i))->Color=clRed;
    }
    else
    TPanel(FindComponent ("pnl"+IntToStr(i))).Color=clLime;
    };

    Wenn also ein Sitzplatz belegt ist, soll sich die Farbe des Panels ändern.
    Hat Jemand eine Idee oder weiss genau, dass das nicht möglich ist? Danke schon mal für die Auskunft.

    Gruß Massoth



  • abend der herr.

    vielleicht hilft dir das weiter:

    for(int i=0; i < frmName->ComponentCount; i++)
        {
          // ComboBox
          if (frmName->Components[i]->ClassNameIs("TPanel"))
          {
              dynamic_cast<TPanel*>(frmName->Components[i])->Color=clRed;
           ....
    

    gruß
    binary



  • Danke binary für die kompetente Antwort. Leider hat sie nicht funktioniert. Meine ca. 50 Panel-Komponenten haben die Namen: pnl1, pnl2, pnl3,... und diesen letzten Index will ich mit einer Schleife durchzählen und nicht alle Komponenten im Formular.
    Jede Panelkomponente markiert einen Sitzplatz in einem Theater. Mit einer Methode anzeigen will ich nach einer Sitzplatzbuchung die belegten Sitzplätze markieren.
    Notfalls muss ich dann alle ca. 50 Panels einzeln abfragen, was mir aber nicht so professionell erscheint. Vielleicht haben Sie noch eine andere Idee.
    Gruß Massoth



  • Also ich wüsste nicht, das das hier

    for(int i = 0; i<this->ComponentCount; i++)
       {
          if(this->Components[i]->ClassNameIs("TPanel"))
          {
             dynamic_cast<TPanel*>(this->Components[i])->Color = clRed;
          }
       }
    

    Probleme macht. Nutze selber diese art, um 5 Panels aud DoubleBuffered = true; zu setzten.

    und das deine Panels alle so heißen pnl1 (etc) ist irrelevant. Hier wird nicht nach dem Namen der Instanz sondern nach dem Namen das Klasse gefragt (siehe ClassNameIs()). Im dynamic_cast<TPanel*> wird dann jede Komponente von der Form, die darauf passt in ein TPanel gecastet.

    Also sollte das eigentlich klappen. Zeig mal wie du das implementiert hast und drück dich mal etwas genauer aus, als: "das klappt nicht"



  • klappt nicht heisst, dass folgende Fehlermeldung angezeigt wird:

    [C++ Fehler] GUITheater.cpp(53): E2316 'Color' ist kein Element von 'TComponent'.

    Der Cursor bleibt nach nach dem r (von Color) stehen.

    Die Implementierung ist nun:

    void TfrmTheater::statusAnzeigen()
    {
    for(int i=0;i<this->ComponentCount;i++)
    {
    if(this->Components[i]->ClassNameIs("TPanel"))
    dynamic_cast<TPanel*>(this->Components[i+1]->Color=clRed;
    else
    dynamic_cast<TPanel*>(this->Components[i+1]->Color=clLime;
    };
    }

    bzw. die Headerdatei ist

    class TfrmTheater : public TForm
    {
    __published: // Von der IDE verwaltete Komponenten
    TPanel *pnl1;
    TPanel *pnl2;
    :
    private: // Anwenderdeklarationen
    Theater meinTheater;
    void statusAnzeigen();
    :

    Sonst habe ich alles ganz genau geprüft.
    Für Deine Antwort danke ich Dir ganz herzlich.

    Gruß Massoth



  • Hallo,

    TPanel hat ja auch keine Eigenschaft Color, aber dafür eine Eigenschaft namens Brush.
    Mal als Beispiel

    TPanel *panel;
    for(int i = 0; i<ComponentCount; i++) 
       { 
          panel = dynamic_cast<TPanel*>(Components[i]);
          if(panel != NULL) 
          { 
             panel->Brush->Color = clRed; 
          } 
       }
    

    Ciao



  • Braunstein schrieb:

    TPanel hat ja auch keine Eigenschaft Color

    Klar hat sie das.

    Gruß
    BCBuilder Anfänger



  • Massoth schrieb:

    dynamic_cast<TPanel*>(this->Components[i+1]->Color=clRed;
    else
    dynamic_cast<TPanel*>(this->Components[i+1]->Color=clLime;

    Da fehlt eine Klammer:

    ...(this->Components[i+1])<-----
    

    Gruß
    BCBuilder Anfänger



  • Gut, du hast recht, Color ist wirklich da. Ich hab wohl nicht tief genug in die Hierarchie geschaut. Die Eigenschaft Color stammt noch von TControl.



  • Also es funktioniert nun. Meine Programmzeilen lauten:

    for(int i=0,j=0;i<this->ComponentCount-9;i++)
    {
    if(meinTheater.getSitzbelegung(j))
    if(this->Components[i]->ClassNameIs("TPanel"))
    {
    dynamic_cast<TPanel*>(frmTheater->Components[i])->Color=clRed;
    j++;
    }
    else
    if(this->Components[i]->ClassNameIs("TPanel"))
    {
    dynamic_cast<TPanel*>(frmTheater->Components[i])->Color=clLime;
    j++;
    }
    };

    ComponentCount-9 wegen weiterer Panels
    Schleifenvariable j für den Feldindex
    Schleifenvariable i für den Komponentenindex

    Es ist aber ein neues Problem aufgetreten. Bei der Erstellung der Sitzreihen des Theaters habe ich Löschungen und Verschiebungen einzelner Panels vorgenommen (mein erstes richtig tolles Programm). Jedenfalls entspricht die Componentenreihenfolge nicht der Sitznummer bzw. der Nummer im Panelnamen. Das führt dazu, dass wenn ich pnl10 z.B. anspreche, ein ganz anderes Panel seine Farbe ändert.
    Daher müsste ich die Reihenfolge der Komponenten änderen können. Gefunden habe ich die Tabulatorreihenfolge. Deren Sortierung hatte aber keinen Effekt.
    Als Lösung weiss ich nur, dass ich das komplette GUI-Design (Bildhintergrund und 48 Sitze (Panels) ganz neu erstellen muss. Dabei darf ich wohl kein Copy und Paste benutzen, um sicher zu gehen, dass die Panels mit der Nummerierung konform gehen.
    Geht es auch hier einfacher? Für einen Hinweis bin ich sehr dankbar und hätte dadurch sicher eine Stunde arbeit gespart und was dazugelernt.

    Gruß Massoth



  • Hi.

    binary trust schrieb:

    if (frmName->Components[i]->ClassNameIs("TPanel"))
          {
              dynamic_cast<TPanel*>(frmName->Components[i])->Color=clRed;
           ....
    

    Ich wollte noch ergänzen, daß man nicht ClassNameIs und dynamic_cast verwenden muß.
    Wenn man schon durch ClassNameIs den Typ weiß, kann man auch einfach casten ...

    ((TPanel*)frmName->Components[i])->Color=clRed;
    

    ... oder man verwendet nur dynamic_cast:

    TPanel* panel = dynamic_cast<TPanel*>(frmName->Components[i]);
    if (panel != NULL)
    {
        panel->Color = clRed;
    }
    

    @Massoth: Das Verfahren ist ansonsten elegant. Etwas einfacheres wirst Du kaum finden. Aber daß es für Deinen Zweck das richtige ist, wage ich zu bezweifeln, da ja wohl nicht alle Plätze in dem Theater immer entweder besetzt oder frei sind.



  • Vielleicht würde sich für das Problem ein Array von Panels besser eignen, so kannst du die Panels der reihe nach ansprechen ohne dabei ein falsche zu erwischen 😉

    Am besten legst du dir die Panels dann dynmisch an, geht wie in folgeden FAQ-Beitrag beschrieben

    http://www.c-plusplus.net/forum/viewtopic.php?t=39206

    Erstelle die Panels dann im Konstruktor und weise denen dann die entsprechenden Positionen und Höhe, Breite etc zu 🙂



  • hallo,

    @Massoth: nur soviel, zu deinem idendifikationsproblem, jede kompo hat die allzweckeigenschaft Tag, die man für solche dinge nutzen kann. du gibst
    jedem panel einen tag von 0-49, so kannst du immer anhand des tags prüfen mit welchem panel du hantierst...

    mfg
    murph



  • Achso, das wusst ich gar nicht, aber dank murphy bin ich jetzt wieder was schlauer 🙂



  • murphy schrieb:

    die allzweckeigenschaft Tag, die man für solche dinge nutzen kann

    Professioneller wäre es sicher, die Komponenten gleich als Array zu erzeugen und über den entsprechenden Index darauf zuzugreifen.

    Massoth:
    Ich habe keine Lust, alle deine Beiträge nachzueditieren, deshalb ein allgemeiner Hinweis -> Bitte die Code-Tags benutzen.
    Danke!


Anmelden zum Antworten