如何响应bcb的onkeydown事件
我想在一个edit控件中按下回车,焦点就会跳到下一个edit控件,请问要怎么才能实现,就像vb中的sendkeys一样的效果
[解决办法]
TEdit->OnKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
if( Key == 0x0D )
{
Edit2->SetFocus();
}
[解决办法]
//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;
[解决办法]
//当你在 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事件函数中添加以下代码即可:
//---------------------------------------__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();
}