已经测试通过!
你可以在FORM或者控件的Keydown事件里写下如下的代码。
(这里的例子是在一个Memo的控件里按“上”键)
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if (key=38) then//如果按下的是“上”键
    begin  模拟shift+tab按键
        keybd_event( VK_shift, MapVirtualKey( VK_shift, 0 ), 0 , 0 );
    // 按下shift键
      
      keybd_event( VK_tab, MapVirtualKey( VK_tab, 0 ), 0 , 0 );
    // 按下tab键
 
    keybd_event( VK_tab, MapVirtualKey( vk_tab, 0 ), KEYEVENTF_KEYUP , 0 );
    //放开tab键
    keybd_event( VK_control, MapVirtualKey( vk_control, 0 ), KEYEVENTF_KEYUP , 0 );
    // 放开shift键end;
注意,如果触发的对象是Form的话,你可能要把Form的KeyPreview属性设置为True;
搞定了别忘记加分哦

解决方案 »

  1.   

        if key = vk_up then
        begin
        //if keyup ,focus move to prior field
           keybd_event(16,0,0,0); //按下SHIFT键
           keybd_event(9,0,0,0); //按下TAB
           keybd_event(9,0,0,0); //按下TAB
           keybd_event(16,0,2,0); //放开SHIFT键
        end;
      

  2.   

    若要按照Tab Order 的次序,移动到上一个焦点或者下一个焦点,
    参考一下函数:bl -  True 移动到TabOrder的下一个‘
       -  False 上一个procedure mscNextCtl( ctl: TWinControl; bl: Boolean );
    var
       frm: TCustomForm;
    begin
       frm := GetParentForm( ctl );
       if Frm = nil then
         Exit;
       case bl of
          False:
             begin
                //TWinControl( ctl ).SelectNext( ctl, True, True );
                PostMessage( frm.Handle, WM_NEXTDLGCTL, 1, 0 );
             end;
          True:
             begin
                //ctl.SelectNext( ctl, False, True );
                PostMessage( frm.Handle, WM_NEXTDLGCTL, 0, 0 );
             end;
       end;
    end;