2017-05-08 3 views
1

Je construire un wich TObjectList stockera objets de la classe TButton:TObjectList trouver un élément

...  
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; 

plus loin, dans l'unité untRetrieveButton:

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

Je veux revenir un bouton arbitraire stocké dans ButtonObjectList, mais à ce stade, je ne connais que le nom du bouton. D'après ce que je l'ai appris à la documentation TObjectList, la seule façon de ACHIVE cela, parcourt la liste complète des articles et comparer le paramètre aButtonName avec le dans le TObjectList, comme dans

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

Est-ce droit , ou existe-t-il un moyen meilleur et plus efficace de récupérer un bouton arbitraire par son nom?

Répondre

1

Je pense que si vous n'avez qu'un nombre limité de boutons, cela n'a pas d'importance et la vitesse devrait être bonne.

Si je ces cas, j'utiliser souvent une solution comme ceci:

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; 
+0

En effet TDictionary est très puissant et convient à mes besoins. J'ai également trouvé le TObjectDictionary, qui semble être encore plus adapté à mes objectifs. Merci! – ppro

+0

Correction: "plus approprié pour mes _pourposes_" – ppro