首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从主窗体(也使用OnKeyDown)调用的OnKeyDown不工作对话框

从主窗体(也使用OnKeyDown)调用的OnKeyDown不工作对话框
EN

Stack Overflow用户
提问于 2013-03-04 01:44:54
回答 1查看 1.7K关注 0票数 2

Delphi 2010

我在主窗体上使用OnFormKeyDown事件,基本上在对话框中使用相同的事件

//main窗体

代码语言:javascript
代码运行次数:0
运行
复制
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   case Key of
      VK_DOWN: btnLast.OnClick(Self);
      VK_Up:  btnFirst.OnClick(Self);
      VK_Left:  btnPrev.OnClick(Self);
      VK_Right:  btnNext.OnClick(Self);
    end;
end;

procedure TfrmMain.mniShowOwnedClick(Sender: TObject);
var
 I: Integer;
begin
 frmMain.KeyPreview:= False;
 frmOwned.KeyPreview:= True;
 frmOwned.Owned2.Clear;
 for I := 0 to Tags.Count - 1 do
  if Owned.IndexOf(Tags.Names[I]) <> -1 then
     frmOwned.Owned2.Add(Tags[I]);
 if frmOwned.ShowModal = mrOK then
 begin
  frmMain.KeyPreview:= True;
  frmOwned.KeyPreview:= False;
 end;
end;

//对话框

代码语言:javascript
代码运行次数:0
运行
复制
procedure TfrmOwned.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   case Key of
      VK_DOWN: btnLast.OnClick(Self);
      VK_Up:  btnFirst.OnClick(Self);
      VK_Left:  btnPrev.OnClick(Self);
      VK_Right:  btnNext.OnClick(Self);
    end;
end;

窗体的OnKeyDown运行良好,但我似乎无法使对话框正常工作

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-04 03:15:42

问题是这些键被用作对话框导航键。因此,他们永远不会去参加OnKeyDown活动。

老实说,我很难理解他们为什么要为你的主窗体的OnKeyDown事件而触发。我无法在我的测试环境中做到这一点。这是因为我在表单中添加了一个按钮。这足以意味着箭头键被视为导航键。尝试使用单个表单创建一个应用程序并添加几个按钮。然后运行应用程序,并使用箭头键在按钮之间移动焦点。这就是我所说的箭头键被视为导航键的意思。

我希望您的两个窗体之间的区别是,主窗体没有可以通过箭头键导航的东西,而模式窗体有。

现在,您可以停止将箭头键视为导航键。如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
type
  TMyForm = class(TForm)
  ....
  protected
    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
  ....
  end;
....
procedure TMyForm.CMDialogKey(var Message: TCMDialogKey);
begin
  case Message.CharCode of
  VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN:
    Message.Result := 0;
  else
    inherited;
  end;
end;

然而,在我看来,更好的解决方案是停止尝试使用OnKeyDown事件实现快捷方式。这似乎是一个错误的解决方案。正确的解决方案是使用操作。创建操作列表。为第一个、最后一个、上一个和下一个操作添加操作。为它们提供适当的ShortCut属性。将这些操作分配给您的按钮。工作就完成了。

这样做的好处之一是,您可以停止尝试伪造按钮单击事件。无论如何,调用OnClick是一种错误的方式。如果确实需要的话,可以调用按钮的Click方法。然而,使用一个动作,它就会被处理好。

另一个好处是,您将不再需要使用KeyPreview。简单地说,如果你想实现捷径,就使用TAction.ShortCut

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15188636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档