Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Variableninhalt als Befehl ausführen...
Peti - Fr 11.10.02 11:29
Titel: Variableninhalt als Befehl ausführen...
Hallo zusammen!
Folgendes Problem (Beispiel):
ich habe in einem Formular mit 100 Panels. Nun will ich die Farbe dieser Panels ändern. Die Panels heissen Panel1 bis Panel100.
Normalerweise müsste ich ja jetzt 100 Anweisungen schreiben:
Quelltext
1: 2: 3: 4:
| Panel1.Color:=clBlack; Panel2.Color:=clBlack; ... Panel100.Color:=clBlack |
Ich würde dies aber gerne in einer Schleife erledigen. In anderen Sprachen kann man ja z.B. einen String zusammensetzen und diesen dann als Befehl ausführen, z.B.
Quelltext
1: 2: 3: 4: 5:
| For i:=1 to 100 do Begin befehl:='Panel'+IntToStr(i)+'.Color:=clBlack'; ausfuehren(befehl); End; |
Gibt es eine Möglichkeit in Delphi, Variableninhalte als Befehl auszuführen?
Oder kann man irgendwie anders auf die verschiedenen Panels zugreifen?
Ich wäre sehr dankbar, wenn jemand einen Tip hätte.
Grüße,
Peti
Klabautermann - Fr 11.10.02 11:37
Hallo,
mit einer ganzen BefehlsZeile ist das nicht möglich, aber mit FindComponent kannst du wenigstens auf das Panel entsprechnt zudrefen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure CangePanelColor(PanelNr : Integer; Farbe : tColor); VAR Compo : tComponent; BEGIN Compo := FindComponent('Panel' + IntToStr(PanelNr)); IF (Compo IS tPanel) THEN tPanel(Compo).Color := Farbe; END; |
Gruß
Klabautermann
Peti - Fr 11.10.02 11:46
Hallo Klabautermann!
Das ist genau das, was ich gesucht habe...
Vielen Dank für die schnelle und präzise Antwort!!!!!!!!
Grüße,
Peti
Peti - Fr 11.10.02 12:25
Titel: Noch ein Problem...
Hallo nochmal! :-)
Jetzt habe ich eine weitere Frage: Du scheinst Dich damit ja gut auszukennen....
Offensichtlich kann man ja mit FindComponent die verfügbaren Komponenten finden.
Jetzt würde ich gerne noch wissen, welche untergordneten Komponeten mein gefundenes Panel hat:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| With Form1 do Begin Compo := FindComponent('Panel' + IntToStr(Lauf)); IF (Compo IS tPanel) THEN Begin anzahl:=Compo.ComponentCount; ..... End; End; |
Leider funktioniert das nicht, anzahl ist immer Null, obwohl das Panel einige Buttons enthält.
Was ist falsch????
Danke schonmal für die Mühe,
Gruß,
Peti
Klabautermann - Fr 11.10.02 14:05
Hallo,
ein interessantes Problen, das mir noch gar nicht bewust war hast du da entdeckt.
Also scheinbar wird jede Komponente die du zur Designzeit anlegst dem Formular zugeordnet. Der Owner aller Komponenten ist also Form Main. Der von dir vorgestellte Code Funtioniert also nur, wenn du die Untergeodneten Komponenten Dynamisch erzeugst.
Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.FormCreate(Sender: TObject); VAR But : tButton; begin But := tButton.Create(Panel1); But.Parent := Panel1; But.Caption := 'Test'; |
Gruß
Klabautermann
LCS - Fr 11.10.02 14:10
@Klabautermann
Das hat mich vorhin auch ins Grübeln gebracht :?!?: Der Parent der Buttons ist allerdings das Panel.
Gruss Lothar
Udontknow - Fr 11.10.02 14:12
Hallo,
wie Klabautermann bereits erwähnte, ist die Eigenschaft Components die falsche. Du musst stattdessen die Eigenschaft Panel.Controls benutzen, diese gibt sämtliche Objekte zurück, die direkt dem Panel untergeordnet sind (aber nur direkt! Sämtliche "tiefer" liegenden Objekte müsstest du dann per Rekursion ermitteln).
Cu, :)
Udontknow
Klabautermann - Fr 11.10.02 14:14
Hallo,
LCS hat folgendes geschrieben: |
Der Parent der Buttons ist allerdings das Panel. |
das ist korrekt, aber nicht der Owner. Und dieser lässt sich im nachhinein nicht ändern.
Gruß
Klabautermann
Peti - Fr 11.10.02 14:57
Vielen Danke für die rege Beiteiligung!
Ich habe die Sache aber inzwischen tatsächlich mit dem Owner gelöst:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Compo := FindComponent('Panel' + IntToStr(Lauf)); IF (Compo IS tPanel) THEN Begin For Lauf2:=1 to MaxButtons do Begin Compo2 := FindComponent('Button' + IntToStr(Lauf2)); IF (Compo2 IS tButton) and TButton(Compo2).Parent = TPanel(Compo) then Begin ...... End; End; End; |
(Klar, ist noch optimierungsfähig :-), aber grundsätzlich geht's so...)
Danke nochmals,
Peti
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!