gpt4 book ai didi

delphi - 从模态窗口打开的帮助文件没有响应

转载 作者:行者123 更新时间:2023-12-03 14:47:36 27 4
gpt4 key购买 nike

使用Delphi XE2,Win64。

所以我有一个包含许多表单的大型应用程序,如果我从主表单打开帮助文件并打开模式窗口,然后按 F1 在模式窗口上启动上下文相关帮助,帮助文件窗口将显示正确的信息,但在关闭模式窗口之前无法关闭帮助文件。如果我返回应用程序直到模式窗口关闭,我什至无法让帮助文件再次获得焦点。

从与新版本(使用 Delphi XE2 构建)位于同一文件夹中的旧版本应用程序(使用 Delphi 6 构建)调用这个完全相同相同的帮助文件,当从模态窗口按下 F1 键并且响应良好,并且可以像我期望的那样关闭。

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

总结一下。

启动应用程序按F1打开帮助文件跳转到应用程序并在应用程序中打开模态窗口按 F1 从模态窗口启动帮助在我跳回应用程序并关闭模式窗口之前,无法关闭帮助文件窗口。

有人知道为什么会这样吗?

我在网上查了一下,没有发现类似的问题。

我们被难住了。

干杯TJ

----编辑----

下面是两个表单示例应用程序的一些代码,也表现出这种行为。

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 打开帮助文件点击按钮,创建并显示 Form2F1调用帮助文件在关闭 Form2 之前无法关闭帮助文件。

希望这有帮助。 - TJ

最佳答案

这是 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. documentation 中所述这将 HTML 帮助配置为在与调用应用程序相同的线程上运行,而不是在辅助线程上运行。
  3. 当您调用 ShowModal 时,它会调用 DisableTaskWindows 来禁用调用线程中的窗口。
  4. 由于帮助查看器窗口是由应用的主线程创建的(由于 HH_INITIALIZE 命令),因此它会被禁用。

这就是为什么当 Delphi 模式表单处于事件状态时,您无法与预先存在的帮助窗口进行交互。

关于delphi - 从模态窗口打开的帮助文件没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15012547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com