7

CHM ヘルプ ファイルを含む Delphi 2006 アプリを使用しています。TOpenDialog と TSaveDialog の [ヘルプ] ボタンに接続するためのヘルプが得られないことを除けば、すべて問題なく動作します。

これを示す簡単なプログラムを以下に示します。ボタン 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.
4

1 に答える 1

13

デフォルト設定では、TOpenDialog のヘルプ メッセージの処理が機能しません (Quality Central に送信する必要があります)。

具体的な理由は、Windows がダイアログ自体ではなく、ダイアログの親にヘルプ メッセージを送信するためです。そのため、フォームがそれを処理するように設定されていない限り、無視されます。

修正は、Application.ModalPopupModeをデフォルトの pmNone ではなく pmAuto に設定することです。これは、通常の起動コード中に 1 回、またはダイアログを表示する直前に行うことができます。これが設定されると、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.
于 2010-10-15T02:41:28.650 に答える