左右比较麻烦. 首先得记录当前光标位置, 然后执行按键, 然后再判断当前光标位置,
如果和按键前相同表示光标处于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的话别忘记要自己处理选中文本操作.