当Delphi VCL样式激活时,CHM文件显示不正确

4
我的 Delphi 应用程序包含一个帮助文件,用户可以从应用程序的任何地方调用它(也就是说,对我目前编写的所有部分都是如此)。
它还包括让用户从列表中切换到另一种 VCL 样式的功能。
当没有应用样式时,帮助文件会正常显示,如下所示:

Help file readable

但是一旦启用了VCL样式,帮助文件就不再正确显示,就像这样:

help file messed-up by the VCL

这是因为我在主窗体创建时声明HelpFile的方式如下(path是指向主exe文件夹的全局变量)吗?
Application.HelpFile := path+'Help\D.R.A.M.A. 2.0 Help.chm';

这是一个已知问题,无法解决吗?
附注:帮助是在helpContext上调用的,这一点值得提一下,HtmlHelpViewer已添加到uses子句中。

我曾经遇到过的恐怖之一。如果我没记错的话,我是使用vcl-styles-utils解决的。 - Jerry Dodge
有一个(德语语言的)讨论帖子:http://www.delphipraxis.net/192481-styles-und-hilfe-im-chm-format.html - Uli Gerhardt
帮助文件控件在您的进程中,因此受样式的影响。与路径无关。遵循Jerry的建议,看看是否有所帮助。不使用样式会不会更容易些呢?当用户升级到新的Windows版本时,您的程序崩溃,这难道不让您感到困扰吗? - David Heffernan
Delphi的样式非常有bug。请使用Rodrigo Ruz开发的VCL样式 https://github.com/RRUZ/vcl-styles-utils。 - RBA
@JerryDodge - 我同意你的观点。我没有读完所有评论,只是快速写了一个评论。 - RBA
显示剩余6条评论
1个回答

2
这个答案来自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 属性,但您不需要在 Uses 子句中包含 HtmlHelpViewer 单元。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接