Einzelnen Beitrag anzeigen

JohannesK

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

Problem mit dpCollection, loadfromStream / assign

  Alt 16. Apr 2009, 16:06
Hallo, ich habe folgendes Problem bei der Verwendung der DpCollection:

savetostream funktioniert, bei loadfromstream kommt Fehlermeldung.

Die Klassen sind wir folgt definiert:
Delphi-Quellcode:
 type TChecklistItems = class(TCollection) // Definition Typ TChecklistItems -

   private // Beginn des privaten Bereichs
    bj, rw, knlevel: Integer;
    selected : boolean;
    icount : integer;
    parent : TComponent;
    iclass : TChecklistItem;
    tn : string;

    function liesParent: TComponent;
    procedure schreibParent(tx: TComponent);
    function liesListname: string;
    procedure schreibListname(tx: string);
    function LiesItemclass: TCollectionItemClass;
    function GetItem(w: integer): TChecklistItem;
    procedure SetItem(w: Integer; const Value: TChecklistItem);

   public // Beginn des öffentlichen Bereichs
    property Items[X : Integer] : TChecklistItem read GetItem write SetItem; default;
    constructor create;
    procedure SaveToStream(Stream: TStream);
    procedure LoadFromStream(Stream: TStream);
    property itemlistname: string read lieslistname write schreiblistname;
    property ItemClass : TCollectionItemClass read LiesItemclass;
    function add: TChecklistItem;
  end;

   TCheckListDummy = class(TComponent)
   private
     FItems : TChecklistItems;
   public
     constructor Create(AOwner : TComponent); override;
     destructor Destroy; override;
     procedure Assign(Source: TPersistent); override;
   published
     property Items : TChecklistItems read FItems write FItems;
   end;

  procedure TChecklistItem.Assign(Source: TPersistent);
    begin
      If Source is TChecklistItem then
        begin
          tn:=TChecklistItem(Source).itemname;
          // FNumbers.Assign(TChecklistItem(Source).Numbers);
      end
        else
        inherited Assign(Source);
  end;
  procedure TChecklistItems.SaveToStream(Stream: TStream);
  var
  CheckListDummy : TCheckListDummy;
  begin
    CheckListDummy:=TCheckListDummy.Create(Nil);
    Try
      CheckListDummy.Items.Assign(self);
      Stream.WriteComponent(CheckListDummy);
    Finally
      CheckListDummy.Free;
    end;
  end;

  procedure TChecklistItems.LoadFromStream(Stream: TStream);
  var
    CheckListDummy : TCheckListDummy;
  begin
    CheckListDummy := TCheckListDummy.Create(Nil);
    Try
      Stream.ReadComponent(CheckListDummy);
      Assign(CheckListDummy.items);
    Finally
      CheckListDummy.Free;
      end;
  end;
Der Stream wird in ein Blob-Feld geschrieben bzw. von dort ausgelesen.
Beim Versuch ein loadfromstream zu nutzen kommt eine EAccessViolation, der gleiche Vorgang für die einzelitems funktioniert ebenfalls ohne Probleme.
Die originale Version der dpCollection funktioniert einwandfrei.

Was habe ich übersehen ?
mit freundlichem Gruss

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