class TEquipCollectionItem:public TCollectionItem{
protected:
TBaseEquipment* FEquipment;
__published:
__property TBaseEquipment* Equipment={read=FEquipment,write=FEquipment};
};
Сериализация коллекций
Имеется элемент коллекции у которого в __published секции объявлено свойство, указатель на объект наследник от TComponent.
Код:
При сериализации коллекции:
Код:
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);
}
}
}
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
CountEquipments = 1
EquipNames = <
item
Equipment = Pult.Sngr7Equipment
end>
end
Как можно реализовать возможность записи свойств объекта Equipment в элементе коллекции?
Если так уж хочется сохранять свойства именно TComponent, придётся писать собственные процедуры чтения/записи и определять их через DefineProperty (как-то так, забыл уже). Но на самом деле это кривой путь, косяки полезут -- мама не горюй. Как бы пол-VCL потом переписывать не пришлось. :)
Например если имеем:
Код:
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};
}
{
__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
Time = 100
APropertyClass = CurClass
object CurClass: TPropertyClass
ExampleProperty = 50
end
end
Как и как должно быть...
Но если TChildComp наследуется от TPersistent или от TCollection, то сериализуется только поле ExampleProperty, а указатель на объект TComponent нет. Как переопределить метод сериализации для элемента коллекции наследника TPersistent я не понимаю.. Пробовал искать в исходниках VCL пока способ не нашел..
Цитата: nILruM
Код:
object ChildComp: TChildComp
Time = 100
APropertyClass = CurClass
object CurClass: TPropertyClass
ExampleProperty = 50
end
end
Time = 100
APropertyClass = CurClass
object CurClass: TPropertyClass
ExampleProperty = 50
end
end
Эта запись равноценна тому, будто CurClass лежит на форме. Похоже, придётся всё же объяснить исходную задачу, иначе игра в угадайку получается.
http://www.rsdn.ru/article/delphi/serialization.xml
Аналогично сериализации форм приложения..
Сериализацию делал по принципу вот этой статьи
Аналогично сериализации форм приложения..