2015-04-25 10 views
6

Sto provando a creare la classe TObjectList in Delphi XE8, ma ottengo errori quando cerco di ottenere il valore.TObjectList <> Ottieni l'errore articolo

compilatore messaggio di errore: "[Errore dcc32]: non può accedere al simbolo privata {} System.Generics.Collections TList.GetItem"

Ecco il mio codice:

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. 

il codice di prova è:

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; 

Come posso farlo funzionare?

+0

Sembra che tu stia cercando di usarlo nel modo sbagliato. Non è necessario creare una nuova classe per utilizzare le funzionalità di TObjectList, consultare l'esempio dei documenti e utilizzarli nello stesso modo: http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_%28Delphi%29 –

+1

Penso stai fraintendendo il modo in cui i farmaci generici funzionano. L'intero punto di utilizzo di una TObjectList generica è * non * necessario creare un nuovo discendente per ogni tipo di oggetto che si desidera archiviare. È sufficiente utilizzare 'MyTrucList: TObjectList ;' come dichiarazione della variabile, quindi 'MyTrucList: = TObjectList .Create;' per creare l'elenco. Puoi quindi aggiungere un 'TTruc' alla lista con' MyTrucList.Add (TTruc.Create); 'e recuperarlo con 'MyTruc: = MyTrucList [0];', senza bisogno di digitare nulla. –

+0

infatti è una struttura semplice ma la classe TTruc ha bisogno di fornire molte vars e funzioni da utilizzare tra cui l'istanziazione a cascata di TListeDeTrucs (TListeDeTruc utilizza TTruc come oggetti, ma ogni oggetto TTruc può instanciare un altro TListeDeTrucs ...) ho appena scritto qui il codice che rende il problema non l'intero progetto –

risposta

9

Beh, GetItem, e infatti SetItem sono privati. Il tuo codice non può vederli. I membri privati ​​possono essere visti solo nell'unità in cui sono dichiarati. È necessario utilizzare membri che sono almeno protetti.

Questo compila:

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 questo caso la classe è un po 'inutile, perché nessuno dei metodi nella classe variano comportamento dalla classe base. Ma peut-être la tua vera classe fa di più.

+0

Grazie mille ... funziona perfettamente –

Problemi correlati