Hallo Zusammen,
die Frage vorab: Wenn ich aus einer TObjectList ein item hole etwa so:
CarPosColl := RawTagesauswertung.Items[i];
bekomme ich dan den Pointer des items oder das item selbst?
Ich hätte gerne eine kopie des items.
Ich habe eine Klasse von TObject die Autos verwaltet.
Dann eine Klasse TCarPosCollection von TObjectList die x Autos verwaltet.
Und zuletzt eine Klasse Tagesauswertung ebenfals aus TObjectList
welche x TCarPosCollection verwaltet.
In einer Schleife lese ich aus der TObjectList "Tagesauswertung" ein paar items und
übergebe diese zum verarbeiten in einer zweiten instanz von Klasse.
So wird die übergabe der items gemacht:
CarPosColl := RawTagesauswertung.Items[i];
Wenn ich die Schleife nur ein mal ausführe, funkt alles einwandfrei.
Wenn ich die Schleife ein zweites mal durchführe und dabei vorher
CarPosColl.free aufrufe, bekomme ich eine
exception "EAccessViolation".
Ich vermute das ich keine kopie übergebe sonder nur den Pointer des items welches in
meiner Hauptliste steckt. Der Destructor versucht vermutlich das item aus der Haptliste
zu bereinigen.
Habs auch so probiert und bekomme beim free die
exception "EPrivilege"
Delphi-Quellcode:
CarPosColl := TCarPosCollection.Create;
CarPosColl := RawTagesauswertung.Items[i];
Hat jemand eine Idee?
Hier meine Klassen aus das wesendliche reduziert:
Gruß Kostas
Delphi-Quellcode:
type
TCarPos = class(TObject)
private
FZeitpunkt:TDateTime;
FCarID:integer;
Procedure SetZeitpunkt(value :TDateTime);
function GetZeitpunkt:TDateTime;
Procedure SetCarID(value :Integer);
function GetCarID:Integer;
public
constructor Create;
property Zeitpunkt: TDateTime read GetZeitpunkt write SetZeitpunkt;
property CarID: Integer read GetCarID write SetCarID;
end;
TCarPosCollection =Class(TObjectList)
private
FZustand:Boolean;
function Get(Index: Integer): TCarPos;
procedure SetZustand(value :Boolean);
function GetZustand:Boolean;
public
destructor Destroy; override;
procedure Add(Item: TCarPos);
property Items[Index: Integer]: TCarPos read Get;
property Zustand:Boolean read GetZustand write SetZustand;
end;
TTagesauswertung =Class(TObjectList)
private
function Get(Index: Integer): TCarPosCollection;
public
destructor Destroy; override;
procedure Add(Item: TCarPosCollection);
property Items[Index: Integer]: TCarPosCollection read Get;
end;
destructor TCarPosCollection.Destroy;
var
i: Integer;
begin
for i := 0 to self.Count - 1 do
self.Items[i].Free;
inherited;
end;
procedure TCarPosCollection.Add(Item: TCarPos);
begin
inherited Add(Item);
end;
function TCarPosCollection.Get(index: integer):TCarPos;
begin
result := inherited Get(Index);
end;
destructor TTagesauswertung.Destroy;
var
i: Integer;
begin
for i := 0 to self.Count - 1 do
self.Items[i].Free;
inherited;
end;
procedure TTagesauswertung.Add(Item: TCarPosCollection);
begin
inherited Add(Item);
end;
function TTagesauswertung.Get(index: integer):TCarPosCollection;
begin
result := inherited Get(Index);
end;