Форум: "Основная";
Текущий архив: 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