我的Delphi应用程序包含一个帮助文件,用户可以从应用程序的任何地方调用该文件(好吧......就是我迄今为止所写的所有部分......)
它还包括用户从列表中从常规样式切换到另一种VCL样式的功能。
如果没有应用样式,帮助文件通常会显示如下:
但是只要VCL样式处于活动状态,帮助文件就不再正确显示,如下所示:
这是由于我在主窗体创建时声明HelpFile的方式(路径是指向主exe文件夹的全局变量):
Application.HelpFile := path+'Help\D.R.A.M.A. 2.0 Help.chm';
或者这是一个无法解决的已知问题?
SIDE注意:在helpContext上调用帮助应该很重要,并且HtmlHelpViewer被添加到uses子句中。
答案 0 :(得分:1)
此答案摘自https://forums.embarcadero.com/thread.jspa?threadID=227785,我已经证实效果很好。
将 TApplicationEvents 组件拖放到应用程序主窗体上。
按如下方式实施该组件的 OnHelp 事件:
function TfmMain.ApplicationEvents1Help(Command: Word; Data: NativeInt; var CallHelp: Boolean): Boolean;
begin
CloseHelpWnd;
Result := ShellExecute(0,'open','hh.exe',
PWideChar('-mapid '+IntToStr(Data)
+' ms-its:'+Application.HelpFile),
nil,SW_SHOW) = 32;
CallHelp := false;
end;
在主窗体上,按以下方式实现CloseHelpWnd方法:
procedure TfmMain.CloseHelpWnd;
var
HlpWind: HWND;
const
HelpTitle = 'Your help file title';
begin
HlpWind := FindWindow('HH Parent',HelpTitle);
if HlpWind <> 0 then PostMessage(HlpWind,WM_Close,0,0);
end;
您将“ 您的帮助文件标题”替换为帮助文件的标题。直接打开帮助文件时,这是窗口标题。
在主表单的 FormDestroy 事件中,包含对
的调用CloseHelpWnd;
到目前为止,上述方法尚未发现任何问题,并且由于我们在单独的进程中运行帮助文件,因此不受Delphi 10.2 Tokyo中明显的VCL样式问题的影响。
注意:它不一定是应用程序的主表单,但必须是在需要帮助系统之前创建的表单,并在应用程序运行时保持实例化。在我们的案例中,我们是在公共资源表单上完成的,然后使用新表单重建的所有程序都解决了帮助问题。
注意:您仍然需要正常设置 Application.HelpFile 属性,但是不需要包含 HtmlHelpViewer 单元在 Uses 子句中。