2015-04-25 12 views
6

Ich versuche TObjectList-Klasse in Delphi XE8 zu erstellen, aber ich erhalte Fehler, wenn ich versuche, den Wert zu erhalten.TObjectList <> Elementfehler

Compiler-Fehlermeldung:

mein Code Hier ist: "[DCC32 Error] nicht auf privates Symbol {} System.Generics.Collections TList.GetItem zugreifen kann":

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. 

der Testcode lautet:

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; 

Wie kann ich es funktioniert?

+0

Scheint, Sie versuchen, es falsch zu verwenden. Sie müssen keine neue Klasse erstellen, um die Funktionalität von TObjectList zu nutzen, Beispiel aus der Dokumentation heraussuchen und auf die gleiche Weise verwenden: http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_%28Delphi%29 –

+1

Ich denke Sie verstehen falsch, wie Generika funktionieren. Die Verwendung einer generischen TObjectList besteht darin, dass * nicht * für jeden Objekttyp, den Sie speichern möchten, ein neuer Abkömmling erstellt werden muss. Sie verwenden einfach 'MyTrucList: TObjectList ;' als Variablendeklaration und dann 'MyTrucList: = TObjectList .Create;', um die Liste zu erstellen. Sie können dann ein 'TTruc' mit' MyTrucList.Add (TTruc.Create); 'zu der Liste hinzufügen und es mit' MyTruc: = MyTrucList [0]; 'zurückholen, ohne etwas tippen zu müssen. –

+0

In der Tat ist dies eine einfache Struktur, aber TTruc Klasse muss viele Vars und Funktionen zur Verfügung stellen einschließlich Cascading Instantiierung von TListeDeTrucs (TListeDeTrucs verwenden TTruc als Elemente, aber jede TTruc Elemente können eine andere TListeDeTrucs instanziieren ...) Ich habe hier nur den Code geschrieben das macht das Problem nicht das ganze Projekt –

Antwort

9

Nun, GetItem, und in der Tat SetItem sind privat. Ihr Code kann sie nicht sehen. Private Mitglieder können nur in der Einheit gesehen werden, in der sie deklariert sind. Sie müssen mindestens geschützte Mitglieder verwenden.

Dies kompiliert:

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; 

In diesem Fall Ihre Klasse ist ein wenig sinnlos, weil keiner der Methoden in der Klasse Verhalten von der Basisklasse variieren. Aber peut-être deine echte Klasse tut mehr.

+0

Vielen Dank ... das funktioniert perfekt –