我的 Delphi 应用程序包含一个帮助文件,用户可以从应用程序中的任何位置调用该文件(嗯......也就是说,对于我迄今为止编写的所有部分......)
它还包括用户从列表中从常规样式切换到另一种 VCL 样式的功能。
当没有应用样式时,帮助文件正常显示如下:
但是一旦 VCL 样式处于事件状态,帮助文件就不再正确显示,如下所示:
这是由于我在主表单创建时声明 HelpFile 的方式所致(路径是指向主 exe 文件夹的全局变量):
Application.HelpFile := path+'Help\D.R.A.M.A. 2.0 Help.chm';
或者这是一个无法解决的已知问题?
旁注:如果需要重点提及,则在 helpContext 上调用帮助,并将 HtmlHelpViewer 添加到 use 子句中。
最佳答案
此答案取自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 子句中。
关于delphi - 当 Delphi VCL 样式处于事件状态时,CHM 文件无法正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44378837/