我想在memo中当敲了vk_down健并且在最后一行,下一个控件获得焦点
我的代码如下:
procedure TForm1.memoZSKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  row: Integer;
begin
  if Key=vk_down then
  begin
    row := SendMessage(TMemo(Sender).Handle,EM_LINEFROMCHAR,TMemo(Sender).selStart,0);
    if row=TMemo(Sender).Lines.Count then
    begin
      Perform(WM_NEXTDLGCTL,0,0); 
    end;
  end;
end;为什么我的程序不起作用,焦点并没有下移。请高手指点

解决方案 »

  1.   

    if row=TMemo(Sender).Lines.Count-1 then
        begin
          key:=0;
          Perform(WM_NextDlgctl,0,0);
        end;
      

  2.   

    回复:
       Randomize()的方法实现了,不知道为什么加一句 key := 0  就可以实现?谢谢!
    再问一个问题,我要向上获得焦点,该怎样写?
      

  3.   

    也可以用
    PostMessage(Handle,WM_KEYDOWN,VK_TAB,0);
    或者
    SelectNext(ActiveControl, True, True);来完成如果你不要key := 0
    则程序会执行你的按键事件如果是下移动,可以用
    Perform(WM_NextDlgctl,1,0);
      

  4.   

    给你个其他方法的例子,呵呵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;
      

  5.   

    问题已经解决,谢谢参与的朋友,特别感谢: Randomize()、 Kshape([伟大的大伟!]/一心考研中!)