Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 197 198 199 [ 200 ] 201 202 203 ... 210


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 ); Класс создан правильно и его можно вернуть освободив память



1 ... 197 198 199 [ 200 ] 201 202 203 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика