Einzelnen Beitrag anzeigen

Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.063 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Kopie eines Item aus der TObjectList

  Alt 22. Jan 2007, 00:10
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;
  Mit Zitat antworten Zitat