Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中同时打开两个HTMLHelp文件会导致两个帮助窗口挂起_Delphi_Chm - Fatal编程技术网

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

在Delphi中同时打开两个HTMLHelp文件会导致两个帮助窗口挂起,delphi,chm,Delphi,Chm,在Delphi中,应用程序的主帮助文件是通过TApplication.HelpFile属性分配的。然后,对应用程序帮助系统的所有调用都使用此属性(与CurrentHelpFile一起)来确定帮助调用应路由到的帮助文件 除了TApplication.HelpFile外,每个表单还具有一个TForm.HelpFile属性,可用于为来自该特定表单的帮助调用指定不同(单独)的帮助文件 但是,如果应用程序的主帮助窗口已打开,并且通过辅助帮助文件发出帮助调用以显示帮助,则两个帮助窗口都会挂起。两个帮助窗口现

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

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

但是,如果应用程序的主帮助窗口已打开,并且通过辅助帮助文件发出帮助调用以显示帮助,则两个帮助窗口都会挂起。两个帮助窗口现在都不能访问,也不能关闭。摆脱帮助窗口的唯一方法是关闭应用程序,这会导致两个帮助窗口也自动关闭

例如:

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上使用Delphi 2007和HTMLHelp文件)

    更新:2008-09-18

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

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

    奇怪的是,我使用的两个帮助文件各自都可以正常工作——只有当您尝试同时打开它们时,它们才会挂起,并且只有当您从代码中打开它们时(在Windows资源管理器中,我可以同时打开这两个文件而不会出现问题)

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

    更新2:2008-09-18

    我终于找到了挂帮助窗口的原因。我将把答案贴在下面,并将其作为正确答案,以备将来参考。我还更改了问题的标题

    哎呀。。。似乎我不能接受我自己的答案


    请对其进行投票,使其保持在顶部。

    对这里的帮助文件缺乏经验,对Vista更是如此,但我可以为您提供一个可能的解决方案

    构建第二个应用程序,其唯一任务是打开帮助文件。可以将帮助文件名作为命令行参数传递

    您可以从主应用程序轻松检查此帮助应用程序是否正在运行。这将给你完全的控制权,因为你可以决定你是否想要

    • 在打开辅助帮助之前,发送消息以关闭帮助应用程序
    • 允许帮助应用程序的多个实例同时打开不同的帮助文件
    • 允许帮助在应用程序关闭后保持打开状态,或者是否要向其发送消息以关闭它
    您还可以检查帮助应用程序的实例是否已经打开了请求的帮助文件,并决定是否允许再次打开该文件,或者只是将现有实例置于前台


    如前所述,这是一个变通方法-如果它是您唯一的选择,请告诉我您是否需要代码示例。否则,我会保持这篇文章的整洁(并在短期内节省我自己的时间),不会用不必要的源代码把它弄得乱七八糟

    我刚刚测试了它,并且它可以像预期的那样工作,使用您尝试过的代码。
    在D2007/XP中编译,在XP和Vista中都可以正常运行

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile:= 'depends.chm';
      Application.HelpContext(0);
      HelpFile:='GExperts.chm';
      Application.HelpContext(0);
    end;
    
    两个帮助文件都已打开,并且都处于活动状态

    Q1:您是否检查了帮助文件的有效性?

    问题2:您把代码放在哪里了?

    尝试过了。只要工作。

    假设您有两个名为“help File 1.chm”和“help File 2.chm”的帮助文件,并且您正在从Delphi代码中打开这些帮助文件

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

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'Help File 1.chm';
      Application.HelpContext(0);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'Help File 2.chm';
      Application.HelpContext(0);
    end;
    
    要打开帮助文件2,以下代码将起作用:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'Help File 1.chm';
      Application.HelpContext(0);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'Help File 2.chm';
      Application.HelpContext(0);
    end;
    
    但要同时打开两个文件,以下代码将导致两个帮助窗口挂起

    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;
    
    解决方案:

    该问题是由以下事实引起的:帮助文件名中有空格

    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;
    
    从文件名中删除空格将解决此问题

    以下代码可以正常工作:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HelpFile := 'HelpFile1.chm';
      Application.HelpContext(0);
    
      Application.HelpFile := 'HelpFile2.chm';
      Application.HelpContext(0);
    end;
    

    @Frnacois你是对的-它确实有效。问题似乎出在我正在使用的实际帮助文件上,而不是代码上。解决方法是个好主意,但是有第二个应用程序只打开帮助文件可能有些过头了。使用ShellExecute(Handle、'open',PChar('HelpFileName.chm')、nil、nil、SW_SHOWNORMAL)可以获得相同的结果;六羟甲基三聚氰胺六甲醚。。。温多泽问题还是德尔菲问题?怎么知道?