加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

窗口 – Delphi XE和陷阱箭头键与OnKeyDown

发布时间:2020-12-15 04:26:41 所属栏目:大数据 来源:网络整理
导读:我想要我的窗体处理箭头键,我可以做 – 只要表单上没有按钮.为什么是这样? 解决方法 主要消息由收到这些消息的控件本身处理,这就是为什么当您在表单上没有收到消息的按钮时.所以通常你必须对这些控件进行子类化,但是,如果表单感兴趣,则VCL很适合请求父母表
我想要我的窗体处理箭头键,我可以做 – 只要表单上没有按钮.为什么是这样?

解决方法

主要消息由收到这些消息的控件本身处理,这就是为什么当您在表单上没有收到消息的按钮时.所以通常你必须对这些控件进行子类化,但是,如果表单感兴趣,则VCL很适合请求父母表单做什么:
type
  TForm1 = class(TForm)
    ..
  private
    procedure DialogKey(var Msg: TWMKey); message CM_DIALOGKEY;
    ..


procedure TForm1.DialogKey(var Msg: TWMKey); 
begin
  if not (Msg.CharCode in [VK_DOWN,VK_UP,VK_RIGHT,VK_LEFT]) then
    inherited;
end;

Fran?ois编辑:要回答OP原始问题,您需要以某种方式调用KeyDown,以便他的事件代码可以工作(可以自由编辑;对于注释来说太长了).

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
    procedure DialogKey(var Msg: TWMKey); message CM_DIALOGKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DialogKey(var Msg: TWMKey);
begin
  case Msg.CharCode of
    VK_DOWN,VK_LEFT:
      if Assigned(onKeyDown) then
        onKeyDown(Self,Msg.CharCode,KeyDataToShiftState(Msg.KeyData));
    else
      inherited
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_DOWN: Top := Top + 5;
    VK_UP: Top := Top - 5;
    VK_LEFT: Left := Left - 5;
    VK_RIGHT: Left := Left + 5;
  end;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读