Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
4-2409
Zorrow
2003-11-25 17:22
2004.02.02
регистр EIP


3-1990
Layner
2004-01-06 08:49
2004.02.02
PHP4(FreeBSD) + MSSQL2000. Даты.


3-1956
ish
2004-01-09 16:07
2004.02.02
SQL Query


1-2079
qwerty2
2004-01-20 12:13
2004.02.02
Пул COM объектов


14-2310
VID
2004-01-11 17:26
2004.02.02
Настройки Windows2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский