当Delphi VCL样式处于活动状态时,CHM文件无法正确显示

时间:2017-06-05 22:46:37

标签: delphi chm vcl-styles

我的Delphi应用程序包含一个帮助文件,用户可以从应用程序的任何地方调用该文件(好吧......就是我迄今为止所写的所有部分......)

它还包括用户从列表中从常规样式切换到另一种VCL样式的功能。

如果没有应用样式,帮助文件通常会显示如下:

Help file readable

但是只要VCL样式处于活动状态,帮助文件就不再正确显示,如下所示:

help file messed-up by the VCL

这是由于我在主窗体创建时声明HelpFile的方式(路径是指向主exe文件夹的全局变量):

Application.HelpFile := path+'Help\D.R.A.M.A. 2.0 Help.chm';

或者这是一个无法解决的已知问题?

SIDE注意:在helpContext上调用帮助应该很重要,并且HtmlHelpViewer被添加到uses子句中。

1 个答案:

答案 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 子句中。