小弟刚接触delphi,在登陆窗口上放了一个combox控件,一个Edit控件,还有两个button,其tab值依次为0,1.2,3.
我使用如下代码来实现回车键代替tab键:
//
if Key = #13 then { 如果按下了回车键 }
     begin
       Key := #0; { 吃掉回车键 }
       frm.Perform(WM_NEXTDLGCTL, 0, 0); { 移动到下一个控制 }
     end; 
//
但是在执行过程中,焦点不从combox控件转移到Edit控件,而直接执行确定按钮。用tab键确是正常的。
上述原因不知何故,望多多指教和明示。谢谢!

解决方案 »

  1.   

    WM_KEYDOWN:
       switch(wParam)
       {
       case VK_RETURN:
          SendMessage( hwnd, WM_KEYDOWN, VK_TAB, 0 );
          return 0;
       }
      

  2.   

    设置窗体的KeyPreview属性为True;
    试试。
      

  3.   

    我也是有这个问题,我也用上面的语句,为什么跳到button就不能用回车的呢?
      

  4.   

    已经设置窗体的KeyPreview属性为True;不行呀!
      

  5.   

    在窗体上放两个控件,Edit1和Edit2,再加入下列代码拦截击键:Procedure TForm1.Edit1KeyPress(Sender:Tobject;Var Key:Char);
    Begin
    if key=#13 then { 判断是按执行键}
    if not (ActiveControl is TDbgrid) Then
    Begin { 不是在TDbgrid控件内}
    key:=#0;
    perform(WM_NEXTDLGCTL,0,0);{移动到下一个控件}
    end else
    if (ActiveControl is TDbgrid) Then{是在 TDbgrid 控件内}
    begin
    With TDbgrid(ActiveControl) Do
    if Selectedindex<(FieldCount-1) then
    Selectedindex:=Selectedindex+1{ 移动到下一字段}
    else Selectedindex:=0;
    end;
    End; 
      

  6.   

    To:kelamayi
     
    设置窗体的KeyPreview属性为True;
    用tab order 设置次序,不必设置tab 值
      

  7.   

    你上面的用法是对的。回车在Button上相当于单击事件,是不会触发Keypress事件的。如果要实现这种功能的话你必须自己继承TButton新建一个控件,然后覆盖
    自己处理CM_DIALOGKEY事件。
    如下面的代码:
    unit MyButton;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TMyButton = class(TButton)
      private
        { Private declarations }
      protected
        { Protected declarations }
      procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
      public
        { Public declarations }
      published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('EShell', [TMyButton]);
    end;{ TMyButton }procedure TMyButton.CMDialogKey(var Message: TCMDialogKey);
    begin
       if message.CharCode = vk_return then
          message.CharCode := vk_return;
    end;end.
      

  8.   

    procedure TMyButton.CMDialogKey(var Message: TCMDialogKey);
    begin
      //可以适当写代码。也可以不写。
    end;