Delphi VCL样式激活时CHM文件未正确显示

Delphi VCL样式激活时CHM文件未正确显示,delphi,chm,vcl-styles,Delphi,Chm,Vcl Styles,我的Delphi应用程序包括一个帮助文件,用户可以从应用程序中的任何位置调用该文件(好吧……也就是说,对于我迄今为止编写的所有部分……) 它还包括用户从常规样式切换到列表中的其他VCL样式的能力 未应用样式时,帮助文件通常如下所示: 但一旦VCL样式激活,帮助文件将不再正确显示,如下所示: 这是因为我在创建主窗体时声明帮助文件的方式如下(路径是指向主exe文件夹的全局变量): 或者这是一个无法解决的已知问题 旁注:如果需要提及的话,会在helpContext上调用帮助,并且会在uses子句中

我的Delphi应用程序包括一个帮助文件,用户可以从应用程序中的任何位置调用该文件(好吧……也就是说,对于我迄今为止编写的所有部分……)

它还包括用户从常规样式切换到列表中的其他VCL样式的能力

未应用样式时,帮助文件通常如下所示:

但一旦VCL样式激活,帮助文件将不再正确显示,如下所示:

这是因为我在创建主窗体时声明帮助文件的方式如下(路径是指向主exe文件夹的全局变量):

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


旁注:如果需要提及的话,会在helpContext上调用帮助,并且会在uses子句中添加HtmlHelpViewer。

这个答案来自,我已经确认效果很好

将应用程序事件组件拖放到应用程序主窗体上

实现该组件的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;
在主窗体上,实现closehelpownd方法,如下所示:

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;
到目前为止,我们还没有发现上述方法存在任何问题,因为我们在单独的过程中运行帮助文件,所以它不会受到Delphi10.2中明显的VCL样式问题的影响

注意:它不必是应用程序主窗体,但必须是在需要帮助系统之前创建的窗体,并在应用程序运行时保持实例化状态。在我们的例子中,我们是在一个公共资源表单上完成的,然后我们用新表单重建的所有程序都解决了帮助问题


注意:您仍然需要将Application.HelpFile属性设置为普通属性,但不需要在Uses子句中包含HtmlHelpViewer单元。

我曾经遇到过的一个可怕问题。如果我还记得的话,我用一个(德语)线程解决了这个问题:帮助文件控制在您的过程中,因此需要样式化。与路径无关。听从杰瑞的建议,看看是否有帮助。不使用样式不是更容易吗?当你的用户升级到新的windows版本时,你的程序崩溃了,这难道不困扰你吗?Delphi风格是非常有缺陷的。使用Rodrigo Ruz开发的VCL样式。@RBA与我发布的链接相同,但正如您的评论所示,它不是替代品或替代品。它是一个扩展,修复了许多已知问题,并引入了新功能。
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;
CloseHelpWnd;