2010-10-14 10 views
7

Mam aplikację Delphi 2006 z plikiem pomocy CHM. Wszystko działa poprawnie, z tym że nie mogę uzyskać pomocy, aby połączyć się z przyciskiem "Pomoc" na TOpenDialog i TSaveDialog.Nie mogę uzyskać Delphi Pomoc kontekstowa działająca w otwartych i zapisywanych oknach dialogowych

Prosty program demonstrujący to jest pokazany poniżej. Kliknięcie przycisku 2 powoduje otwarcie pliku pomocy i wyświetlenie poprawnej strony. Kliknięcie przycisku 1 otwiera okno dialogowe, ale kliknięcie przycisku pomocy w oknie dialogowym nie ma żadnego efektu.

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. 

Odpowiedz

13

Przy ustawieniach domyślnych obsługa wiadomości pomocy TOpenDialog nie działa (należy przesłać ją do centrum jakości).

Szczególnym powodem jest to, że system Windows wysyła komunikat pomocy do rodzica okna dialogowego, a nie do samego okna dialogowego, więc dopóki formularz nie zostanie skonfigurowany do przetwarzania, zostanie zignorowany.

Rozwiązaniem jest ustawienie Application.ModalPopupMode na pmAuto zamiast domyślnego pmNone. Możesz to zrobić raz podczas normalnego kodu uruchamiania lub tuż przed wyświetleniem okna dialogowego. Gdy jest ustawiony Delphi tworzy okno pośrednie (Dialogs.pas :: TRedirectorWindow), które obsługuje poprawnie wiadomość.

Jeśli z jakiegoś powodu nie możesz zmienić ModalPopupMode potem, jak już powiedziałem, trzeba obsłużyć wiadomość na formularzu:

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. 
+0

Dzięki za to. Prostsza poprawka działała (Application.ModalPopupMode: = pmAuto, wywołana w overriden CreateWnd() metoda) - Nie wiem, jakie inne możliwe efekty uboczne mogą mieć w mojej aplikacji. Przypuszczalnie nie muszę nic robić przy wyjściu, ponieważ instancja TApplication i tak zniknie. – rossmcm

+0

@ user89691: Będzie to miało efekt uboczny, że każdy otwarty formularz będzie "nadrzędny" do formularza, z którego został otwarty. Oznacza to, że zostanie zamknięty, gdy formularz "rodzica" zostanie zamknięty. Jeśli potrzebujesz większej kontroli, użyj pmExplicit jako PopupMode i ustaw wszystkie formularze PopupParent ..., cóż, wyraźnie ... "Parentend" (między nawiasami), ponieważ rzeczywisty rodzic formularza jest _nie_ dotknięty, tylko jego PopupParent. –

+0

OK, nadal jestem trochę zdezorientowany. Nadpisanie CreateWnd działa, więc czy można go tak zostawić? Alternatywnie MyTypDialog i TSaveDialog są tworzone automatycznie (tzn. Komponenty zostały upuszczone na formularz w czasie projektowania). Czy mogę: 1) Zaraz przed wywołaniem funkcji Wykonaj, zapisz bieżącą wartość Application.ModalPopup. 2) następnie ustaw Application.ModalPopup = pmAuto. 3) po wywołaniu Execute, przywróć Application.ModalPopup do jego zapisanej wartości. Wydaje się, że działa i ma tę zaletę, że mniej prawdopodobne jest, że rozbiję go gdzie indziej, ponieważ wszystko pozostało takie, jakie było. – rossmcm

Powiązane problemy