FindComponent
jest bardzo wolny. Użyj i stwórz kontrolki comboBox
dynamicznie. Jeśli kodu masz mało użyj w wątkach. Nawet jeśli umieścisz na formie owe 24 comboBox na sztywno kod będzie wykonywał się szybciej, aniżeli przez FindComponent
w pętli.
FindComponent
nie jest bardzo wolny, o ile dany rodzic nie zarządza miliardami kontrolek. Tak, FindComponent
jest wolniejszy od przeszukiwania własnej listy referencji. Jest wolniejszy o jakąś mikrosekundę, w typowym przypadku.
A swoją drogą nie wiem w FreePacal stoi z RTTI czy jest wystarczająco szybkie, bo jeżeli tak to na pewno da się uzyskać kontrolkę znając jej nazwę.
RTTI nie jest potrzebne do pobrania referencji kontrolki na podstawie jej nazwy — każdy komponent w LCL (czyli klasy TComponent
) posiada pole FComponents
, pod postacią zwykłej listy obiektów, w której trzymane są referencje wszystkich osadzonych kontrolek. Znalezienie odpowiedniej to prosta iteracja po obiektach tej listy i porównanie ciągów nazw:
Function TComponent.FindComponent(const AName: string): TComponent;
Var I : longint;
C : TComponent;
begin
Result:=Nil;
If (AName='') or Not assigned(FComponents) then exit;
For i:=0 to FComponents.Count-1 do
Begin
c:=TComponent(FComponents[I]);
If (CompareText(C.Name,AName)=0) then
Exit(C);
End;
end;
Jest tych metod kilka — FindComponent
, FindSubComponent
, FindChildControl
— można sobie wybrać.