在输入界面上,设计在Edit1中输入完毕后,按Enter键进行数据处理后转向下一个Edit2,可是在实际操作中可以通过按Tab键来改变焦点,怎样才能知道按的是Tab键,然后进行数据处理呢?

解决方案 »

  1.   

    可以在OnExit事件中写代码或在OnKeyDown中也可以,在OnKeyDown中有一个Key的参数,可以根据它的值判断
      

  2.   

    Tab键比较特殊,要另外处理,参看:
    http://community.csdn.net/Expert/topic/4831/4831029.xml?temp=.1340906
      

  3.   

    暴雨梨花汗,贴错了。
    http://community.csdn.net/Expert/topic/4690/4690153.xml?temp=2.714175E-02
      

  4.   

    看到了,谢谢!
    再弱弱地问一句,在哪里设置KeyPreview为True?
      

  5.   

    谢谢!
    改了后怎么在Edit1的OnKeyPress中这句  
    if key=VK_TAB then
    报错:Incompatible types
    什么意思?我是将procedure Proc(var Msg:TWMGetDlgCode);message WM_GETDLGCODE;放在文件头将
    procedure TForm1.Proc(var Msg: TWMGetDlgCode);
    begin
      inherited;
      Msg.Result:=Msg.Result or DLGC_WANTTAB;
    end;
    放在文件后面,应该是自定义一个名叫Proc的函数然后调用吧?错了吗?
      

  6.   

    放在Edit1的OnKeyDown事件里。VK_TAB是一个整型,在OnKeyDown里面Key是整型,在OnKeyPress里面Key是字符型,所以类型不匹配。
      

  7.   

    改了没有报错,但不能进行数据处理,好象没有调用到ONkeydown事件中的处理语句
      

  8.   

    会吗?那你用Additonal页的ApplicationEvents控件来试试。
      

  9.   

    procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
      if (Msg.hwnd=Edit1.Handle)and(Msg.message=WM_KEYDOWN)and(Msg.wParam=VK_TAB)
       then ShowMessage('Tab');
    end;
      

  10.   

    非常感谢!问题已经解决了,但感觉不太方便,要把每个输入项的处理都写入,有没有一个比较简便的方法,即是无论是按回车键还是Tab键都是调用同一个函数,而不需要重复地写入语句?
      

  11.   

    还有,在edit1中的onkeydown里面,“vk_return”可以知道是回车键进入处理,但“vk_tab”则没有确认,是不是tab键应该是其他的什么代码?
      

  12.   

    这个问题不能用tab order吗?onkeydown里面回车应该用key=#13吧
      

  13.   

    delphi里面不是有tab排序的,自己重新排列一下就可以了
      

  14.   

    liangqingzhi(老之) 老兄:
    如何才能实现下面的事件呢?运行后只能检测到enter键对tab键没有回应。procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    Begin
       if (key=VK_RETURN) or (key=VK_TAB) then
         begin
        
         .....     end;
    end;
      

  15.   

    用了ApplicationEvents控件就不需要在OnKeyDown事件里面写代码了,这样的效果:procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
      if (Msg.hwnd=Edit1.Handle)and(Msg.message=WM_KEYDOWN)and
      ((Msg.wParam=VK_TAB)  //按下TAB键
    or(Msg.wParam=VK_RETURN))  //按下回车键
       then
        begin
          //....
          //Handled:=True;
        end;
    end;
      

  16.   

    因为有好几个edit都有处理,如果将这些处理语句全部写入ApplicationEvents1Message中,感觉太多了,想在每个edit中写入.
      

  17.   

    其实也一样:Msg.hwnd=Edit1.Handle 就相当于处理Edit1的事件,Msg.hwnd=Edit2.Handle就处理Edit2的事件。如果每个Edit的OnKeyDown事件都写,岂不更麻烦?