Using Delphi XE2, Win64.
So I have a large application with many forms and if I open the help file from the main form and open a modal window and then hit F1 to fire off context-sensitive help on the modal window the help file window shows with the correct info but the help file cannot be closed until I close the modal window. I cannot even get the help file to have focus again if I go back to the application until the modal window closes.
Calling this exact same help file from the old version of our application (built with Delphi 6) sitting within the same folder as the new version (built with Delphi XE2) the help file displays when the F1 key is hit from the modal window and is responsive and can be closed like I expect.
The help file is .chm type file.
To summarize.
Launch application Open help file by F1 Jump to application and open modal window in application Launch help from modal window by hitting F1 Help file window cannot be closed until I jump back to my application and close the modal window.
Does anybody have any idea at all why this would be?
I have searched the Internet and have not found any similar issue.
We are stumped.
Cheers TJ
----EDIT----
Here is some code for a sample two form app that also exhibits this behavior.
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.
Here is Form1 code:
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.
I set the helpcontext property on the two forms to two valid contexts within my help file.
Run the app - F1 to open help file Hit button so Form2 is created and shown F1 to call help file Cannot close help file until I close Form2.
Hope this helps. - TJ
This is a serious design flaw in
HtmlHelpViewer
. And it's easy to reproduce the behaviour you describe. Well done for specifying the problem so clearly. The issue afflicts both 32 and 64 bit programs equally.Personally I don't use
HtmlHelpViewer
because it just doesn't work. I implement a handler forTApplication.OnHelp
. It looks like this:Put that in in a class and assign it to
Application.OnHelp
on startup:I've just tested that out on the trivial two form application and it works well. In real code you may wish to embellish this. For example, my actual code is more complex. It stores in user settings the position and window state of the help window when it is closed. And then when shown again, that position and window state are restored. So that the help window appears to remember where it last was on the screen.
Thanks to @Sertac for dredging out the details in the comments below. In summary here's where the
HtmlHelpViewer
code goes wrong:HH_INITIALIZE
command at help system startup.ShowModal
that callsDisableTaskWindows
which disables windows in the calling thread.HH_INITIALIZE
command), it gets disabled.And that's why you cannot interact with the a pre-existing help window whilst a Delphi modal form is active.