RTTI, typeid, classname, __classid ???
Надо для MDI-приложения сохранить при закрытии всех ее "детей", а при запуске проги снова
их создать.
Т.е. надо при закрытии взять и сохранить что-то типа TMyForm->ClassName,
а при запуске как-то сделать TForm *new = ...
где ... не фиксированный тип, а то, что я возьму из сэйва...
Это как-то связано с темой? Или где это можно посмотреть?
Господа, вопрос такой
Надо для MDI-приложения сохранить при закрытии всех ее "детей", а при запуске проги снова
их создать.
Т.е. надо при закрытии взять и сохранить что-то типа TMyForm->ClassName,
а при запуске как-то сделать TForm *new = ...
где ... не фиксированный тип, а то, что я возьму из сэйва...
А что за прога?
Вообще, если у тебя фиксированный набор классов детей, то сохраняй в сейве код типа, а при лоаде создавай форму этого типа, ifами, например:
if( TypeCode == 1 ) form = new TForm(this);
if( TypeCode == 2 ) form = new TForm2(this);
...
А что за прога?
Вообще, если у тебя фиксированный набор классов детей, то сохраняй в сейве код типа, а при лоаде создавай форму этого типа, ifами, например:
if( TypeCode == 1 ) form = new TForm(this);
if( TypeCode == 2 ) form = new TForm2(this);
...
Ну, это все хорошо! Но ведь набор-то нефиксированный...
А прога такая, чтобы пользователям было удобно. Т.е. они вышли из проги, понаоткрывав там всякое-разное. Завтра зашли, а прога им все то, что они вчера открыли...Word так делает (или опера7.0, только там дочерние формы одного типа)
Хотя бы даже для интереса...Если в С++ можно и это , то я просто №;$ преклоняюсь перед Ритчи, Страустрауструпом и т.п.
Господа, вопрос такой
Надо для 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]
Я сталкивался с подобной проблемой ( свойства грида нужно было запоминать и положение сплитеров на форме ) статей по этому поводу мало, но я нашел под дельфю... немного покопавшись разобрался и написал такую штуку которая записывала в базу данных все __pablished свойства любого обьекта независимо от его типа.
Спасибо за ответ! Возможно, я не слишком правильно выразился, но мне было нужно не это (точнее и это тоже, но с этим я справился сам). Я искал (и нашел) что-то типа:
TForm *ptr;
AnsiString formName = "TChildForm";
RegisterClass(__classid(TChildForm));
Application->CreateForm(FindClass(formName), &ptr);
Господа, вопрос такой
Надо для MDI-приложения сохранить при закрытии всех ее "детей", а при запуске проги снова
их создать.
Т.е. надо при закрытии взять и сохранить что-то типа TMyForm->ClassName,
а при запуске как-то сделать TForm *new = ...
где ... не фиксированный тип, а то, что я возьму из сэйва...
Это как-то связано с темой? Или где это можно посмотреть?
С точки зрения объектно-ориентированного проектирования это выглядит слеующим образом.
Нужно создать фабрику объектов, которая генерит объекты по некоторому индексу (идентификатору класса). Перед завершением завершением программы необходимо записать индексы всех существующих экземпляров в некоторый лог, который может существовать, как обычный файл, так и как совокупность записей в реестре системы.
Вопрос остается лишь в выборе идентификатора класса. Могу предложить вариант введения в класс статической целочисленной константы, отображающей некоторый уникальный индекс. Но, думаю, в Builder-е уже реализована возможность получения некоторой уникальной информации, которая может быть использована, как идентификатор класса.