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 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!