![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при создании собственного компонента [D7, WinXP]
bars © (2004-04-26 11:59:00)Я пытаюсь создать собственный компонент - замена TForm... но я столкнулся с проблемой... Мне нужен обработчик событий для формы! Но я не могу его создать! (TMyForm=class(TForm) - и не говорите юзать Controls.pas)!...
constructor TDPForm.Create;
begin
inherited create;
with MainWndClassEx do
begin
cbSize :=SizeOf(MainWndClassEx);
style :=CS_HREDRAW or CS_VREDRAW;
lpfnWndProc :=@MyWNDProc;
cbClsExtra :=0;
cbWndExtra :=0;
hInstance :=HInstance;
hIcon :=0;
hCursor :=0;
hbrBackground :=COLOR_BTNFACE+1;
lpszMenuName :=nil;
lpszClassName :='TDPApplication';
hIconSm :=0;
end;
RegisterClassEx(MainWndClassEx);
h_MainWindow:=CreateWindowEx(0,
'TDPApplication',
'Caption',
WS_OVERLAPPED or WS_THICKFRAME or
WS_SYSMENU or WS_MINIMIZEBOX or WS_MAXIMIZEBOX,
30,
30,
167,
210,
0,
0,
Hinstance,
nil);
end;
Это процедура создания окна.
Но когда я пытаюсь MyWNDProc, вложить внутрь класса TDPForm, то компилятор - ругается! как мне дать каждому экземпляру TDPForm по функции MyWNDProc???
Digitman (2004-04-26 16:31:00) [1]пардон, я не о defwindowproc() спросил (ошибка), а о MyWNDProc() ..
у тебя же какой-то алгоритм, анализирующий сообщения и что-то делающий в зависимости от конкр.сообщения, был в MyWNDProc() ?
вот то что ты реализовал в ф-ции MyWNDProc(), перенеси в метод WndProc()
bars (2004-04-26 15:05:00) [2]defwindowproc() - стандартная user32.dll функция
bars (2004-04-26 14:58:00) [3]defwindowproc() она раньше была вместо WndProc - и все работало - тока я сообщений не получал - а теперь если я ее добавляю - дальше прорисовки окна дело не идет
Digitman (2004-04-26 14:49:00) [4]
> а можно как-нибудь ее запрячь для некоторых?
а что у тебя сейчас в теле defwindowproc() творится ? что ты там и как обрабатываешь ?
bars (2004-04-26 14:32:00) [5]defwindowproc - а можно как-нибудь ее запрячь для некоторых?
Digitman (2004-04-26 14:30:00) [6]
> не грузица из-за того, что мой метод не выполняет многие
ну так кто ж тебя заставлял отказываться от станд.формы ?
она все это "многое" делает сама)
а теперь тебе все это "ручками" писать придется !
бери в руки буквари по организации логики оконных ф-ций на ВинАПИ - и вперед !)... образцы для подражения - перед тобой, в модуле Forms
bars (2004-04-26 14:15:00) [7]Свершилось!!! Метод ловит сообщения!!! но теперь моя прога не грузица из-за того, что мой метод не выполняет многие..(((
procedure TDPForm.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_Close: works:=false;
//WM_ACTIVATE: works:=false;
else
defwindowproc(h_MainWindow,message.Msg,message.WParam,message.LParam);
end;
end;
я сделал так, но все-равно не то((( что делать?
Digitman (2004-04-26 14:12:00) [8]
> bars © (26.04.04 13:56) [10]
здесь задавай
bars (2004-04-26 13:56:00) [9]Digitman, у тебя есть ICQ? - а то у меня есть несколько мелких вопросов!
Digitman (2004-04-26 13:50:00) [10]
> с етой переменной что делать?
ничего не делать) ... нехай себе висит
а вот тело ф-ции MyWNDProc() перенеси в реализацию метода TDPForm.WindowProc, ф-ция MyWNDProc() отныне не нужна - обработкой сообщений будет заниматься метод TDPForm.WindowProc
bars (2004-04-26 13:26:00) [11]lpfnWndProc а с етой переменной что делать?
Digitman (2004-04-26 13:11:00) [12]TDPForm = class
..
protected
procedure WindowProc(var Message: TMessage);
..
end;
h_MainWindow:=CreateWindowEx(..);
SetWindowLong(h_MainWindow, GWL_WNDPROC, Longint(MakeObjectInstance(WindowProc)));
bars (2004-04-26 12:55:00) [13]а... понял как задать вопрос... тогда как мне связать метод объекта с lpfnWndProc?
Digitman (2004-04-26 12:43:00) [14]
> функцию-то я написал
какую ? MakeObjectInstance ?
> не могу ее туда прописать
потому что не понимаешь разницы между функцией и методом объекта
bars (2004-04-26 12:38:00) [15]функцию-то я написал, но не могу ее туда прописать(((
Digitman (2004-04-26 12:31:00) [16]
> bars © (26.04.04 12:12) [2]
прежде чем "заюзать", нужно перенести алгоритм этой ф-ции и всего что с ней связано из модуля Forms в свой модуль. Либо написать свою версию этой ф-ции по образу и подобию.
в противном случае условие "не говорите юзать Controls.pas" невыполнимо
Игорь Шевченко (2004-04-26 12:12:00) [17]MakeObjectInstance
bars (2004-04-26 12:12:00) [18]Игорь Шевченко, а как заюзать правильно?