- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
德尔福2010
我在主窗体上使用 OnFormKeyDown 事件,并且基本上在对话框上使用相同的事件
//主窗体
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;
//对话框
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 工作正常,但我似乎无法让对话框工作
最佳答案
问题在于这些键被用作对话框导航键。因此,它们永远不会到达 OnKeyDown
事件。
说实话,我很难理解为什么他们会为您的主表单的 OnKeyDown
事件触发。我无法在我的测试环境中实现这一点。那是因为我在表单中添加了一个按钮。这足以意味着箭头键被视为导航键。尝试创建一个具有单一表单的应用程序并添加一些按钮。然后运行应用程序并使用箭头键在按钮之间移动焦点。这就是我说箭头键被视为导航键时的意思。
我认为两种表单之间的区别在于主表单没有任何可以通过箭头键导航的内容,但模态表单可以。
现在,您可以停止将箭头键视为导航键。像这样:
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
。
关于delphi - OnKeyDown 不适用于从主窗体调用的对话框(也使用 OnKeyDown),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15188636/
对于一个科学实验,我写了一个turtle.py ,它会打开一个 800x480 的窗口并绘制一个缓慢增长的黑点。 turtle.py以 C:\Users\kaza>python C:\Users\ka
我开发了一个 swing 应用程序,但每次运行应用程序时都会打开一个新窗口。我希望如果一个窗口已经打开,则其他窗口不允许打开。 最佳答案 Here是一个 Java 单一应用实例的例子: A singl
有没有办法检测主进程中 Electron 的结构? process.platform 似乎也在 x64 机器上返回 win32,我没有在文档中找到任何获取架构的选项。 最佳答案 你试过 process
public short[] HanningWindow(short[] signal_in ,int pos ,int size) { for (int i= pos; i < pos+si
我有一个具有这些属性的 Electron 窗口: mainWindow = new BrowserWindow({ width: 800, height: 600, title: "Aqu
我有一个 Ubuntu 工作站,我正在尝试引导一个 Windows 节点。 Windows 节点在端口 2222 上打开了 ssh。我一直在关注 http://docs.opscode.com/plu
我是一名优秀的程序员,十分优秀!