KeyDown事件中为何不能捕捉Tab事件?(20分)

  • 主题发起人 主题发起人 cowbird
  • 开始时间 开始时间
C

cowbird

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_tab then
showmessage('ok');
end;

Tab键值是9,但运行后不显示OK,为什么
 
你可以在KeyUP事件下.
 
to houanl:
keyup不行
tab键比较特殊,keyup可以激发,但是是从其他控件按Tab键移动到该edit上,才可以激发。
而不是在edit中按Tab键,才激发,为什么?

我的目的是,在Edit1中按tab键,可以执行showmessage(ok);
 
注意,虽然那些控件可能截获不到,但是你的窗口一定可以!

procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.OnMessage := ApplicationMessage;
end;

procedure TMainForm.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.message = wm_KeyDown) and (Msg.wParam = VK_TAB) then
begin // 被窗口截获到 VK_TAB
Handled := True;
ActiveControl.Perform(wm_KeyDown, VK_TAB, 0); // 发回给当前有焦点的控件
end;
end;

现在你的控件都可以截获到(准确的说是收到) VK_TAB 了。
 
beta的方法应该可以
 
if (Msg.message = wm_KeyDown) and (Msg.wParam = VK_TAB) then
begin // 被窗口截获到 VK_TAB
Handled := True; //<1>
ActiveControl.Perform(wm_KeyDown, VK_TAB, 0); //<2>
end;
能不能解释一下<1><2>,我不理解,麻烦告诉我一下。
handled:=true就是让OnMessage阻止消息传递么?
那ActiveControl.Perform是啥意思?如果我要在Edit1处,按TAB键等于按A键,怎么写?
谢谢
 
好象问题没有了结:(
 
查查帮助文件不就全有了
 
问题等待中。。。
 
在基类里面!!
最好不要想法设法弄那些!
好象很麻烦的士
 
在窗口里捕捉键盘事件,上面有了,然后把键值改了,
察看当前活动的组件,如果是edit1,那么,给edit1法个keyPress消息,
 
TForm1的属性keypreview设置为true
 
可能是窗口过程wndpro过程截获键盘消息后,没有进行派发!你可以截获窗口消息或给窗口子类化
 
能够显示ok呀,你可能是edit1没有setfocus吧,把所有的控键去掉,只留一个edit能够
显示的
 
试试把TabStop设为False看看!
 
后退
顶部