I can’t get Delphi Context-sensitive help working in the open and save dialog

I have a Delphi 2006 application with a CHM help file. Everything works fine, except that I cannot get help connecting to the Help button on TOpenDialog and TSaveDialog.

A simple program demonstrating this is shown below. Pressing button 2 opens the help file and displays the correct page. Pressing button 1 opens the dialog, but clicking on the help button in the dialog box does not affect.

unit Unit22; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, HTMLHelpViewer ; type TForm22 = class(TForm) OpenDialog1: TOpenDialog; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form22: TForm22; implementation {$R *.dfm} procedure TForm22.Button1Click(Sender: TObject); begin OpenDialog1.HelpContext := 10410 ; OpenDialog1.Execute ; end; procedure TForm22.Button2Click(Sender: TObject); begin Application.HelpContext (10410) ; end; procedure TForm22.FormCreate(Sender: TObject); begin Application.HelpFile := 'c:\help.chm' ; end; end. 
+7
delphi delphi-2006 openfiledialog chm
source share
1 answer

With default settings Processing help help using the TOpenDialog function does not work (you must send it to Quality Central).

The specific reason is that Windows sends a help message to the parent dialog box, not the dialog itself, so if your form is not configured to process it, it is simply ignored.

The fix is ​​to set Application.ModalPopupMode to pmAuto instead of the standard pmNone. You can do this once during normal startup code or just before the dialog displays. When this set of Delphi creates an intermediate window (Dialogs.pas :: TRedirectorWindow) that correctly processes the message.

If for some reason you cannot change ModalPopupMode, then, as I said, you need to process the message in your form:

 TForm22 = class(TForm) ... procedure WndProc(var Message: TMessage); override; end; initialization var HelpMsg: Cardinal; procedure TForm22.WndProc(var Message: TMessage); begin inherited; if (Message.Msg = HelpMsg) and (OpenDialog1.Handle <> 0) then Application.HelpContext(OpenDialog1.HelpContext); end; initialization HelpMsg := RegisterWindowMessage(HelpMsgString); end. 
+13
source share

All Articles