Jak odwołać się do komponetu znając jego tag?

0

Mam ponumerowane komponenty, w każdym komponencie w polu Tag wpisałem jakiś numer. Wszystkie komponenty są jednego typu np. TImage i chcę się do nich odwołać (użyć ich) po podaniu nr ich Tagu. Po nazwie to wiem, że można dać TImage(FindComponent('nazwa' + '1').Blabla ale nie chcę po nazwie, chcę po Tagu zwracać się, czyli w styli TImage(Tag = x).Picture.Blabla. Da radę jakoś?

0
function TForm1.FindByTag(Tag:Integer):TImage;
begin
  for I:=0 to ComponentCount-1 do
  begin
    if Components[I].Tag=Tag then
    begin
      Result:=TImage(Components[I]);
      Exit;
    end;
  end;
  Result:=nil;
end;

Jednak zastanów się aby w klasie umieścić:
MyImages:array[0..20]of TImage;
w konstruktorze wypełnić:

MyImages[0]:=Image1;
MyImages[1]:=Image2;
MyImages[2]:=Image3;
...
MyImages[20]:=Image21;

A potem już tylko używasz:
MyImages[Tag].Picture.Blabla

0

ciekawe sposoby, dzięki wielkie

0

Drugi sposób, jaki przedstawił Ci @_13th_Dragon będzie bardziej praktyczny i bezpieczniejszy; Jeśli jednak będziesz wolał zastosować pierwszy sposób, to musisz zwrócić uwagę na to, że wiele kontrolek z różnych klas na formularzu może mieć ten sam Tag, stąd albo ustal im niepowtarzalne wartości (np. rozpoczynające się od 1000), albo zabezpiecz funkcję wyszukującą sprawdzając klasę znalezionej kontrolki:

function TForm1.FindByTag(ATag: Integer): TImage;
begin
  for I := 0 to ComponentCount - 1 do
  begin
    if (Components[I].Tag = ATag) and (Components[I] is TImage) then
    begin
      Result := TImage(Components[I]);
      Exit;
    end;
  end;
  Result := nil;
end;

Klasę szukanej kontrolki także możesz podać jako argument metody i zamiast sprawdzać operatorem is - porównać łańcuchy Components[I].ClassName i szukanej klasy, jeśli funkcja ma być uniwersalna dla kontrolek z kilku klas.

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