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

Ваш аккаунт

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

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

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

RTTI, typeid, classname, __classid ???

460
27 марта 2003 года
Berg
261 / / 27.03.2003
Господа, вопрос такой
Надо для MDI-приложения сохранить при закрытии всех ее "детей", а при запуске проги снова
их создать.
Т.е. надо при закрытии взять и сохранить что-то типа TMyForm->ClassName,
а при запуске как-то сделать TForm *new = ...
где ... не фиксированный тип, а то, что я возьму из сэйва...
Это как-то связано с темой? Или где это можно посмотреть?
463
27 марта 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by Berg
Господа, вопрос такой
Надо для MDI-приложения сохранить при закрытии всех ее "детей", а при запуске проги снова
их создать.
Т.е. надо при закрытии взять и сохранить что-то типа TMyForm->ClassName,
а при запуске как-то сделать TForm *new = ...
где ... не фиксированный тип, а то, что я возьму из сэйва...



А что за прога?
Вообще, если у тебя фиксированный набор классов детей, то сохраняй в сейве код типа, а при лоаде создавай форму этого типа, ifами, например:

if( TypeCode == 1 ) form = new TForm(this);
if( TypeCode == 2 ) form = new TForm2(this);
...

460
27 марта 2003 года
Berg
261 / / 27.03.2003
Цитата:
Originally posted by waterman


А что за прога?
Вообще, если у тебя фиксированный набор классов детей, то сохраняй в сейве код типа, а при лоаде создавай форму этого типа, ifами, например:

if( TypeCode == 1 ) form = new TForm(this);
if( TypeCode == 2 ) form = new TForm2(this);
...



Ну, это все хорошо! Но ведь набор-то нефиксированный...

А прога такая, чтобы пользователям было удобно. Т.е. они вышли из проги, понаоткрывав там всякое-разное. Завтра зашли, а прога им все то, что они вчера открыли...Word так делает (или опера7.0, только там дочерние формы одного типа)

Хотя бы даже для интереса...Если в С++ можно и это , то я просто №;$ преклоняюсь перед Ритчи, Страустрауструпом и т.п.

469
27 марта 2003 года
Sli
71 / / 20.01.2000
Цитата:
Originally posted by Berg
Господа, вопрос такой
Надо для MDI-приложения сохранить при закрытии всех ее "детей", а при запуске проги снова
их создать.
Т.е. надо при закрытии взять и сохранить что-то типа TMyForm->ClassName,
а при запуске как-то сделать TForm *new = ...
где ... не фиксированный тип, а то, что я возьму из сэйва...
Это как-то связано с темой? Или где это можно посмотреть?



Я сталкивался с подобной проблемой ( свойства грида нужно было запоминать и положение сплитеров на форме ) статей по этому поводу мало, но я нашел под дельфю... немного покопавшись разобрался и написал такую штуку которая записывала в базу данных все __pablished свойства любого обьекта независимо от его типа.

Переписаное для Builder'а выглядит примерно так:
String enu,val="";

TTypeData *Ref=GetTypeData((TTypeInfo *)TheObj->ClassInfo());
int n=Ref->PropCount;
PPropList List;
if(n<=0) return;
List=new PPropInfo[n];
GetPropInfos((TTypeInfo *)TheObj->ClassInfo(),List);
for(int i=0;i<n;i++)
{
char *PropNameTmp;
int ns=(short)List->Name[0];
PropNameTmp= new char[(ns+1)];
memcpy(PropNameTmp,&(List->Name[1]),ns);
PropNameTmp[ns]='\0';
String str=PropNameTmp;
delete [] PropNameTmp;

val="";
int typ=(*List->PropType)->Kind;
switch(typ)
{
case 5:
case 10:
case 11:
if(PropName==PropT+str || PropName=="") val=GetStrProp(TheObj,List);
break;
case 1:
if(PropName==PropT+str || PropName=="") val=IntToStr(GetOrdProp(TheObj,List));
break;
case 3:
if(PropName==PropT+str || PropName=="") val=GetEnumProp(TheObj,List);
break;
case 7:
if(PropName==PropT+str || PropName=="")
SaveProp((TObject *)GetObjectProp(TheObj,List),PropName,ViewID,PropT+str+".",PObjName=="" ?((TComponent*)TheObj)->Name : PObjName);
break;
}


Будут вопросы обращайтесь ICQ:152633983 mail: [email]sli@pisem.net[/email]

460
28 марта 2003 года
Berg
261 / / 27.03.2003
[QUOTE]Originally posted by Sli


Я сталкивался с подобной проблемой ( свойства грида нужно было запоминать и положение сплитеров на форме ) статей по этому поводу мало, но я нашел под дельфю... немного покопавшись разобрался и написал такую штуку которая записывала в базу данных все __pablished свойства любого обьекта независимо от его типа.

Спасибо за ответ! Возможно, я не слишком правильно выразился, но мне было нужно не это (точнее и это тоже, но с этим я справился сам). Я искал (и нашел) что-то типа:

TForm *ptr;
AnsiString formName = "TChildForm";
RegisterClass(__classid(TChildForm));
Application->CreateForm(FindClass(formName), &ptr);
3
28 марта 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Berg
Господа, вопрос такой
Надо для MDI-приложения сохранить при закрытии всех ее "детей", а при запуске проги снова
их создать.
Т.е. надо при закрытии взять и сохранить что-то типа TMyForm->ClassName,
а при запуске как-то сделать TForm *new = ...
где ... не фиксированный тип, а то, что я возьму из сэйва...
Это как-то связано с темой? Или где это можно посмотреть?



С точки зрения объектно-ориентированного проектирования это выглядит слеующим образом.

Нужно создать фабрику объектов, которая генерит объекты по некоторому индексу (идентификатору класса). Перед завершением завершением программы необходимо записать индексы всех существующих экземпляров в некоторый лог, который может существовать, как обычный файл, так и как совокупность записей в реестре системы.
Вопрос остается лишь в выборе идентификатора класса. Могу предложить вариант введения в класс статической целочисленной константы, отображающей некоторый уникальный индекс. Но, думаю, в Builder-е уже реализована возможность получения некоторой уникальной информации, которая может быть использована, как идентификатор класса.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог