Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сериализация коллекций

46K
17 декабря 2010 года
nILruM
30 / / 10.02.2010
Доброго времени суток. Возник следующий вопрос.

Имеется элемент коллекции у которого в __published секции объявлено свойство, указатель на объект наследник от TComponent.

 
Код:
class TEquipCollectionItem:public TCollectionItem{
protected:
  TBaseEquipment* FEquipment;
__published:
 __property TBaseEquipment* Equipment={read=FEquipment,write=FEquipment};
};


При сериализации коллекции:

Код:
MemStream->WriteComponent(this);
MemStream->Position = 0;
ObjectBinaryToText(MemStream, FileStream);


void __fastcall TPl::GetChildren(TGetChildProc Proc, TComponent* Root)
{
TComponent::GetChildren(Proc, Root);//вызываем функцию предка
if (Root == this)
    {
    for (int i=0;i<ComponentCount;i++)//пройдемся по всем компонентам
        {
        TComponent* OwnedComponent = Components;
        if (!OwnedComponent->HasParent()) Proc(OwnedComponent);
        }
    }
}


В файл записывается только имя объекта:

 
Код:
object Pult: TPult
    CountEquipments = 1
    EquipNames = <
      item
        Equipment = Pult.Sngr7Equipment
      end>
  end


Как можно реализовать возможность записи свойств объекта Equipment в элементе коллекции?
10
17 декабря 2010 года
Freeman
3.2K / / 06.03.2004
По умолчанию в VCL считается, что свойства типа TComponent -- ссылки, поэтому и записывается только имя. Для сохранения комплексных свойств, не являющихся компонентами, их надо наследовать от TPersistent или TCollection, если несколько однотипных элементов.

Если так уж хочется сохранять свойства именно TComponent, придётся писать собственные процедуры чтения/записи и определять их через DefineProperty (как-то так, забыл уже). Но на самом деле это кривой путь, косяки полезут -- мама не горюй. Как бы пол-VCL потом переписывать не пришлось. :)
46K
18 декабря 2010 года
nILruM
30 / / 10.02.2010
Сериализация объектов наследников от TComponent проходит нормально..
Например если имеем:

Код:
class TPropertyClass: public TComponent
{
__published:
    __property int ExampleProperty={read=FExampleProperty,write=FExampleProperty};
}

class TChildComp: public TComponent
{
__published:
    __property int Time={read=read=FTime,write=FTime};
    __property TPropertyClass* APropertyClass={read=FAPropertyClass,write=FAPropertyClass};
}


То после сериализации в файл запишется:

 
Код:
object ChildComp: TChildComp
    Time = 100
    APropertyClass = CurClass
    object CurClass: TPropertyClass
           ExampleProperty = 50
           end
    end


Как и как должно быть...

Но если TChildComp наследуется от TPersistent или от TCollection, то сериализуется только поле ExampleProperty, а указатель на объект TComponent нет. Как переопределить метод сериализации для элемента коллекции наследника TPersistent я не понимаю.. Пробовал искать в исходниках VCL пока способ не нашел..
10
19 декабря 2010 года
Freeman
3.2K / / 06.03.2004
Цитата: nILruM
 
Код:
object ChildComp: TChildComp
    Time = 100
    APropertyClass = CurClass
    object CurClass: TPropertyClass
           ExampleProperty = 50
           end
    end


Эта запись равноценна тому, будто CurClass лежит на форме. Похоже, придётся всё же объяснить исходную задачу, иначе игра в угадайку получается.

46K
19 декабря 2010 года
nILruM
30 / / 10.02.2010
Сериализацию делал по принципу вот этой статьи http://www.rsdn.ru/article/delphi/serialization.xml
Аналогично сериализации форм приложения..
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог