如何通过程序控制上.下.左.右四个键盘按键控制焦点在Edit框中移动(100分)

  • 主题发起人 主题发起人 张利中
  • 开始时间 开始时间

张利中

Unregistered / Unconfirmed
GUEST, unregistred user!
如果有两个Edit控件放在同一张表单上,如何利用键盘上的上.下.左,右键
控制焦点(光标)上下或左右移动(用程序实现)
在Edit的那一个事件里写程序?
 
form.keypreview:=true
然后在form的keypress中判断
 
不好意思,上下得用keydown 写下来吧

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_up then
Edit1.SetFocus
else
Edit2.SetFocus;
end;
 
左右比较麻烦. 首先得记录当前光标位置, 然后执行按键, 然后再判断当前光标位置,
如果和按键前相同表示光标处于edit的开始或者结尾位置, 此时则相应跳转到其它控
件上.
如果不是自己做控件的话则比较麻烦, 关键是截取Key消息后要让edit先执行这个
Key, 待完成后再继续.
可以用Application.OnMessage, 大致例子如下:

const
SM_CONTINUEPROCESSLEFT = WM_USER + 1;
SM_CONTINUEPROCESSRIGHT = WM_USER + 2;

procedure TForm1.CheckKeyMessage(var Msg: TMsg; var Handled: Boolean);
const
PrevPos: Integer;
var
ed: TEdit;
fm: TCustomForm;
begin
with Msg do
if FindControl(Hwnd) is TEdit then
begin
ed := TEdit(FindControl(Hwnd));
case Message of
WM_KEYDOWN:
if WParam in [VK_LEFT, VK_RIGHT] then
begin
PrevPos := ed.SelStart;
// 发送自定义消息, 因为是PostMessage, 所以该消息将在当前消息执行完后再出现
if WParam = VK_LEFT
PostMessage(Hwnd, SM_CONTINUEPROCESSLEFT, Hwnd, 0)
else
PostMessage(Hwnd, SM_CONTINUEPROCESSRIGHT, Hwnd, 0);
end;
SM_CONTINUEPROCESSLEFT, SM_CONTINUEPROCESSRIGHT: // 接受到该消息说明上一次按了Left/Right键
if (WParam = Hwnd) and (PrevPos = ed.SelStart)
and (ed.SelLength = 0) // 不是在Select状态并且光标处于edit的两端, 需要移动到其他控件
then begin
fm := GetParentForm(ed);
if Message = SM_CONTINUEPROCESSLEFT then
PostMessage(fm.Handle, WM_NEXTDLGCTL, 0, 1) // 移到前一个控件
else
PostMessage(fm.Handle, WM_NEXTDLGCTL, 0, 0); // 移到后一个控件
end;
end;
end;
end;
当然也可以自己处理Left, Right按键, 这样只要写一个OnKeyDown就可以了. 不过处理
时要记得判断用户按的只是Left, Right键还是组合键(Shift-Left, Shift-Right), 如果是
Shift-left/Shift-Right的话别忘记要自己处理选中文本操作.
 
建议不要用Left和Right两个键,因为在Delphi中实现这两个键的控制很复杂,(它一般用
于在一个TEdit中内部移动)
而上下键是可以利用的。
首先保证Form的KeyPreview为True.
然后在Form的OnKeyDown事件中这样写:
if Key = VK_UP then
begin
PostMessage(fm.Handle, WM_NEXTDLGCTL, 0, 1)
end
else if Key = VK_DOWN then
begin
PostMessage(fm.Handle, WM_NEXTDLGCTL, 0, 0);
end;
 
好,厉害!可以结束了!给我一点分吧
 
看来用不着我了!
 
谢谢大家的帮助,凡参与者均赠分感谢!
 

Similar threads

D
回复
0
查看
825
DelphiTeacher的专栏
D
D
回复
0
查看
831
DelphiTeacher的专栏
D
D
回复
0
查看
664
DelphiTeacher的专栏
D
后退
顶部