Einzelnen Beitrag anzeigen

JohannesK

Registriert seit: 17. Jul 2003
Ort: Abtwil
118 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Problem mit dpCollection, loadfromStream / assign

  Alt 17. Apr 2009, 07:52
1. Danke für den Hinweis, die Klasse TChecklistItem ist natürlich auch definiert, TChecklistItems ist die Collection dazu.

Delphi-Quellcode:
  type TChecklistItem = class(TcollectionItem) // Definition Typ TChecklistItem ---
   private
   tn : string;
   function liesItemname: string; procedure schreibItemname(tx: string);
   
   public
   constructor create(AOwner: TCollection); override;
   destructor Destroy; override;
   property itemname: string read liesItemname write schreibItemname;
   procedure Assign(Source: TPersistent); override;
   procedure SaveToStream(Stream: TStream);
   procedure ReadFromStream(Stream: TStream);

  end;

// TChecklistItem --------------------------------------------------------------

  constructor TChecklistItem.Create(AOwner: TCollection);
  begin
    inherited Create(AOwner);
  end;

  destructor TChecklistItem.Destroy;
  begin
    inherited Destroy;
  end;

  procedure TChecklistItem.SaveToStream(Stream: TStream);
  var
    CheckDummy : TCheckDummy;
  begin
    CheckDummy:=TCheckDummy.Create(Nil);
    Try
      CheckDummy.ItemTx := self.ItemTx;
      CheckDummy.tn := self.tn;
      stream.Position := stream.Size;
      Stream.WriteComponent(CheckDummy);
    Finally
    end;
  end;

  procedure TChecklistItem.ReadFromStream(Stream: TStream);
  var
    CheckDummy : TCheckDummy;
  begin
    CheckDummy:=TCheckDummy.Create(Nil);
    Try
      Stream.ReadComponent(CheckDummy);
      self.itemtext := CheckDummy.ItemTx;
      self.itemname := CheckDummy.tn;
    Finally
    end;
  end;

  procedure TChecklistItem.Assign(Source: TPersistent);
    begin
      If Source is TChecklistItem then
        begin
          tn:=TChecklistItem(Source).itemname;
         
      end
        else
        inherited Assign(Source);
  end;
Zur Klasse TChecklistItem gehört ebenso ein Dummy for das Streaming, TCheckdummy. Schreiben und Lesen in den Stream funktioniert ohne Probleme.

2. Der Fehler kommt direkt beim Aufruf der Assign-Methode, aber nur beim Lesen:

Delphi-Quellcode:
  procedure TChecklistItems.LoadFromStream(Stream: TStream);
  var
    CheckListDummy : TCheckListDummy;
  begin
    CheckListDummy := TCheckListDummy.Create(Nil);
    Try
      Stream.ReadComponent(CheckListDummy);
      Assign(CheckListDummy.items); // Hier kommt die Zugriffsverletzung
    Finally
      CheckListDummy.Free;
      end;
  end;
Gruss JK
mit freundlichem Gruss

So einfach wie möglich. Aber nicht einfacher.
  Mit Zitat antworten Zitat