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?
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 –
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. –
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. –