帮助文件从模式窗口打开反应迟钝(Helpfile opened from modal window

2019-08-17 03:01发布

用Delphi XE2,Win64的。

所以我有一个大的应用程序有许多形式,如果我打开从主窗体中的帮助文件,打开一个模式窗口,然后点击F1到断火模态窗口上下文相关帮助的帮助文件窗口中显示了正确的信息,但帮助文件不能被关闭,直到我关闭模式窗口。 我甚至无法帮助文件再次具有焦点,如果我回去的应用程序,直到模态窗口关闭。

调用旧版本我们的应用程序(用Delphi 6个内置)的本完全相同的帮助文件坐在同一个文件夹中的新版本(与德尔福XE2建)的帮助文件时会显示F1键从模态窗口击中,是反应灵敏,就像我期望可以关闭。

帮助文件的.chm文件类型。

来概括。

通过F1跳转启动应用程序打开帮助文件,通过点击F1帮助文件窗口应用程序并打开模式窗口的应用程序启动帮助从模式窗口无法关闭,直到我跳回到我的应用程序,并关闭模式窗口。

没有任何人有任何想法都为什么这会是什么?

我已经在网上搜索,并没有发现任何类似的问题。

我们难住了。

干杯TJ

- - 编辑 - -

下面是用于对样品2形式的应用程序,也表现出这种行为的一些代码。

program Project1;

uses
  Vcl.Forms,
  HTMLHelpViewer,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.HelpFile := 'C:\helpfile.chm';
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

下面是Form1的代码:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Application);
  try
    Form2.ShowModal;
  finally
    Form2.Free;
  end;
end;

end.

我设置我的帮助文件中的两种形式,以两个有效上下文HelpContext属性。

运行该应用程序 - F1打开帮助文件命中按钮,这样窗体2被创建并显示F1调用帮助文件不能关闭帮助文件,直到我关闭窗体2。

希望这可以帮助。 - TJ

Answer 1:

这是一个严重的设计缺陷HtmlHelpViewer 。 而且很容易重现您所描述的行为。 干得好指定的问题这么清楚。 这个问题困扰着32个和64位程序也同样。

我个人不使用HtmlHelpViewer ,因为它是行不通的。 我实施的处理程序TApplication.OnHelp 。 它看起来像这样:

class function THelpWindowManager.ApplicationHelp(Command: Word; 
  Data: THelpEventData; var CallHelp: Boolean): Boolean;
begin
  CallHelp := False;
  Result := True;
  //argh, WinHelp commands
  case Command of
  HELP_CONTEXT,HELP_CONTEXTPOPUP:
    HtmlHelp(GetDesktopWindow, Application.HelpFile, HH_HELP_CONTEXT, Data);
  end;
end;

把在一个类并将其分配给Application.OnHelp在启动时:

Application.OnHelp := THelpWindowManager.ApplicationHelp;

我刚刚测试了这一点上做文章两个表单应用程序,它工作得很好。 在真正的代码,你不妨美化这一点。 例如,我实际的代码更复杂。 它存储当它关闭在用户设置帮助窗口的位置和窗口状态。 然后当再次表明,这一立场和窗口状态得到恢复。 所以,在出现的帮助窗口记住它最后在屏幕上。


由于@Sertac为挖泥在下面的意见的细节。 总之这里的地方HtmlHelpViewer代码出错:

  1. 它使发送HH_INITIALIZE在帮助系统启动命令。
  2. 正如所描述文档此配置HTML帮助到同一个线程调用应用程序,而不是一个辅助线程上运行
  3. 当你打电话ShowModal调用DisableTaskWindows它禁用调用线程窗口。
  4. 因为帮助查看器窗口是通过你的应用程序的主线程(因为创建HH_INITIALIZE命令),它就会被禁用。

这就是为什么你可以用一个预先存在的帮助窗口,而德尔福模式窗体处于活动状态不相互作用。



文章来源: Helpfile opened from modal window unresponsive