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ś?
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
ciekawe sposoby, dzięki wielkie
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.