Я не могу получить контекстную справку Delphi, работающую в открытых и сохраненных диалогах - PullRequest
7 голосов
/ 15 октября 2010

У меня есть приложение Delphi 2006 с файлом справки CHM. Все работает нормально, за исключением того, что я не могу получить какую-либо помощь для подключения к кнопке «Справка» на 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.

1 Ответ

13 голосов
/ 15 октября 2010

При настройках по умолчанию обработка сообщений справки TOpenDialog не работает (вы должны отправить ее в Quality Central).

Конкретная причина в том, что Windows отправляет сообщение помощи родителю диалога, а не самому диалогу., поэтому, если ваша форма не настроена на обработку, она просто игнорируется.

Исправление состоит в том, чтобы установить 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.
...