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