Autor Beitrag
Peti
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Fr 11.10.02 11:29 
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:
ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: 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:

ausblenden 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