Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mehrere Panel gleichzeitig färben (https://www.delphipraxis.net/164421-mehrere-panel-gleichzeitig-faerben.html)

LittleTee 11. Nov 2011 16:39

Mehrere Panel gleichzeitig färben
 
Hallo ich hab ein kleines Problem.

In meinem Project sind sehr viele ( wirklich viele Panel ) vorhanden.
Die alle gleichzeitig zu "färben" ist mir zu aufwändig.

Ich hab es mit einer For-Schleife versucht aber komme an einem Punkt nicht weiter:

Delphi-Quellcode:
For i:=1 to 39 do
Panel&i.Color:=rgb(i*2,i+2,i); // Hier ist das Problem. Ich hab versucht den Integer mit einem "&" anzuhängen (Kenntnisse von TI-Basic) - Leider ohne Erfolg.
Ich hoffe ihr könnt mir helfen und versteht mein Problem.

DeddyH 11. Nov 2011 16:52

AW: Mehrere Panel gleichzeitig färben
 
Es gibt mehrere Möglichkeiten:
- Durch das Controls-Array iterieren und wenn das aktuelle Control ein Panel ist, färben
- Erstellen einer eigenen Liste/eines Array, in dem Du die Panels verwaltest, unabhängig vom Parent oder Owner
- FindComponent/FindControl anwenden (IMO schlechteste Alternative)

ASM 11. Nov 2011 17:07

AW: Mehrere Panel gleichzeitig färben
 
Zitat:

Zitat von DeddyH (Beitrag 1135752)
Es gibt mehrere Möglichkeiten:
- Durch das Controls-Array iterieren und wenn das aktuelle Control ein Panel ist, färben
....


Ja, aber wenn er es bereits vergeblich (weil grundlegend fälschlich) dadurch versucht hat, "ein Integer mit einem "&" anzuhängen (Kenntnisse von TI-Basic)", dann wird er diese Empfehlung vermutlich ohne konkrete Anleitung nicht in funktionierenden Delphi-Code umsetzen können.
Code:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i:= 0 to ComponentCount - 1 do
   if (Components[i] is TPanel) then (Components[i] as TPanel).color:=clBlue;
end;

DeddyH 11. Nov 2011 17:16

AW: Mehrere Panel gleichzeitig färben
 
Ich würde wahrscheinlich eher über Controls iterieren als über Components. Controls bezieht sich auf Parent-Beziehung, während Components die Owner-Beziehung auswertet. Aber in meinen Augen ist die eigene Verwaltung über ein Array/eine Liste sowieso die beste Lösung, da man dort gezielt Panels aufnehmen bzw. ausschließen kann.

[edit] Beispiel (ich erzeuge die Panels hier dynamisch, das muss man natürlich nicht, man kann sie auch einzeln den Array-Elementen zuweisen):
Delphi-Quellcode:
const
  PANELCOUNT  = 42;
  PANELSPERCOL = 3;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDblClick(Sender: TObject);
  private
    { Private-Deklarationen }
    FPanels: array [1 .. PANELCOUNT] of TPanel;
  public
    { Public-Deklarationen }
  end;

...

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  CntRows: integer;
begin
  CntRows := PANELCOUNT div PANELSPERCOL;
  for i := Low(FPanels) to High(FPanels) do
    begin
      FPanels[i] := TPanel.Create(self);
      FPanels[i].Parent := self;
      FPanels[i].ParentBackground := false;
      FPanels[i].Height := ClientHeight div CntRows;
      FPanels[i].Width := ClientWidth div PANELSPERCOL;
      FPanels[i].Left := ClientWidth div PANELSPERCOL * (i mod PANELSPERCOL);
      FPanels[i].Top := ClientHeight div CntRows * (i mod CntRows);
    end;
end;

procedure TForm1.FormDblClick(Sender: TObject);
var
  i: integer;
begin
  for i := Low(FPanels) to High(FPanels) do
    FPanels[i].Color := clRed;
end;
[/edit]

Uwe Raabe 11. Nov 2011 17:38

AW: Mehrere Panel gleichzeitig färben
 
Wäre es nicht einfacher die Color des Forms zu ändern? Standardmäßig sollte sich das auf die Panels fortpflanzen (Stichwort: ParentColor).

DeddyH 11. Nov 2011 18:03

AW: Mehrere Panel gleichzeitig färben
 
Kommt halt darauf an, was genau gewollt ist.

ASM 11. Nov 2011 18:21

AW: Mehrere Panel gleichzeitig färben
 
Zitat:

Zitat von DeddyH (Beitrag 1135757)
... in meinen Augen ist die eigene Verwaltung über ein Array/eine Liste sowieso die beste Lösung, da man dort gezielt Panels aufnehmen bzw. ausschließen kann.

Das ist zweifelsohne die flexibelste Lösung.

Zitat:

Kommt halt darauf an, was genau gewollt ist.
Genau. Wo der Vorteil liegt, hängt von der jeweiligen konkreten Situation ab. Da LittleTee geschrieben hat, nur "alle Panels gleichzeitig" (um)färben zu wollen, wäre speziell hierfür der Weg über "Components[i] is TPanel" sicherlich doch der einfachste und programmtechnisch schnellste, um ans geforderte Ziel zu kommen. Und da nach seinem Beispiel unterschiedliche Farben nicht gezielt, sondern einfach nur variabel auf die Panels verteilt sein sollen, ginge das dann - leicht erweitert - auch so:
Code:
const MaxColors = 8; // z.B. oder aber mehr oder weniger
Var fcolor: Array [1..maxcolors] of integer =(clBlue, clYellow, clRed, clMaroon, clGreen, clNavy, clLime, clFuchsia);

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i:= 0 to ComponentCount - 1 do
   if (Components[i] is TPanel) then (Components[i] as TPanel).color:=fColor[random(maxcolors)+1];
end;

LittleTee 11. Nov 2011 22:28

AW: Mehrere Panel gleichzeitig färben
 
Danke für die vielen Antworten!

Ich habe heute leider keine Zeit mehr eure Vorschläge auszuprobieren.
Dennoch bin ich davon überzeugt, dass eure Vorschläge mir sicher helfen werden.


Ich melde mich morgen nochmal :)

Mit freundlichen Grüßen
LittleTee


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz