2010-08-12 8 views
0

Как я могу найти по имени и получить элемент в коллекции объекта?delphi 7: Как я могу найти элемент коллекции объектов?

procedure TfoMain.InitForm; 
    begin 
     // Liste des produits de la pharmacie 1 
     FListeDispoProduit := TListeDispoProduit.Create(TProduit); 

     with (FListeDispoProduit) do 
     begin 
     with TProduit(Add) do 
     begin 
      Name := 'Produit 01'; 
      CIP := 'A001'; 
      StockQty := 3; 
      AutoRestock := 1; 
      QtyMin:= 2; 
     end; 

     with TProduit(Add) do 
     begin 
      Name := 'Produit 02'; 
      CIP := 'A002'; 
      StockQty := 5; 
      AutoRestock := 0; 
      QtyMin:= 2; 
     end; 



function getProductByName(productName: String): TProduit; 
    var 
     i : integer; 
    begin 
     for i := 0 to fProductList.Count -1 do 
     begin 
     if (TProduit(fProductList.Items[i]).Name = productName) 
      Result := 
     end; 
    end; 

Я хочу отредактировать qty о названии продукта.

Как я могу это сделать? спасибо

+0

Какая версия Delphi? –

+0

Вы редактировали свой вопрос, пока я писал свой ответ, и теперь выясняется, что вы уже знаете, как распознать элемент в списке. Поскольку вы уже знаете ответ, что вы действительно просите? –

ответ

1

Если ваш объект коллекции является TCollection, тогда у него есть свойство Items (которое вы должны были увидеть в документации или в исходном коде). Используйте это свойство и его свойство Count, чтобы написать цикл, в котором вы проверяете каждый элемент, чтобы узнать, соответствует ли он вашей цели.

var 
    i: Integer; 
begin 
    for i := 0 to Pred(FListeDespoProduit.Count) do begin 
    if TProduit(FListeDespoProduit.Items[i]).Name = productName then begin 
     Result := TProduit(FListeDespoProduit.Items[i]); 
     exit; 
    end; 
    end; 
    raise EItemNotFound.Create; 
end; 

Items является default property, что означает, что вы можете исключить его из вашего кода и использовать только индекс массива сам по себе. Вместо FListeDespoProduit.Items[i] вы можете сократить его до FListeDespoProduit[i].

0

Ваш TProduit инвентарь (Add). Он еще не реализовал (Get) (или что-то подобное)?

Вы наследуете этот код? Есть ли больше деталей?

Редактировать: иначе вам нужно будет создать процедуру Get самостоятельно, возможно, перейдя по списку и найдя совпадение, а затем вернув его.

+0

Я редактирую свой код, но как вернуть объект продукта? – TimeIsNear

+1

Точно так же вы обращаетесь к нему. Назначьте его переменной Result, а затем «exit» или «break». Разница заключается в том, что процедура «выхода» выходит, а «break» только выходит из цикла «for i: = 0 to fProductList.Count-1». – himself

0
function getProductByName(productName: String): TProduit; 
    var 
    i : integer; 
begin 
    for i := 0 to fProductList.Count -1 do 
    begin 
    if (TProduit(fProductList.Items[i]).Name = productName) 
     Result := TProduit(fProductList.Items[i]); // this??? 
    end; 
end; 

Вы можете пойти:

MyProduit := getProductByName('banana'); 
MyProduit.StockQty := 3; 

Или все, что вы хотите.