Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение \ загрузка свойств класса из файла 
:(
    Опции темы
shilnik
Дата 25.7.2008, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 377
Регистрация: 22.12.2003

Репутация: нет
Всего: 1



Добрый день!

Ситуация такая... 
Есть класс 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. Но как быть? Как правильно написать такой класс, чтобы он корректно сохранялся\загружался?


--------------------
каталог товаров qp1
PM MAIL WWW   Вверх
Alexeis
Дата 25.7.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
shilnik
Дата 25.7.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 377
Регистрация: 22.12.2003

Репутация: нет
Всего: 1



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

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

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


--------------------
каталог товаров qp1
PM MAIL WWW   Вверх
Alexeis
Дата 25.7.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0792 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.