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
?