Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Сохранение \ загрузка свойств класса из файла


Автор: shilnik 25.7.2008, 06:23
Добрый день!

Ситуация такая... 
Есть класс TTask (TComponent) его надо будет сохранять в файл и загружать из файла.
У этого класа есть свойство Steps:TSteps; published; - Это коллекция, элементы которой класс TStep. Но в коллекции находятся объекты не самого TStep, а классы, унаследованные от TStep (со своими добавочными свойствами).
Код выглядит примерно так:
Код

Type TStep = Class (TCollectionItem)
  Private
  Public
    Procedure Execute(); virtual; abstract;
  Published
End;

Type TStepCopyFile = Class (TStep)
  Private
    fPathFrom:String;
    fMask:String;
    fPathTo:String;
  Public
    Procedure Execute(); override;
  Published
    Property PathFrom:String Read fPathFrom Write fPathFrom;
    Property Mask:String Read fMask Write fMask;
    Property PathTo:String Read fPathTo Write fPathTo;
End;

Type TSteps = Class (TCollection)
  Private
    function GetItem(Index: Integer): TStep;
    procedure SetItem(Index: Integer; const Value: TStep);
  Public
    Constructor Create();
    Function Add():TStep;
    Property Items[Index: Integer]: TStep read GetItem write SetItem; default;
  Published
End;

Type TTask = Class (TComponent)
  private
    fSteps:TSteps;
  public
    Constructor Create(Owner:TComponent);
    Destructor Destroy; override;
  Published
    Property Steps:TSteps Read fSteps Write fSteps;
end;


Добавление объектов Step в коллекцию Steps происходит так:
Код

Function TSteps.Add():TStep;
Var Step:TStep;
Begin
  Step:=TStepCopyFile.Create(Self);
  TStepCopyFile(Step).PathFrom:='D:\1';
  TStepCopyFile(Step).PathTo:='C:\1';
  TStepCopyFile(Step).Mask:='*.pas';
  Result:=Step;
End;


Сохранение в файл и загрузка из файла:
Код

Procedure SaveTaskToFile(Task:TTask; FileName:String);
Var fs:TFileStream;
Begin
  fs:= TFileStream.Create (FileName, fmOpenWrite or fmCreate);
  Try
    fs.WriteComponent(Task);
  Finally
    fs.Free;
  End;
End;

Function LoadTaskFromFile(FileName:String):TTask;
Var
  fs: TFileStream;
  tmpTask:TTask;
Begin
  fs:= TFileStream.Create(FileName, fmOpenRead);
  try
    tmpTask:=TTask.Create(Application);
    tmpTask:=fs.ReadComponent(tmpTask) as TTask;
    Result:=tmpTask;
  finally
    fs.Free;
  end;
End;


А теперь внимание... ошибка
При загрузке из файла выскакивает ошибка, что свойство PathFrom не существует. Почему это происходит я понимаю. Видимо по умолчанию создается объект класса TStep, а не TStepCopyFile. Но как быть? Как правильно написать такой класс, чтобы он корректно сохранялся\загружался?

Автор: Alexeis 25.7.2008, 09:20
  Насколько я помню, для сохранения свойств-объектов нужно зарегистрировать специальный объект сохранялку, который и будет сериализовать свойство-объект. Тут в 2х словах не расскажешь читайте книгу "Рэй Конопка - Создание оригинальных компонент в Delphi", ее можно найти тут http://www.delphilab.ru/content/blogsection/4/46/

Автор: shilnik 25.7.2008, 11:07
Alexeis, Если мы друг друга правильно поняли, то в моем случае объект-сохранялка - это объект класса TFileStream с методами ReadComponent и WriteComponent

С простыми объектами это работает. Но в моем случае в объекте описано, что коллекция из объектов класса TStep, а на самом деле там потомки этого класса. Из за этого, видимо, и получается ошибка. 

ЗЫ: Книжку качаю, спасибо.

Автор: Alexeis 25.7.2008, 11:27
Цитата(shilnik @  25.7.2008,  10:07 Найти цитируемый пост)
Alexeis, Если мы друг друга правильно поняли, то в моем случае объект-сохранялка - это объект класса TFileStream с методами ReadComponent и WriteComponent

  Неа, нужен либо редактор свойств объекта PropertyEditor, либо редактор всего компонента ComponentEditor. Сериализатор не знает что является значением текущего объекта, вот это то как раз и нужно указать в в методах наследников PropertyEditor или ComponentEditor.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)