Eigenschaft Color aller Panel-Komponente in einer Schleife ändern
-
Hallo,
TPanel hat ja auch keine Eigenschaft Color, aber dafür eine Eigenschaft namens Brush.
Mal als BeispielTPanel *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 KomponentenindexEs 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!