【问题标题】:TButton + VK_ReturnTButton + VK_Return
【发布时间】:2012-11-26 15:14:42
【问题描述】:

在这里,我复制了我遇到过几次的情况。我有两种形式。表格 1 和表格 2。 Form1 有一个编辑字段并连接了 OnKeyup 事件。 Form2 只有一个按钮,并且连接了 OnClick。当 Form1 用户在 TEdit 类型的字段中按 VK_Retrun 时,Form2.Show 被执行。 Form2 显示在按钮上。 OnClick 事件与内部的代码“关闭”相关联。如果用户按下键盘上的 VK_RETURN 键,Form2 会按预期关闭。但问题来了,Form2 再次被直接触发。似乎当 Form1 获得焦点时,密钥仍在“队列”中,并且编辑字段将继续使用 VK_RETURN。

以下是这种情况的完整列表:

    unit UTestButton;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        procedure Edit1KeyUp(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    uses UTestButton2;

    {$R *.dfm}

    procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (Key = VK_Return) THEN
        Form2.Show;
    end;

    end.

这是第二个单元。

    unit UTestButton2;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form2: TForm2;

    implementation

    {$R *.dfm}

    procedure TForm2.Button1Click(Sender: TObject);
    begin
      Close;
    end;

    end.

在实践中,我有时会使用带有标签或信息的简单表单,但只有一两个按钮,并专注于按钮。用户可以按预期按键盘上的键。如果他使用 vk_return 并且底层控件使用密钥,我必须做一些解决方法来清除缓冲区的密钥,就像使用

    PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);

这对我来说并不完全令人满意。有没有人解决这种情况?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    为您的初始编辑框处理OnKeyDown 事件而不是OnKeyUp

    procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (Key = VK_RETURN) then
        Form2.Show;
    end;
    

    【讨论】:

    • 不客气!而且,你不需要。为了防止在ENTER 按键时编辑控件发出哔哔声,您可以使用例如if (Key = #13) then Key := #0; 在您编辑的 OnKeyPress 事件处理程序中。
    猜你喜欢
    • 2014-08-08
    • 2011-06-17
    • 1970-01-01
    • 2017-08-05
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    相关资源
    最近更新 更多