Текущий архив: 2004.06.06;
Скачать: CL | DM;
Вниз
Проблема при создании собственного компонента Найти похожие ветки
← →
bars © (2004-04-26 11:59) [0]Я пытаюсь создать собственный компонент - замена 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???
← →
Игорь Шевченко © (2004-04-26 12:12) [1]MakeObjectInstance
← →
bars © (2004-04-26 12:12) [2]Игорь Шевченко, а как заюзать правильно?
← →
Digitman © (2004-04-26 12:31) [3]
> bars © (26.04.04 12:12) [2]
прежде чем "заюзать", нужно перенести алгоритм этой ф-ции и всего что с ней связано из модуля Forms в свой модуль. Либо написать свою версию этой ф-ции по образу и подобию.
в противном случае условие "не говорите юзать Controls.pas" невыполнимо
← →
bars © (2004-04-26 12:38) [4]функцию-то я написал, но не могу ее туда прописать(((
← →
Digitman © (2004-04-26 12:43) [5]
> функцию-то я написал
какую ? MakeObjectInstance ?
> не могу ее туда прописать
потому что не понимаешь разницы между функцией и методом объекта
← →
bars © (2004-04-26 12:55) [6]а... понял как задать вопрос... тогда как мне связать метод объекта с lpfnWndProc?
← →
Digitman © (2004-04-26 13:11) [7]TDPForm = class
..
protected
procedure WindowProc(var Message: TMessage);
..
end;
h_MainWindow:=CreateWindowEx(..);
SetWindowLong(h_MainWindow, GWL_WNDPROC, Longint(MakeObjectInstance(WindowProc)));
← →
bars © (2004-04-26 13:26) [8]lpfnWndProc а с етой переменной что делать?
← →
Digitman © (2004-04-26 13:50) [9]
> с етой переменной что делать?
ничего не делать) ... нехай себе висит
а вот тело ф-ции MyWNDProc() перенеси в реализацию метода TDPForm.WindowProc, ф-ция MyWNDProc() отныне не нужна - обработкой сообщений будет заниматься метод TDPForm.WindowProc
← →
bars © (2004-04-26 13:56) [10]Digitman, у тебя есть ICQ? - а то у меня есть несколько мелких вопросов!
← →
Digitman © (2004-04-26 14:12) [11]
> bars © (26.04.04 13:56) [10]
здесь задавай
← →
bars © (2004-04-26 14:15) [12]Свершилось!!! Метод ловит сообщения!!! но теперь моя прога не грузица из-за того, что мой метод не выполняет многие..(((
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:30) [13]
> не грузица из-за того, что мой метод не выполняет многие
ну так кто ж тебя заставлял отказываться от станд.формы ?
она все это "многое" делает сама)
а теперь тебе все это "ручками" писать придется !
бери в руки буквари по организации логики оконных ф-ций на ВинАПИ - и вперед !)... образцы для подражения - перед тобой, в модуле Forms
← →
bars © (2004-04-26 14:32) [14]defwindowproc - а можно как-нибудь ее запрячь для некоторых?
← →
Digitman © (2004-04-26 14:49) [15]
> а можно как-нибудь ее запрячь для некоторых?
а что у тебя сейчас в теле defwindowproc() творится ? что ты там и как обрабатываешь ?
← →
bars © (2004-04-26 14:58) [16]defwindowproc() она раньше была вместо WndProc - и все работало - тока я сообщений не получал - а теперь если я ее добавляю - дальше прорисовки окна дело не идет
← →
bars © (2004-04-26 15:05) [17]defwindowproc() - стандартная user32.dll функция
← →
Digitman © (2004-04-26 16:31) [18]пардон, я не о defwindowproc() спросил (ошибка), а о MyWNDProc() ..
у тебя же какой-то алгоритм, анализирующий сообщения и что-то делающий в зависимости от конкр.сообщения, был в MyWNDProc() ?
вот то что ты реализовал в ф-ции MyWNDProc(), перенеси в метод WndProc()
Страницы: 1 вся ветка
Текущий архив: 2004.06.06;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.043 c