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

Вниз

Как работает DefWindowProc?   Найти похожие ветки 

 
Bless ©   (2004-12-20 17:51) [0]

Почему код в Делфи

callWindowProc(DefWndProc, edit1.handle, 256, 40, 22020097);
//256 - WM_KEYDOWN

не приводит к возникновению события Edit1.OnKeyDown?


 
Игорь Шевченко ©   (2004-12-20 18:00) [1]

Edit1.Perform (нужное сообщение, нужные параметры) не поможет ?

С уважением,


 
Bless ©   (2004-12-20 20:22) [2]

Поможет, конечно. Но мне не надо. :)
Просто столкнулся с ситуацией, когда в отладке, нажав f7 на строчке
callWindowProc(DefWndProc, edit1.handle, 256, 40, 22020097); внутри  procedure TWinControl.DefaultHandler(var Message);
попал в procedure TWinControl.MainWndProc(var Message: TMessage);
из чего я сделал вывод, что DefWndProc сгенерировала непонятно с чего вдруг событие WM_KILLFOCUS(это для компонента TDBEditEh. Для стандартного TEdit или TDbEdit в аналогичной ситуации на той самой строчке отрабатывает как и ожидалось, без генерации всяких событий). А вызвав такую же строчку callWindowProc(DefWndProc, edit1.handle, 256, 40, 22020097); явно из программы (по таймеру, чтоб фокус не двигать), никакого события не получил. Вот сижу теперь и думаю, почему DefWndProc себя так загадочно ведет и от чего это зависит.


 
Bless ©   (2004-12-20 20:26) [3]

Bless [2]> Напутал с тегами.
Хотел так:

Поможет, конечно. Но мне не надо. :)
Просто столкнулся с ситуацией, когда в отладке, нажав f7 на строчке
callWindowProc(DefWndProc, edit1.handle, 256, 40, 22020097); внутри  procedure TWinControl.DefaultHandler(var Message);
попал в procedure TWinControl.MainWndProc(var Message: TMessage);
из чего я сделал вывод, что DefWndProc сгенерировала непонятно с чего вдруг событие WM_KILLFOCUS(это для компонента TDBEditEh. Для стандартного TEdit или TDbEdit в аналогичной ситуации на той самой строчке отрабатывает как и ожидалось, без генерации всяких событий). А вызвав такую же строчку callWindowProc(DefWndProc, edit1.handle, 256, 40, 22020097); явно из программы (по таймеру, чтоб фокус не двигать), никакого события не получил. Вот сижу теперь и думаю, почему DefWndProc себя так загадочно ведет и от чего это зависит.


 
Leonid Troyanovsky ©   (2004-12-20 21:09) [4]


> Просто столкнулся с ситуацией, когда в отладке, нажав f7
> на строчке
> callWindowProc(DefWndProc, edit1.handle, 256, 40, 22020097);
> внутри  procedure TWinControl.DefaultHandler(var Message);
> попал в procedure TWinControl.MainWndProc(var Message: TMessage);
> из чего я сделал вывод, что DefWndProc сгенерировала непонятно
> с чего вдруг событие WM_KILLFOCUS(это для компонента TDBEditEh.
> Для стандартного TEdit или TDbEdit в аналогичной ситуации
> на той самой строчке отрабатывает как и ожидалось, без генерации
> всяких событий). А вызвав такую же строчку callWindowProc(DefWndProc,
> edit1.handle, 256, 40, 22020097); явно из программы (по
> таймеру, чтоб фокус не двигать), никакого события не получил.
> Вот сижу теперь и думаю, почему DefWndProc себя так загадочно
> ведет и от чего это зависит.


DefWndProc, в данном случае, это процедура окна формы.
Если хотелось вызывать оконную процедуру EDIT, то получать
ее следует путем GetWindowLong(edit1.handle, GWL_WNDPROC).

Да и, вообще, что это за 256, 40, 22020097?
Пользуй константы, а то через пару недель забудешь что это.

--
С уважением, LVT.


 
Bless ©   (2004-12-21 09:26) [5]

Leonid Troyanovsky ©  (20.12.04 21:09) [4]>
>DefWndProc, в данном случае, это процедура окна формы.

А вот за это замечание спасибо! А то я хотел уже было опровергнуть, но на всякий случай решил проверить.
Оказалось, я упустил из виду, что procedure CreateParams  - виртуальная.

Просто я глянул, что в ТControl

FDefWndProc := WindowClass.lpfnWndProc;
...
procedure TWinControl.CreateParams(var Params: TCreateParams);
begin
...
 WindowClass.lpfnWndProc := @DefWindowProc;...
...
end;
...
function DefWindowProc; external user32 name "DefWindowProcA"


и ввел себя в заблуждение. Еще раз спасибо, теперь опять есть куда думать.



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

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

Наверх




Память: 0.48 MB
Время: 0.048 c
3-1104752478
|Denis|
2005-01-03 14:41
2005.02.06
Работа с Event-ами. Их перехват приложением.


1-1106399819
Islander
2005-01-22 16:16
2005.02.06
Как проиграть звук критической ошибки?


14-1106048822
Vasya.ru
2005-01-18 14:47
2005.02.06
коннектится все - время кто - то на 445 порт


1-1106093451
En0.t
2005-01-19 03:10
2005.02.06
Функции преобразования.


3-1104391722
atruhin
2004-12-30 10:28
2005.02.06
Перенос БД с Firebird 1.5 на Interbase 5.6