-
Есть необходимость сохранять и загружать свойства компонента в потток или на жесткий диск. для этого все сохраняемые величины должны присутствовать в published секции класса.
TGamerClass = class of TGamer; TPlayersStats = array[0..10] of double; TGamer = class(TCollectionItem) private fStats : TPlayersStats; function GetStat(Index: Integer): double; procedure SetStat(Index: Integer; Value: double); public procedure Assign(Source: TPersistent); override; published property S: TPlayersStats read fStats write fStats; end;
Выдает ошибку что "published property cannot be of type ARRAY" Перерыл весь гугл, видел примеры манипуляции элементами массива через геттеры и сеттеры, но они никак не влияют на непосредственное сохранение ВСЕХ ЗНАЧЕНИЙ массива, лиш очеловечиваю доступ к элементам массива. Сохранение на винт делаю компонентом, содержащим описанный выше элемент через WriteComponentResFile. Подскажите как выйти из ситуации?
-
Перенеси в паблик и делай сериализацию как обычно.
-
-
кому будет полезно решил выложить код, такого нигде не нашел в интернете:
TGamersStats = array[0..10] of double; TGamer = class(TCollectionItem) private fStats : TGamersStats; fName : string; procedure ReadStats(Reader: TReader); procedure WriteStats(Writer: TWriter); constructor Create(aCollection : TCollection); override; destructor Destroy; override; protected procedure DefineProperties(Filer: TFiler); override; public property Stats: TGamersStats read fStats write fStats; procedure Assign(Source: TPersistent); override; published property N: string read fName write fName; end;
.....
procedure TGamer.ReadStats(Reader: TReader); var i : integer; begin i :=0; with Reader do begin ReadListBegin; while not EndOfList do begin fStats[i] := ReadFloat; Inc(i); end; ReadListEnd; end; end;
procedure TGamer.WriteStats(Writer: TWriter); var i : integer; begin with Writer do begin WriteListBegin; for i := 0 to 9 do begin WriteFloat(fStats[i]); end; WriteListEnd; end; end;
procedure TGamer.DefineProperties(Filer: TFiler); function StatsEmpty: Boolean; begin Result := true; end; begin inherited; Filer.DefineProperty('Stats', ReadStats, WriteStats, StatsEmpty); end;
....
естественно данный класс надо погрузить в TComponent и ег методами сохранять и загружать
procedure TfrmMain.Button1Click(Sender: TObject); var fGamers : TGamersComp; fFileStream : TFileStream; fFileName : string; begin RegisterClass(TGamer); fFileName := '__test1.dat'; fGamers := TGamersComp.Create(nil); //saving fFileStream := TFileStream.Create(fFileName, fmCreate); //loading //fFileStream := TFileStream.Create(fFileName, fmOpenRead + fmShareDenyNone);
try //save fFileStream.WriteComponent(fGamers);
//load fFileStream.ReadComponent(fGamers);
finally fFileStream.Free; fGamers.Free; end; end;
|