Вниз
Скачать: CL | DM;

Dialog+WM_KEYDOWN   Найти похожие ветки 

← →
i-s-v ©   (2005-08-18 02:14) [0]

Есть окно диалога, созданного ф-цией DialogBoxParam. Как перехватить сообщение WM_KEYDOWN для контрола на этом диалоге (например, для EDIT"a)?


← →
Leonid Troyanovsky ©   (2005-08-18 08:47) [1]


> i-s-v ©   (18.08.05 02:14)  
> Есть окно диалога, созданного ф-цией DialogBoxParam. Как
> перехватить сообщение WM_KEYDOWN для контрола на этом диалоге
> (например, для EDIT"a)?


Сабкласcировать окно оного EDIT.
{RTFM: Subclassing a Window}.

--
Regards, LVT.


← →
alpet ©   (2005-08-18 09:14) [2]

Или вписать обработку сообщения в цикл сообщений, хотя это нестандартно.
Код выглядит примерно так:

while (IsWindow (hDlg) and GetMessage (Msg, 0, 0, 0) ) do
begin
 if (Msg.Message = WM_KEYDOWN) and (Msg.hWnd = hEdit1) then  
     OnKeyDown_edit;
 TranslateMessage (Msg);
 DispatchMessage (Msg);
end;


А чем не подходит обработка EN_CHANGE?


← →
Игорь Шевченко ©   (2005-08-18 11:42) [3]

Leonid Troyanovsky ©   (18.08.05 08:47) [1]

Еще только видя заголовок и начало первого поста в ветке, у меня уже сложился ответ. Слово в слово с постом [1] :)


← →
Leonid Troyanovsky ©   (2005-08-18 13:42) [4]


> Игорь Шевченко ©   (18.08.05 11:42) [3]

> Еще только видя заголовок и начало первого поста в ветке,
> у меня уже сложился ответ. Слово в слово с постом [1] :)


Повторение - мать учения, и бабушка скуки :)

--
Regards, LVT.


← →
i-s-v ©   (2005-08-20 00:57) [5]

Thanks!

А чем не подходит обработка EN_CHANGE?
Нужно отловить нажатие клавиш Enter, Up, Down...


← →
Вжжжик   (2005-08-22 02:22) [6]

Игорь Шевченко ©   (18.08.05 11:42) [3]

>> Еще только видя заголовок и начало первого поста в ветке, у
>> меня уже сложился ответ. Слово в слово с постом [1] :)

неправильный у Вас сложился ответ.


type
 TForm1 = class(TForm)
   Edit1: TEdit;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   OldOnMsg : TMessageEvent;
   procedure OnMessage(var Msg: TMsg; var Handled: Boolean);
 end;

procedure TForm1.OnMessage(var Msg: TMsg; var Handled: Boolean);
begin
 if ((Msg.hwnd = Edit1.Handle) and (Msg.message = WM_KEYDOWN)) then
   begin
     // здесь делаете обработку WM_KEYDOWN для Вашего Edit1
   end;

 // как правило Application.OnMessage не определён по-умолчанию,
 // но всё же...
 if Assigned(OldOnMsg) then
   OldOnMsg(Msg, Handled);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 OldOnMsg:=Application.OnMessage;
 Application.OnMessage:=OnMessage;
end;



← →
Вжжжик   (2005-08-22 02:28) [7]

Не заметил что речь о диалоге. В этом случае решение
 
 alpet ©   (18.08.05 09:14) [2]
 
предпочтительнее. оно в сущности отличается только по форме от установки Application.OnMessage.


← →
Leonid Troyanovsky ©   (2005-08-22 08:44) [8]


> Вжжжик   (22.08.05 02:28) [7]
> Не заметил что речь о диалоге. В этом случае решение
>  
>  alpet ©   (18.08.05 09:14) [2]
>  
> предпочтительнее. оно в сущности отличается только по форме
> от установки Application.OnMessage.


В сущности EN_CHANGE отличается от WM_KEYDOWN.

--
Regards, LVT.


← →
Вжжжик   (2005-08-22 10:34) [9]

а причем тут EN_CHANGE? я про него ни словом не обмолвился..


← →
Игорь Шевченко ©   (2005-08-22 10:38) [10]

Вжжжик   (22.08.05 02:22) [6]


> неправильный у Вас сложился ответ.


Долго и утомительно читаем самый первый пост:


> Есть окно диалога, созданного ф-цией DialogBoxParam


Отвечаем себе, как же нам перехватить сообщение, посланное edit-контролу в диалоговом окне, где нету никаких TForm, TApplication и даже TEdit ?

Роясь в памяти, вспоминаем дедушку Windows-программирования Чарльза Петцольда и видим, что наилучшим способом является сабклассинг :)

Удачи!


← →
Leonid Troyanovsky ©   (2005-08-22 11:05) [11]


> Вжжжик   (22.08.05 10:34) [9]
> а причем тут EN_CHANGE? я про него ни словом не обмолвился..


А откуда я знаю кто о чем обмолвился.
Если речь про нестандартное, то оно уж очень нестандартное,
тем более, что такой цикл для диалогов неверен.

--
Regards, LVT.



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.025 c
4-1124436472
Stanislav
2005-08-19 11:27
2005.10.23
Отключение компа от сети


14-1127997108
oldman
2005-09-29 16:31
2005.10.23
Я таки победил 1C!!!


3-1126609473
Term
2005-09-13 15:04
2005.10.23
Update в FB 1.5


14-1128154494
Andy BitOff
2005-10-01 12:14
2005.10.23
Порты 1010-1013


2-1127995705
Гость22
2005-09-29 16:08
2005.10.23
Как узнать, что пользователь закрыл модально открытую форму?




   Наверх