Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi Mdi应用程序的父窗口中使用KeyDown事件_Delphi_Mdi_Keypress - Fatal编程技术网

在Delphi Mdi应用程序的父窗口中使用KeyDown事件

在Delphi Mdi应用程序的父窗口中使用KeyDown事件,delphi,mdi,keypress,Delphi,Mdi,Keypress,如何使KeyDown事件在Delphi 2007 MDI应用程序父窗口中工作,即使子窗口具有焦点 我想实现一个快捷键F1,在MDI应用程序中显示帮助屏幕。我已将向下键过程添加到MDI父窗口,并在父窗口和子窗口中启用了KeyPreview,但它无法按预期工作 如果我在Parents KeyDown代码中设置一个断点,我可以看到它从未执行过,即使它没有打开子窗口。但是,如果我向子窗口添加相同的代码,它就可以正常工作 有没有办法让父窗口接收按键,即使子窗口有焦点,因为将代码添加到25+窗体接缝有点浪费

如何使KeyDown事件在Delphi 2007 MDI应用程序父窗口中工作,即使子窗口具有焦点

我想实现一个快捷键F1,在MDI应用程序中显示帮助屏幕。我已将向下键过程添加到MDI父窗口,并在父窗口和子窗口中启用了KeyPreview,但它无法按预期工作

如果我在Parents KeyDown代码中设置一个断点,我可以看到它从未执行过,即使它没有打开子窗口。但是,如果我向子窗口添加相同的代码,它就可以正常工作


有没有办法让父窗口接收按键,即使子窗口有焦点,因为将代码添加到25+窗体接缝有点浪费?

您可以使用本地全局按钮,这是不需要的。您还可以从单表单基类派生所有MDI子表单,并在那里实现一次。您会发现,这种设计对于解决其他问题也很方便

编辑

应用程序范围的热键/快捷键也可以通过TApplication.OnShortCut事件实现。看


F1已经是触发TApplication.OnHelp的标准帮助快捷方式。那么也许你想使用OnHelp事件?如果您使用HelpFile、HelpContext、HelpType和HelpKeyword属性,您可能根本不需要实现任何代码。

您可以使用本地全局属性,而不需要。您还可以从单表单基类派生所有MDI子表单,并在那里实现一次。您会发现,这种设计对于解决其他问题也很方便

编辑

应用程序范围的热键/快捷键也可以通过TApplication.OnShortCut事件实现。看


F1已经是触发TApplication.OnHelp的标准帮助快捷方式。那么也许你想使用OnHelp事件?如果您使用HelpFile、HelpContext、HelpType和HelpKeyword属性,您可能根本不需要实现任何代码。

F1帮助处理内置于Delphi中,因此您所要做的就是正确处理帮助消息。这可能只是设置应用程序的helpfile属性。您可以使用表单的帮助设置特定页面???财产


基本上,只需使用提供的帮助系统,忘记按键。这是Delphi-您不必努力工作。

F1帮助处理内置于Delphi中,因此您所要做的就是正确处理帮助消息。这可能只是设置应用程序的helpfile属性。您可以使用表单的帮助设置特定页面???财产


基本上,只需使用提供的帮助系统,忘记按键。这是德尔福-你不必努力工作。

本周我遇到了完全相同的问题!我通过在主窗体上的ActionManager中创建一个操作修复了它。此操作将打开帮助文件并将F1键设置为快捷方式。它也适用于所有MDI子屏幕。

本周我遇到了完全相同的问题!我通过在主窗体上的ActionManager中创建一个操作修复了它。此操作将打开帮助文件并将F1键设置为快捷方式。它也适用于所有MDI子屏幕

如何使KeyDown事件在Delphi 2007 MDI应用程序父窗口中工作,即使子窗口具有焦点

作为F1以外的应用程序的更通用的解决方案,我使用类似于此的代码在主窗体中捕获keydown事件。无论发生什么情况,这都会获取所有密钥,即使MDI子级处于活动状态。在本例中,我所做的与您试图做的相反,我希望消息由我的子窗体而不是主窗体处理,但是捕获父窗体中的键的概念是相同的

Application.OnMessage := AppMessage;

procedure TMainForm.Appmessage(var Msg: TMsg; var Handled: Boolean);
var
  message: TWMKey;
begin
  If (msg.message = WM_KEYDOWN) and
     ( LoWord(msg.wparam) = VK_TAB ) and
     (GetKeyState( VK_CONTROL ) < 0 ) and
     Assigned( ActiveMDIChild ) then
  Begin
    Move( msg.message, message.msg, 3*sizeof(Cardinal));
    message.result := 0;
    Handled := ActiveMDIChild.IsShortcut( message );
  End;
end;
如何使KeyDown事件在Delphi 2007 MDI应用程序父窗口中工作,即使子窗口具有焦点

作为F1以外的应用程序的更通用的解决方案,我使用类似于此的代码在主窗体中捕获keydown事件。无论发生什么情况,这都会获取所有密钥,即使MDI子级处于活动状态。在本例中,我所做的与您试图做的相反,我希望消息由我的子窗体而不是主窗体处理,但是捕获父窗体中的键的概念是相同的

Application.OnMessage := AppMessage;

procedure TMainForm.Appmessage(var Msg: TMsg; var Handled: Boolean);
var
  message: TWMKey;
begin
  If (msg.message = WM_KEYDOWN) and
     ( LoWord(msg.wparam) = VK_TAB ) and
     (GetKeyState( VK_CONTROL ) < 0 ) and
     Assigned( ActiveMDIChild ) then
  Begin
    Move( msg.message, message.msg, 3*sizeof(Cardinal));
    message.result := 0;
    Handled := ActiveMDIChild.IsShortcut( message );
  End;
end;

很好的建议。我一直为MDI儿童使用基类。这样做感觉很对。很好的建议。我一直为MDI儿童使用基类。我觉得这样做是对的。这肯定会奏效;此外,无论如何,使用战术专家或战术管理者来做这类事情是正确的方法!你知道这是怎么回事吗?TAction是否实现了本地键盘挂钩?这肯定会起作用;此外,无论如何,使用战术专家或战术管理者来做这类事情是正确的方法!你知道这是怎么回事吗?TAction是否实现本地键盘挂钩?