I can't get Delphi Context-sensitive help working in open and save dialogs
I ha开发者_C百科ve a Delphi 2006 app with a CHM help file. It all works OK except that I cannot get any help to connect to the "Help" button on the TOpenDialog and TSaveDialog.
A simple program demonstrating this is shown below. Clicking button 2 opens the help file and displays the correct page. Clicking button 1 opens the dialog, but clicking on the help button in the dialog has no effect.
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.
With default settings TOpenDialog's help message handling doesn't work (you should submit it to Quality Central).
The specific reason is because Windows sends the help message to the dialog's parent, rather than the dialog itself, so unless your form is set up to process it it just gets ignored.
The fix is to set Application.ModalPopupMode to pmAuto instead of the default of pmNone. You can do that once during your normal startup code, or just before you show the dialog. When that's set Delphi creates an intermediate window (Dialogs.pas::TRedirectorWindow) which handles the message correctly.
If for some reason you can't change the ModalPopupMode then, as I said, you need to handle the message on 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.
精彩评论