Конференция "Компоненты" » Array как Published Property. Как сохранять / загружать значения [D7, Win2k, WinXP]
 
  • w666w (20.04.13 16:29) [0]
    Есть необходимость сохранять и загружать свойства компонента в потток или на жесткий диск. для этого все сохраняемые величины должны присутствовать в 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. Подскажите как выйти из ситуации?
  • Rouse_ © (20.04.13 16:31) [1]
    Перенеси в паблик и делай сериализацию как обычно.
  • w666w (20.04.13 18:53) [2]
    так не получится, но прочитав http://www.rsdn.ru/article/delphi/serialization.xml смог реализовать псевдосвойство с полным чтением и записью
  • w666w (20.04.13 18:56) [3]
    кому будет полезно решил выложить код, такого нигде не нашел в интернете:

     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;
 
Конференция "Компоненты" » Array как Published Property. Как сохранять / загружать значения [D7, Win2k, WinXP]
Есть новые Нет новых   [118456   +59][b:0][p:0]