关于chm:在Delphi中同时打开两个HTMLHelp文件会导致两个帮助窗口都挂起

关于chm:在Delphi中同时打开两个HTMLHelp文件会导致两个帮助窗口都挂起

Opening two HTMLHelp files simultaneously in Delphi causes both help windows to hang

在Delphi中,应用程序的主帮助文件是通过TApplication.HelpFile属性分配的。然后,对应用程序帮助系统的所有调用都使用此属性(与CurrentHelpFile一起使用)来确定将帮助调用路由到的帮助文件。

除了TApplication.HelpFile之外,每个表单还具有TForm.HelpFile属性,该属性可用于为来自该特定表单的帮助调用指定不同的(单独的)帮助文件。

但是,如果应用程序的主帮助窗口已经打开,并且通过第二个帮助文件发出了帮助呼叫以显示帮助,则两个帮助窗口都将挂起。现在,两个帮助窗口都无法访问,也无法关闭。摆脱帮助窗口的唯一方法是关闭应用程序,这将导致两个帮助窗口也被自动关闭。

例:

1
2
3
4
Application.HelpFile := 'Main Help.chm'; //assign the main help file name
Application.HelpContext(0); //dispays the main help window
Form1.HelpFile := 'Secondary Help.chm'; //assign a different help file
Application.HelpContext(0); //should display a second help window

上面的代码的最后一行打开辅助帮助窗口(但没有内容),然后两个帮助窗口都挂起。

我的问题是这样的:

  • 是否可以同时显示两个HTMLHelp窗口,如果可以,将遵循什么步骤?

  • 如果没有,是否有办法判断应用程序的帮助窗口是否已经打开,然后在显示其他帮助窗口之前以编程方式将其关闭?

  • (我在Windows Vista上使用带有HTMLHelp文件的Delphi 2007)

    更新:2008-09-18

    实际上,使用上面的代码同时打开两个帮助文件确实可以按预期工作。问题似乎出在我使用的实际帮助文件上,而不是代码。

    我用不同的帮助文件尝试了相同的代码,但效果很好。

    奇怪的是,我正在使用的两个帮助文件本身都能正常工作-只有当您尝试同时挂起两个帮助文件时,并且仅当您从代码中打开它们时(在Windows资源管理器中,我才能在同时没有问题)。

    无论如何,问题肯定出在帮助文件上,而不是代码上,所以原来的问题现在几乎是无效的。

    更新2:2008-09-18

    我最终找到了挂起帮助窗口的原因。我将在下面发布答案并将其作为正确的答案接受,以供将来参考。我还更改了问题标题。

    糟糕...看来我无法接受自己的回答...

    请投票,使它排在最前。


    假设您有两个帮助文件,分别为"帮助文件1.chm"和"帮助文件2.chm",并且正在从Delphi代码中打开这些帮助文件。

    要打开帮助文件1,以下代码将起作用:

    1
    2
    3
    4
    5
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'Help File 1.chm';
      Application.HelpContext(0);
    end;

    要打开帮助文件2,以下代码将起作用:

    1
    2
    3
    4
    5
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'Help File 2.chm';
      Application.HelpContext(0);
    end;

    但是要同时打开两个文件,以下代码将导致两个帮助窗口挂起。

    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'Help File 1.chm';
      Application.HelpContext(0);

      Application.HelpFile := 'Help File 2.chm';
      Application.HelpContext(0);
    end;

    解:

    该问题是由于帮助文件名中存在空格这一事实引起的。

    从文件名中删除空格将解决此问题。

    以下代码可以正常工作:

    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'HelpFile1.chm';
      Application.HelpContext(0);

      Application.HelpFile := 'HelpFile2.chm';
      Application.HelpContext(0);
    end;

    试过了正常工作。


    我刚刚对其进行了测试,并且可以按您期望的那种代码正常工作。
    在D2007 / XP中进行编译,在XP和Vista中均可正常运行。

    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile:= 'depends.chm';
      Application.HelpContext(0);
      HelpFile:='GExperts.chm';
      Application.HelpContext(0);
    end;

    这两个帮助文件都已打开,并且仍然运行良好。

    Q1:您是否检查了帮助文件的有效性?
    Q2:您将代码放在哪里?


    这里没有帮助文件,甚至对于Vista也没有经验,但是我可以为您提供可能的解决方法...

    生成第二个应用程序,其唯一的工作就是打开帮助文件。您可以将帮助文件名作为命令行参数传递。

    您可以轻松地从主应用程序中检查此帮助应用程序是否正在运行。这样可以完全控制自己,因为您可以决定是否要

    • 发送消息以关闭帮助应用程序,然后再打开辅助帮助
    • 允许帮助应用程序的多个实例允许同时打开不同的帮助文件
    • 允许帮助在您的应用程序关闭后保持打开状态,或者是否要向其发送消息以将其关闭

    您还可以检查帮助应用程序的实例是否已经打开了请求的帮助文件,并决定是否要第二次打开它,或者只是将现有实例置于前台。

    如前所述,这是一种解决方法-如果事实证明这是您唯一的选择,请告诉我是否需要代码示例。否则,我将保持此帖子的整洁(并在短期内节省时间),并且不要在不必要的信息源中打乱它


    推荐阅读

      linux文件异或命令?

      linux文件异或命令?,数字,系统,工作,管理,命令,数据,网络,文件,第一,单位,基

      linux两个命令包起来?

      linux两个命令包起来?,系统,单位,管理,命令,文件,设计,环境,工作,代码,生产,m

      linux文件复制的命令?

      linux文件复制的命令?,系统,文件,命令,目录,源文件,基本知识,位置,目标,选

      linux写文件命令行?

      linux写文件命令行?,工作,系统,命令,信息,名字,文件,目录,资料,标准,时间,lin

      linux复制命令文件?

      linux复制命令文件?,系统,文件,命令,目录,基本知识,源文件,目标,文件夹,路

      linux下文件均分命令?

      linux下文件均分命令?,管理,情况,系统,工作,信息,地址,命令,目录,单位,设备,L

      linux的文件替换命令?

      linux的文件替换命令?,系统,工作,实时,命令,文件,批量,字符串,内容,方法,表

      linux命令有两个文件?

      linux命令有两个文件?,文件,代码,系统,命令,两个,内容,文件夹,光标,后方,文

      linux查文件数量命令?

      linux查文件数量命令?,系统,数据,电脑,命令,文件,信息,代码,对比,软件,第三,l

      linux挂起任务命令?

      linux挂起任务命令?,系统,工作,信息,工具,地址,情况,暂停,数据,命令,进程,lin

      linux命令去重文件?

      linux命令去重文件?,系统,工作,命令,信息,数据,环境,代码,文件,目录,操作,Lin

      linux写大文件命令?

      linux写大文件命令?,服务,数据,第三,较大,基础,工具,设备,文件,大小,命令,lin

      linux查询文件夹命令?

      linux查询文件夹命令?,系统,软件,电脑,命令,文件,文件夹,单位,第三,档案,数

      linux多文件打包命令?

      linux多文件打包命令?,系统,工具,时间,代码,文件,命令,文件夹,目录,指令,格

      linux命令的头文件?

      linux命令的头文件?,系统,单位,信息,代码,情况,位置,时报,项目,百度,命令,lin

      linux匹配文件名命令?

      linux匹配文件名命令?,系统,时间,发行,位置,工具,软件,名称,盘后,电脑,盘中,l

      linux进入挂起的命令?

      linux进入挂起的命令?,系统,标准,设备,工作,暂停,命令,状态,信息,名称,邮箱,L

      linux上编辑文件命令?

      linux上编辑文件命令?,系统,信息,工作,状态,命令,文件,标准,检测,工具,设备,L

      改文件名linux命令?

      改文件名linux命令?,名字,软件,文件,命令,位置,系统,文件名,目录,指令,方面,l

      linux命令文件加锁?

      linux命令文件加锁?,数据,密码,系统,设备,代码,地址,名单,信息,数字,统一,请