首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

怎么响应bcb的onkeydown事件

2012-03-06 
如何响应bcb的onkeydown事件我想在一个edit控件中按下回车,焦点就会跳到下一个edit控件,请问要怎么才能实

如何响应bcb的onkeydown事件
我想在一个edit控件中按下回车,焦点就会跳到下一个edit控件,请问要怎么才能实现,就像vb中的sendkeys一样的效果

[解决办法]
TEdit->OnKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);


if( Key == 0x0D )
{
Edit2->SetFocus();
}
[解决办法]

Delphi(Pascal) code
//Delphi的例子procedure   TForm1.Edit1KeyPress(Sender:   TObject;   var   Key:   Char);   begin     case   Ord(Key)   of     vk_return:     begin       key:=#0;       selectnext(activecontrol,true,true);     end;     end;   end;
[解决办法]
C/C++ code
//当你在 Edit 控件中,按下回车时,用 keybd_event 函数,模拟向键盘输入一个 “Tab”,那么,焦点就会移动到下一个“可以设置焦点的控件”了。。。void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,      TShiftState Shift){    if ( Key==0x0D )    {        keybd_event(VK_TAB,0,0,0);    }}
[解决办法]
//当你在 Edit 控件中,按下回车时,用 keybd_event 函数,模拟向键盘输入一个 “Tab”,那么,焦点就会移动到下一个“可以设置焦点的控件”了。。。
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if ( Key==0x0D )
{
keybd_event(VK_TAB,0,0,0);
}
}
这个方法可以
为什么不直接用TAB ?
[解决办法]
为什么不直接用TAB ?

呵呵,这种情况我碰到过,比如,现在设计一个录入项目比较多的界面(好比什么工商管理的注册啦。等等。。)
那么,要录入的项目比较多,有的可能会达到20多个,也就是说,有20多个EDIT,用户每输入完一个之后,要在下一个EDIT输入内容,那么他们一般会选择两种方法,一是用鼠标去点击下一个EDIT,二是敲“回车”(注意,敲“回车”是绝大多数普通用户都有的习惯),很显然,用鼠标去点选,很多人不喜欢,因为,有一只手要离开键盘,这样会浪费很多输入的时间,所以,很多“文员”就会选择,直接敲回车。。。。。

也许你会说,你告诉你的客户,叫他们按 TAB 。。。。这样,你就会省下一些功夫,不用写这些代码,但是,请不要忘记软件开发的最终目的:让客户按照他们的习惯去操作。。。。

至于为什么敲“回车”会成为大多数人的习惯。这个很好理解,我在打字的时候,就觉得敲“回车”比敲“TAB”要方便自然得多。。。。
[解决办法]
setfocus和key-event都可以
[解决办法]
不要把简单的问题复杂化。
设置好各个Edit的TabOrder,然后在Form的构造函数和OnKeyPress事件函数中添加以下代码即可:
C/C++ code
//---------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)    : TForm(Owner){    KeyPreview = true;}//---------------------------------------//void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key){    if (Key == VK_RETURN)    {        SendMessage(Handle, WM_NEXTDLGCTL, 0, 0);        Key = 0;    }}
[解决办法]
不过上面的代码有缺陷:当窗体上有一个Default=true的按钮时,代码会失效。
[解决办法]
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
if( Key == 0x0D )
{
Edit2->SetFocus();
}
}
[解决办法]
给你一个处理这种情况的标准做法:
1.把所有控件顺序排好,即把每个控件的TabOrder值按照你需要的顺序设置,这样光标就不会乱跳了^_^
2.顺便在某个控件的OnKeyDown事件函数(比如你可以起名为MyKeyDown)中加入以下内容
switch(Key)
{
case VK_RETURN: //回车到下一个控件
Perform(WM_NEXTDLGCTL,0,0);
break;
case VK_LEFT: //左边光标到上一个控件
//此处最好判断一下是不是到第一个控件了,如果是第一个控件就不要往上走了
Perform(WM_NEXTDLGCTL,1,0);
break;
case VK_ESCAPE:
//执行退出命令;
break;
}
3.把每个需要控制的控件的OnKeyDown事件关联上前面的事件函数(如MyKeyDown)

大功告成!


[解决办法]
建议用KeyPress事件


if (Key == 13) {
edt2->SetFocus();
}

热点排行