2010-10-14 29 views
7

Bir CHM yardım dosyasına sahip bir Delphi 2006 uygulamasına sahibim. Her şey tamam çalışıyor, ancak TOpenDialog ve TSaveDialog'daki "Yardım" düğmesine bağlanmak için herhangi bir yardım alamıyorum.Delphi İçeriğe duyarlı yardımı açıp iletişim kutularında çalışamıyorum

Bunu gösteren basit bir program aşağıda gösterilmiştir. 2 nolu tuşa tıklayarak yardım dosyasını açar ve doğru sayfayı gösterir. 1 nolu butona tıklamak diyaloğu açar, ancak diyalogdaki yardım butonunu tıklayarak hiçbir etkisi olmaz.

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. 

cevap

13

Varsayılan ayarlarda, TOpenDialog'un yardım iletisi kullanımı çalışmıyor (Quality Central'a göndermelisiniz).

Bunun nedeni, Windows'un iletinin kendisi yerine iletişim kutusunun ebeveyne yardım iletisini göndermesidir, bu nedenle formunuz işlenecek şekilde ayarlanmadıkça yalnızca yok sayılır.

Düzeltme, Application.ModalPopupMode değerini, pmNone değeri yerine pmAuto olarak ayarlamaktır. Normal başlatma kodunuz sırasında veya iletişim kutusunu göstermeden hemen önce yapabilirsiniz. Bu ayarlandığında, Delphi mesajı doğru şekilde işleyen bir ara pencere (Dialogs.pas :: TRedirectorWindow) oluşturur. nedense daha sonra ModalPopupMode değiştiremiyorsanız dediğim gibi

, sizin form üzerinde mesaj işlemek gerekir: bunun için

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

teşekkür ederiz. Daha basit düzeltme işe yaradı (Application.ModalPopupMode: = pmAuto, overwrite bir CreateWnd() yöntemini çağırdı) - Uygulamamda olabilecek diğer olası yan etkileri bilmiyorum. Muhtemelen, TApplication örneğinin zaten gideceği gibi, çıkışta herhangi bir şey yapmam gerekmez. – rossmcm

+0

@ user89691: Açılan her formun, açıldığı forma "eşlik" edeceği yan etkisi olacaktır. Ve bu, "ebeveyn" formu kapatıldığında kapalı olacağı anlamına gelir. Daha fazla kontrole ihtiyacınız varsa, PopupMode olarak pmExplicit'i kullanın ve her formu PopupParent ... 'ı, iyi, açık bir şekilde ayarlayın ... "Parentend" (parantez arasında) çünkü formun asıl üst öğesi _not_ etkilenir, sadece PopupParent. –

+0

Tamam, hala burada biraz kafam karışık. CreateWnd geçersiz kılma çalışıyor, bu yüzden bu şekilde bırakmak güvenli midir? Alternatif olarak, TOpenDialog ve TSaveDialog'lar otomatik olarak oluşturulur (yani, bileşenler tasarım zamanında forma bırakılmıştır). Bu yüzden: 1) Execute çağrısından hemen önce, Application.ModalPopup'un geçerli değerini kaydedin. 2) daha sonra Application.ModalPopup = pmAuto değerini ayarlayın. 3) Yürütme çağrısından sonra, Application.ModalPopup'u kaydedilen değere geri yükleyin. Bu işe yarıyor gibi görünüyor ve her şey olduğu gibi kaldığı için başka bir yere kopma ihtimalim daha az. – rossmcm