Главная страница
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.05 c
3-1104996289
atruhin
2005-01-06 10:24
2005.02.06
Переход от IB 5.6 на FireBird 1.5


14-1105894420
BorisMor
2005-01-16 19:53
2005.02.06
Разряды для программистов


1-1105611402
JohnS
2005-01-13 13:16
2005.02.06
Красивый интерфейс


1-1106489448
Aleks
2005-01-23 17:10
2005.02.06
Долгое выполнение программы или разграничение процессов


1-1106402116
Islander
2005-01-22 16:55
2005.02.06
Как проверить, находится ли диск в режиме "Только чтение"?