Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Как правильно зарегистрировать класс?   Найти похожие ветки 

 
ffo ©   (2006-08-28 00:21) [0]

Как мне правильно зарегистрировать класс BmpRgnWndClass?

procedure TForm1.Button1Click(Sender: TObject);
var
wndMain: hWnd;
w,h: DWORD;
wc : TWndClassEx;
begin
     With  wc do
begin
 cbSize:=sizeof(wc); style:=CS_HREDRAW or CS_VREDRAW;
 lpfnWndProc:=@WindowProc;
 cbClsExtra:=0; cbWndExtra:=0;
 hInstance:=hInstance; hIcon:=LoadIcon(0,IDI_APPLICATION);
 hCursor:=LoadCursor(0,IDC_ARROW); hbrBackground:=COLOR_BTNFACE+1;
 lpszMenuName:=nil; lpszClassName:="BmpRgnWndClass";
end;
 RegisterClassEx(wc);
 If RegisterClassEx(wc) = 0 then ShowMessage ("Класс не зарегистрирован");
 wndMain:= CreateWindow("BmpRgnWndClass", "Программа", WS_POPUP, 10, 10, 100, 100, 0, 0,hInstance,nil);

 SetWindowPos(wndMain, hwnd_TopMost, 300, 0, 250, 70, SWP_NOACTIVATE );
//  ShowWindow( wndMain, CmdShow);
//  UpdateWindow (wndMain);
end;


 
Zeqfreed ©   (2006-08-28 00:26) [1]

Не сомневаюсь, что при повторной попытке зарегистрировать класс тебе возвращают 0. Почитал бы что говорит GetLastError, наверное что-то полезное.


 
guav ©   (2006-08-28 00:26) [2]

> hInstance:=hInstance;

Это пример о "вреде" with.
hInstance:=SysInit.hInstance

Возможно это не всё, что GetLastError говорит проверять надо.


 
Ketmar ©   (2006-08-28 00:29) [3]

а зачем регистрировать класс где-то в ливере программы?


 
Zeqfreed ©   (2006-08-28 00:31) [4]

> [3] Ketmar ©   (28.08.06 00:29)

А какая разница? :)
Может быть это секретная технология register-on-demand?


 
Ketmar ©   (2006-08-28 00:33) [5]

> [4] Zeqfreed ©   (28.08.06 00:31)
да никакой. но некрасиво. и чревато повторным регистрированием, что совершенно излишне.


 
Zeqfreed ©   (2006-08-28 00:35) [6]

> [5] Ketmar ©   (28.08.06 00:33)

Ну не знаю, я бы все-таки предпочел регистрацию непосредственно перед использованием. Особенно, если выполнение может и не дойти до точки, где класс понадобится. Насчет повторной регистрации — такие случаи, разумеется, нужно исключать.


 
Ketmar ©   (2006-08-28 01:26) [7]

> [6] Zeqfreed ©   (28.08.06 00:35)
так вот самый простой способ исключить -- зарегистрировать всё в начале. %-)


 
ffo ©   (2006-08-28 08:26) [8]

Как зарегистрировать  все в начале?


 
Ketmar ©   (2006-08-28 10:13) [9]

> [8] ffo ©   (28.08.06 08:26)
точно так же, как и влюбом другом месте -- уверяю тебя, код не изменится.


 
StriderMan ©   (2006-08-28 11:59) [10]


> Ketmar ©   (28.08.06 01:26) [7]
> так вот самый простой способ исключить -- зарегистрировать
> всё в начале. %-)

в initialization? Согласин, подходит почти всегда.

У меня такой вот косяк был: модуль, в котором описаны компоненты использовался и в EXE и в подцепляемой им DLL. регистрация была в initialization. Соответственно компоненты регились сначала ЕХЕшником, потом DLLкой, и получалась борода. пришлось регистрить непосредственно перед использованием, и потом сразу Un"регить.


 
Ketmar ©   (2006-08-28 12:02) [11]

> [10] StriderMan ©   (28.08.06 11:59)
а кто мешает в .dpr вставить?


 
StriderMan ©   (2006-08-28 12:03) [12]


> Ketmar ©   (28.08.06 12:02) [11]
> а кто мешает в .dpr вставить?

в dpr экзэшника или ДЛЛки?


 
Ketmar ©   (2006-08-28 12:06) [13]

> [12] StriderMan ©   (28.08.06 12:03)
где используешь -- туда и пихай. %-)


 
StriderMan ©   (2006-08-28 12:06) [14]


> Ketmar ©   (28.08.06 12:06) [13]
> где используешь -- туда и пихай. %-)

так я и там и сям использую :)


 
Ketmar ©   (2006-08-28 12:15) [15]

> [14] StriderMan ©   (28.08.06 12:06)
тогда туда, где первым создаётся. %-)


 
StriderMan ©   (2006-08-28 12:23) [16]


> Ketmar ©   (28.08.06 12:15) [15]
> тогда туда, где первым создаётся. %-)

пусть, например, это будет экзешник. зарегистрил, че-то сделал.
теперь например в длл-ке нужно подгрузить компонент из потока. при попытке загрузки прилага ругнется типа Cannot Assign class TMyClass to class TMyClass. т.к. в длл и ехе это по-сути разные классы.


 
ffo ©   (2006-08-28 12:39) [17]

Здесь я не использую Dll. WindowProc находится просто в другом модуле.

Не будите ли вы так любезны показать как говорят в строке (т.е.кодом) хоть один из вариантов регистрации. Не умею я "где используешь -- туда и пихать".


 
StriderMan ©   (2006-08-28 12:42) [18]

program MyProg;

....

begin

.....

initialization

 RegisterClass(TMyClass);

finalization

 UnRegisterClass(TMyClass);
end.


 
Ketmar ©   (2006-08-28 12:43) [19]

> [16] StriderMan ©   (28.08.06 12:23)
а при чём тут дельфячьи классы? мы, вроде, о классах виндовых окон говорили...


 
StriderMan ©   (2006-08-28 12:46) [20]


> Ketmar ©   (28.08.06 12:43) [19]
> а при чём тут дельфячьи классы? мы, вроде, о классах виндовых
> окон говорили...

... и правда... че это я.... :(


 
ffo ©   (2006-08-28 13:31) [21]

У меня так сказать "тихая не регистрация", то есть ошибки нет не смотря на то, что в принципе в моем коде два раза запрашивается эта самая регистрация:
RegisterClassEx(wc);//первый раз
If RegisterClassEx(wc) = 0 then ShowMessage ("Класс не зарегистрирован");//второй раз
нет ошибки...нет регистрации


 
Ketmar ©   (2006-08-28 13:54) [22]

> [21] ffo ©   (28.08.06 13:31)
йок... (ушёл думать о бренности земного)



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.047 c
15-1156099071
AntiUser
2006-08-20 22:37
2006.09.17
К знатокам Oracle.


4-1147722705
Mr tray
2006-05-15 23:51
2006.09.17
из хук-DLL узнать значение переменной в моей программе


3-1152429814
PhillipJFry
2006-07-09 11:23
2006.09.17
Перенос данных из запроса в таблицу!!


2-1156679934
The_SloN
2006-08-27 15:58
2006.09.17
Есть команда DeleteFile(‘Filename’)


8-1141606095
KALqYAN
2006-03-06 03:48
2006.09.17
Skins