Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.02;
Скачать: CL | DM;

Вниз

Помогите восстановить свойства класса из потока!!!   Найти похожие ветки 

 
serg128 ©   (2004-01-20 12:37) [0]

Привет всем: такая проблема: запихиваю свойства компонента в поток:
TLabel* ts = new TLabel(this);
ts->Tag = 10;
TStringStream* pss = new TStringStream(as);
TMemoryStream *MS = new TMemoryStream();
MS->WriteComponent(ts);
MS->Seek(0, soFromBeginning);
ObjectBinaryToText(MS, pss);
pss->Seek(0, soFromBeginning);
as = pss->DataString;
ShowMessage(as);
delete MS;
delete pss;

с этим всё нормально, а когда пытаюсь восстановить:
TMemoryStream* pms = new TMemoryStream();
TStringStream* pss1 = new TStringStream(as);
TLabel* pCmp;
ObjectTextToBinary(pss1, pms);
pms->Seek(0, soFromBeginning);
pCmp = (TLabel *)pms->ReadComponent(NULL); ===> Ошибка*
delete pms;
delete pss1;

* Пишет "class TLabel not found".
Плиз помогите, как решить эту проблему?


 
Юрий Зотов ©   (2004-01-20 12:59) [1]

> Пишет "class TLabel not found".

До начала загрузки вызовите RegisterClass(TLabel). Детали см. в справке.


 
serg128 ©   (2004-01-20 13:16) [2]

Да, после этого всё заработало, но если я делаю свой класс и регистрирую, то св-ва, определенные в моем классе не передаются. Как быть в этой ситуации?


 
Юрий Зотов ©   (2004-01-20 13:24) [3]

> serg128 © (20.01.04 13:16) [2]

Уточните - какие именно свойства? из какого раздела? что значит "не передаются"?

Вообще, желательно видеть объявление класса.


 
serg128 ©   (2004-01-20 13:37) [4]

class Tst : public TComponent
{
public:
int int_val;
__fastcall Tst(TComponent* AOwner):TComponent(AOwner), int_val(0){}
};

// Код сохранения
Tst* ts = new Tst(this);
ts->int_val=8;
ts->Tag = 10;
RegisterClass(__classid(Tst));
TStringStream* pss = new TStringStream(as);
TMemoryStream* MS = new TMemoryStream();
MS->WriteComponent(ts);
MS->Seek(0, soFromBeginning);
ObjectBinaryToText(MS, pss);
pss->Seek(0, soFromBeginning);
as = pss->DataString;
ShowMessage(as);
delete MS;
delete pss;

// код восстановления
TMemoryStream* pms = new TMemoryStream();
TStringStream* pss1 = new TStringStream(as);
Tst* pc;
ObjectTextToBinary(pss1, pms);
pms->Seek(0, soFromBeginning);
RegisterClass(__classid(Tst));
pc = (Tst *)pms->ReadComponent(NULL);
ShowMessage(IntToStr(pc->int_val));
delete pms;
delete pss1;


 
Юрий Зотов ©   (2004-01-20 13:48) [5]

1. В поток пишутся только свойства, но не поля.
2. Если не перекрыт метод DefineProperties, то в поток пишутся только свойства из секции published.


 
serg128 ©   (2004-01-20 13:54) [6]

а как в моем случае лучше поступить? Как перекрыть метод DefineProperties?


 
Юрий Зотов ©   (2004-01-20 14:02) [7]

> serg128 © (20.01.04 13:54) [6]

Ни за что не поверите, но в справке все сказано. И даже пример есть.

См. TPersistent -> DefineProperties


 
serg128 ©   (2004-01-20 14:14) [8]

не совсем понятно что такое MyCompProperty, это экземпляр класса?


 
Юрий Зотов ©   (2004-01-20 14:25) [9]

Это поле или свойство типа TComponent (или потомок) и НЕ из секции published (или с описателем Stored=False). Например:

type
TSampleComponent = class(TComponent)
...
public
property MyCompProperty: TComponent...
end;


 
serg128 ©   (2004-01-20 14:34) [10]

ну да, но мне же нужно сохранять не свойства, и не типа TComponent это похоже, но не совсем то...


 
Amoeba ©   (2004-01-20 14:36) [11]


> ну да, но мне же нужно сохранять не свойства

А что же тогда тебе нужно???


 
serg128 ©   (2004-01-20 14:41) [12]

переменные, и не типа TComponent


 
Юрий Зотов ©   (2004-01-20 15:18) [13]

> serg128 © (20.01.04 14:41) [12]

Что мешает посмотреть в справке не только ПРИМЕР, но и ОПИСАНИЕ DefineProperies? Чтобы ПОНЯТЬ, что это такое и зачем оно нужно.

Что мешает сделать поиск по исходникам VCL и найти в них еще кучу примеров?

Что мешает переделать любой из этих примеров под свои цели?

Что мешает посмотреть справку по TReader/TWriter и за две минуты найти методы ReadInteger/WriteInteger? И еще кучу подобных.

И т.д.


 
serg128 ©   (2004-01-20 15:33) [14]

Спасибо большое, начало получаться, но на приемном конце пишет "Property does not exist" Может есть какоето лекарство и от этого?


 
Юрий Зотов ©   (2004-01-20 16:57) [15]

Покажите объявление класса, реализацию DefineProperties и Read/Write.


 
serg128 ©   (2004-01-20 17:48) [16]

А если переменных в классе несколько, то для каждой свои обработчики писать? Или можно все переменные проинициализировать соотв. образом в одном обработчике, но тогда вопрос: как добавить одним вызовом DefineProperties несколько свойств?


 
Юрий Зотов ©   (2004-01-20 18:01) [17]

> serg128 © (20.01.04 17:48) [16]

Если имеется в виду Read/Write, то да, для каждой свои.
А в DefineProperties надо столько же раз вызвать
Filer.DefineProperty
и не забыть в начале вызвать inherited.


 
serg128 ©   (2004-01-20 18:26) [18]

> и не забыть в начале вызвать inherited.
не совсем понял


 
serg128 ©   (2004-01-20 18:30) [19]

Т.е. если я сделаю так:
void __fastcall DefineProperties(TFiler *Filer)
{
TComponent::DefineProperties(Filer);
Filer->DefineProperty("MyCompProperty1", LoadCompProperty1, StoreCompProperty1, true);

TComponent::DefineProperties(Filer);
Filer->DefineProperty("MyCompProperty2", LoadCompProperty2, StoreCompProperty2, true);
........
}

то это будет правильно?


 
Юрий Зотов ©   (2004-01-20 18:45) [20]

Зачем дважды вызывать унаследованный метод? Надо один раз, в самом начале. А потом идут все Ваши Filer->DefineProperty (в том порядке, в котором Вы хотите писать Ваши данные в поток).


 
serg128 ©   (2004-01-20 19:00) [21]

Понял, спасибо большое



Страницы: 1 вся ветка

Текущий архив: 2004.02.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
1-2154
Zelius
2004-01-21 17:09
2004.02.02
Подскажите простой и надежный XML парсер.


1-2229
Minimize OnClose
2004-01-20 14:28
2004.02.02
Minimize OnClose


1-2109
Grinder
2004-01-19 19:07
2004.02.02
Округение real


3-2031
AlexNx
2004-01-06 12:37
2004.02.02
Сортировка в ClientDataSet


14-2322
ZDima
2004-01-11 18:21
2004.02.02
Помогите