TObjectList находит элемент

Я создаю TObjectList, в котором будут храниться объекты класса tButton:

...    
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
  public
    function FindButton (const aButtonName: string; var aButton: tButton) : Boolean;
  end;
...    

var ButtonObjectList : TObjectList<TButton>;

function TForm1.FindButton (const aButtonName: string; var aButton: tButton) : Boolean;
...
var b : Integer;
begin
Result := False;
for b := Low (ButtonObjectList.Count) to High (ButtonObjectList.Count) do

    if ButtonObjectList.Items [b].Name = aButtonName then begin
       Result  := True;
       aButton := ButtonObjectList.Items [b];
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ButtonObjectList := TObjectList<TButton>.Create(True);
ButtonObjectList.Add(Button1);
ButtonObjectList.Add(Button2);
ButtonObjectList.Add(Button3);
end;

далее в модуле untRetrieveButton:

...
var Button : TButton;
procedure FindAButton;
begin
if Form1.FindButton ('Button 1', Button) then
   ShowMessage ('Button found')
else
   ShowMessage ('Button not found')
end;

Я хочу вернуть произвольную кнопку, хранящуюся в ButtonObjectList, но на данный момент я знаю только имя кнопки. Из того, что я узнал из документации TObjectList, единственный способ добиться этого — пройтись по всему списку Items и сравнить параметр aButtonName с именем кнопки в TObjectList, как в

function TForm1.FindButton (const aButtonName: string; var aButton: tButton) : Boolean;

Это правильно, или есть лучший и наиболее эффективный способ получить произвольную кнопку по ее имени?


person ppro    schedule 08.05.2017    source источник


Ответы (1)


Я думаю, если у вас есть только ограниченное количество кнопок, это не имеет значения, и скорость должна быть в порядке.

Если у меня есть такие случаи, я часто использую такое решение:

var
  ButtonDict: TDictionary<String,TButton>;
  FoundButton: TButton;
begin

  ...

  ButtonDict.Add(UpperCase(Button1.Name),Button1);
  ButtonDict.Add(UpperCase(Button2.Name),Button2);
  ButtonDict.Add(UpperCase(Button3.Name),Button3);

  ... 

  //fast access...
  if ButtonDict.TryGetValue(UpperCase(NameOfButton),FoundButton) then
  begin
    //... now you got the button... 
  end else
  begin
    // Button not found...
  end;

  ...

end;
person Andreas    schedule 09.05.2017
comment
Действительно, TDictionary очень мощный и удовлетворяет мои потребности. Я также нашел TObjectDictionary, который кажется еще более подходящим для моих целей. Спасибо! - person ppro; 11.05.2017
comment
Исправление: больше подходит для моих целей - person ppro; 11.05.2017