Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-1084782386
Goida
2004-05-17 12:26
2004.06.06
Где компоненты для работы с Sybase?


3-1084522145
evgen
2004-05-14 12:09
2004.06.06
Инстоляция.


1-1085138877
DIS
2004-05-21 15:27
2004.06.06
меню к MsAgent


14-1084564644
Piter
2004-05-14 23:57
2004.06.06
Работа с Word


3-1084723034
Oxer
2004-05-16 19:57
2004.06.06
Связи м/у таблмцами ("ручное" изменение значения ключа)