|
Программирование >> Перегруженные имена функций и идентификаторы
1252 = c 1251.nls И все!!! Никаких проблем с иероглифами в любых программах! Из-за чего может виснуть С++Builder 3 под Windows 98 (при запуске)? Он запускался в Windows 95 при 16 цветах, а в Windows 98 никак не хочет Надо либо убавлять Hardware Acceleration, либо менять драйверы. [HKEY CURRENT CONFIG\Display\Settings] BusThrottle = on Почему в билдере размер структуры всегда растягивается до кратного 4-ем? Из-за выравнивания (RTFM Data Alignment). Чтобы поля структуры выравнивались на 8-ми битную границу, необходимо использовать следующую конструкцию: #pragma pack(push, 1) <structure definition> #pragma pack(pop) Менять выравнивание для всего проекта (Project Options\Advanced Compiler\Data Alignment) не рекомендуется. Какой-нибудь из CBuilderов умеет делать win16 Exe? Нет. Как создать компонент по его имени? #include <typeinfo.h> #include <stdio.h> class A { public: virtual A *Create(void) = 0; class B1 : A { public: B1(); A *Create(void) { return(new B1); } class B2 : A { public: B2(); A *Create(void) { return(new B2); } B1::B1() { printf( Create B1\n ); } B2::B2() { printf( Create B2\n ); } Собственно создатель A *CopyCreate(A *a) if(a && typeid(A).before(typeid(a))) return(a->Create()); else printf( Illegal call\n ); return(NULL); дальше пример использования void main( void ) B1 *b1 = new B1; B2 *b2 = new B2; printf( Call test b1\n ); B1 *bb1 = dynamic cast<B1*>(CopyCreate(reinterpret cast<A*>(b1))); printf( Call test b2\n ); B2 *bb2 = dynamic cast<B2*>(CopyCreate(reinterpret cast<A*>(b2))); delete b; delete bb2; delete b1; delete b2; --------------------pезyльтат запyска----------- G:\PROJECT.BC5\Test>a.exe Create B1 Create B2 Call test b1 Create B1 Call test b2 Create B2 Естественно для полной кyльтypности надо понавставлять try/catch ии перекрыть Bad Cast, но это уже детали. Еще один способ: class TComponent1* : public TComponent Это класс от которого мы будем порождать все наши классы public: fastcall TComponent1( TComponent* Owner ):TComponent(Owner){} virtual TComponent1* fastcall Create(TComponent* Owner)=0; class TMyClass1 : public TComponent1 public: fastcall TMyClass1(TComponent* Owner): TComponent1(Owner){} virtual TMyClass1* fastcall Create(TComponent* Owner) {return new TMyClass1(Owner);} Эта функция создает класс, поскольку все создаваемые классы мои и порождены от TObject проблем нет, осталось только ее вызвать. Вот функция для создания класса: TComponent1* fastcall CreateClass( AnsiString ClsName, TComponent* Owner ) TClass cls = GetClass( clsName ); Это сработает если класс зарегистрирован функцией RegisterClasses в инициализации модуля void * mem = SysGetMem( InstanceSize(cls) ); TComponent1* Result = InitInstance(cls, mem); Result = Result->Create( Owner ); Класс создан правильно и его можно вернуть освободив память
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |