2015-04-25 24 views
6

Próbuję utworzyć klasę TObjectList w Delphi XE8, ale otrzymuję błędy, gdy próbuję uzyskać wartość.TObjectList <> Błąd pozycji

Kompilator komunikat o błędzie: "[dcc32 Błąd]: Nie można uzyskać dostępu do prywatnej symbol {System.Generics.Collections} TList.GetItem"

Oto mój kod:

unit Unit2; 
interface 
uses 
    Classes, System.SysUtils, System.Types, REST.Types, System.JSON, Data.Bind.Components, 
    System.RegularExpressions, System.Variants, 
    Generics.Collections; 

    type 
    TTruc = class 
    public 
    libelle : string; 
    constructor Create(pLibelle : string); 
    end; 

    TListeDeTrucs = class(TObjectList<TTruc>) 
    private 
    function GetItem(Index: Integer): TTruc; 
    procedure SetItem(Index: Integer; const Value: TTruc); 
    public 
    function Add(AObject: TTruc): Integer; 
    procedure Insert(Index: Integer; AObject: TTruc); 
    procedure Delete(Index: Integer); 
    property Items[Index: Integer]: TTruc read GetItem write SetItem; default; 
    end; 

implementation 

{ TTruc } 

constructor TTruc.Create(pLibelle: string); 
begin 
    libelle := pLibelle; 
end; 

{ TListeDeTrucs } 

function TListeDeTrucs.Add(AObject: TTruc): Integer; 
begin 
    result := inherited Add(AObject); 
end; 

procedure TListeDeTrucs.Insert(Index: Integer; AObject: TTruc); 
begin 
    inherited Insert(index, AObject); 
end; 

procedure TListeDeTrucs.Delete(Index: Integer); 
begin 
    inherited delete(index); 
end; 

function TListeDeTrucs.GetItem(Index: Integer): TTruc; 
begin 
    result := inherited GetItem(index); 
end; 

procedure TListeDeTrucs.SetItem(Index: Integer; const Value: TTruc); 
begin 
    inherited setItem(index, value); 
end; 
end. 

kod testowanie jest:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    l : TListeDeTrucs; 
    i : integer; 
    Obj : TTruc; 
begin 
    l := TListeDeTrucs.Create(true); 
    l.Add(TTruc.Create('one')); 
    l.Add(TTruc.Create('two')); 
    Obj := TTruc.Create('three'); 
    l.Add(Obj); 
    for i := 0 to l.count - 1 do 
    begin 
    showMessage(l[i].libelle); 
    end; 
    L.Delete(0); 
    l.extract(Obj); 
    l.Free; 
end; 

Jak mogę zrobić to działa?

+0

Wygląda na to, że próbujesz użyć go w niewłaściwy sposób. Nie musisz tworzyć nowej klasy, aby wykorzystać funkcjonalność TObjectList, sprawdź przykład z dokumentów i użyj w taki sam sposób: http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_%28Delphi%29 –

+1

Myślę, że nie rozumiesz, jak działają generics. Cały punkt użycia ogólnej TObjectList polega na tym, że * nie * musisz utworzyć nowego potomka dla każdego typu obiektu, który chcesz zapisać. Po prostu używaj 'MyTrucList: TObjectList ;' jako deklaracji zmiennej, a następnie 'MyTrucList: = TObjectList . Utwórz' w celu utworzenia listy. Następnie możesz dodać 'TTruc' do listy za pomocą' MyTrucList.Add (TTruc.Create); 'i pobrać z powrotem z' MyTruc: = MyTrucList [0]; ', bez potrzeby pisania etykiet. –

+0

w rzeczywistości jest to prosta struktura, ale klasa TTruc musi udostępniać wiele varów i funkcji do wykorzystania, w tym kaskadowanie instancji TListeDeTrucs (TListeDeTrucs używają TTruc jako elementów, ale każdy element TTruc może zainicjować inne TListeDeTrucs ...) właśnie napisałem tutaj kod to sprawia, że ​​problemem nie jest cały projekt. –

Odpowiedz

9

Cóż, GetItem, a tak naprawdę SetItem są prywatne. Twój kod ich nie widzi. Członków prywatnych można zobaczyć tylko w jednostce, w której są zadeklarowani. Musisz użyć członków, którzy są przynajmniej chronieni.

To kompiluje:

function TListeDeTrucs.GetItem(Index: Integer): TTruc; 
begin 
    Result := inherited Items[Index]; 
end; 

procedure TListeDeTrucs.SetItem(Index: Integer; const Value: TTruc); 
begin 
    inherited Items[Index] := Value; 
end; 

W tym przypadku, gdy klasa jest trochę bez sensu, ponieważ żadna z metod w swojej klasie zmieniać zachowanie z klasy bazowej. Ale obstawiaj, że twoja prawdziwa klasa robi więcej.

+0

Dziękuję bardzo ... to działa idealnie –