代码之家  ›  专栏  ›  技术社区  ›  rossmcm

在打开和保存对话框中无法获得Delphi上下文相关帮助

  •  7
  • rossmcm  · 技术社区  · 14 年前

    一个简单的程序演示如下。单击按钮2打开帮助文件并显示正确的页面。单击按钮1将打开对话框,但单击对话框中的“帮助”按钮无效。

    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.
    
    1 回复  |  直到 14 年前
        1
  •  13
  •   Zoë Peterson RRUZ    14 年前

    默认设置为TOpenDialog的帮助消息处理不起作用(您应该将其提交给Quality Central)。

    解决办法是 Application.ModalPopupMode 改为pmAuto而不是pmNone的默认值。您可以在正常启动代码期间或在显示对话框之前执行一次。设置后,Delphi会创建一个中间窗口(Dialogs.pas::TRedirectorWindow),该窗口可以正确处理消息。

    如果由于某种原因您无法更改ModalPopupMode,那么正如我所说的,您需要处理表单上的消息:

    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.