[Delphi] Zmiana koloru obiektu Panel w pętli

0

Witam,

Umieściłem na formie 35 obiektów TPanel
chcę dla każdego ustawić taki sam kolor więc napisałem:

	Panel1.Color := clWhite;
	Panel2.Color := clWhite;
	Panel3.Color := clWhite;
	//...
	Panel35.Color := clWhite; 
	

W jaki sposób mógłbym to zmieniać w pętli?

Pozdrawiam

0
var
  i: Integer;
begin
  for i:= 0 to Form1.ControlCount - 1 do
  begin
    if Form1.Controls[i] is TPanel then
      TPanel(Form1.Controls[i]).Color:= clWhite;
  end;
end;
0

Dziękuję za błyskawiczną odpowiedź :)

0
kAzek napisał(a)
var
  i: Integer;
begin
  for i:= 0 to Form1.ControlCount - 1 do
  begin
    if Form1.Controls[i] is TPanel then
      TPanel(Form1.Controls[i]).Color:= clWhite;
  end;
end;

Ale po co szukać po wszystkich komponentach ?
Wystarczy odwołać się tylko do Paneli poprzez FindComponent i w pętli przejść od 1..35.

0

Żartujesz?

function TComponent.FindComponent(const AName: string): TComponent;
var
  I: Integer;
begin
  if (AName <> '') and (FComponents <> nil) then
    for I := 0 to FComponents.Count - 1 do
    begin
      Result := FComponents[I];
      if SameText(Result.FName, AName) then Exit;
    end;
  Result := nil;
end;

Zobacz co w rzeczywistości robi FindComponent a ja tylko po kontrolkach szukałem a nie po wszystkich komponentach.

0

A tak czemu nie może być ?

var
 i: Byte;
begin
 for i := 1 to 35 do TPanel(FindComponent('Panel' + IntToStr(i))).Color := clWhite;
end;
0
Opi napisał(a)

A tak czemu nie może być ?

var
 i: Byte;
begin
 for i := 1 to 35 do TPanel(FindComponent('Panel' + IntToStr(i))).Color := clWhite;
end;

No przecież Ci tłumaczę, że każde wywołanie FindComponent jedzie po wszystkich komponentach aż znajdzie właściwy i Ty to chcesz wywołać 35 razy (pętla), podczas gdy ja szukam tylko raz i to tylko po kontrolkach.

W skrócie (nie chce mi się przepisywać dokładnie jak to jest) twój kod po skompilowaniu rośnie do czegoś w stylu:

var
  i, j Integer;
  comp: TComponent;
begin
  for i:=1 to 35 do
  begin
    for j:=0 to Form1.Form1.ComponentCount - 1 do
    begin
      comp:= Form1.Components[j];
      if comp.Name = 'Panel' + IntToStr(i) then
      begin
        TPanel(comp).Color:= clWhite;
        break;
      end;
    end;
  end;
end;

Jak widać to co z pozoru jest wygodniejsze nie zawsze jest najbardziej optymalne.

0

Najlepiej jest mieć utworzoną w OnCreate tablicę wszystkich potrzebnych kontrolek (array[1..35] of TPanel) a nie za każdym razem szukać tych kontrolek na nowo.

0

W sumie fakt, przy bardzo dużej ilości pętla może trwać dłużej. Jednak jak nie chcemy stosowąć dynamiczniej tablicy to można
użyć obiektu typu TList, ktory przechowuje wskaźniki na obiekty, wtedy łatwiej jest taki obiekt dodac, usunać oraz posortować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1