2012-04-02 10 views
6

Sto lavorando per ottenere la configurazione del file di aiuto con il nostro software. Ho aggiunto i numeri di HelpContext per molti moduli/frame/controlli specifici e funzionano tutti bene. Il problema è che la forma principale non porta alcun tipo di aiuto. Per tutto questo sto usando solo F1 per cercare di attivare l'aiuto.Collegamento di file di aiuto a un'applicazione Delphi XE2 - tutto funziona tranne il modulo principale

Non sono affatto un esperto di Delphi o di helpfiles, ma posterò quello che ho fatto e dove ho guardato.

Modifica: Grazie a un po 'di aiuto ora vedo che il problema è dovuto al fatto che il modulo principale è un genitore MDI. Questo ancora non risolve il problema .. sembra quasi un insetto per me, ma suppongo che potrebbe essere intenzionale per qualche motivo. EndEdit

Includo questa unità: HtmlHelpViewer per il visualizzatore. Nelle forme principali Crea costruttore ho aggiunto Application.Helpfile: = 'asdf.chm'. Per tutti gli altri moduli ho appena aggiunto numeri di contesto e ha funzionato subito. L'ho provato sul modulo principale e non succede nulla. Così ho provato ad aggiungere un evento Application.OnHelp ma questo non viene richiamato sul modulo principale (e lo fa per tutte le altre forme in cui la guida funziona).

L'ultima risorsa a cui potevo pensare era di tracciare in profondità nel codice e vedere cosa stava succedendo. Ho ottenuto TCustomForm.WMHelp in Vcl.Forms come il luogo in cui la divisione stava accadendo. Detta funzione ha questo ciclo:

if iContextType = HELPINFO_WINDOW then 
begin 
    Control := FindControl(hItemHandle); 
    while (Control <> nil) and (not ControlHasHelp(Control)) do 
    Control := Control.Parent; 
    if Control = nil then Exit; 
    GetHelpInfo(Control, HType, ContextID, Keyword); 
    Pt := Control.ClientToScreen(Point(0, 0)); 
end 

Quando la forma principale chiamava il controllo aiuto sarebbe pari a zero e poi sarebbe uscire. Qualsiasi altra cosa andrebbe bene.

Ovviamente non so perché questo sta accadendo. La risposta potrebbe essere qualcosa di molto semplice. Qualsiasi idea sarebbe apprezzata!

+0

Hai impostato 'HelpContext' per il modulo principale stesso? –

+0

@DavidHeffernan: Sì, l'ho fatto. Avrei dovuto dirlo, ma è solo la forma principale, non i suoi figli. Inserisco un pulsante nel modulo (senza guida di contesto) e quando ha il focus e spingo F1 il helpcontext per i caricamenti del modulo principale. Se non c'è una messa a fuoco visibile, non viene caricato alcun aiuto. – Sentient

+0

Dare un'occhiata al gestore WMHelp sotto il debugger e vedere cosa viene restituito da FindControl. –

risposta

6

In base ai commenti, il messaggio WM_HELP viene assegnato alla finestra del client MDI. E poiché non è un controllo VCL, non risponde al messaggio WM_HELP. Si può affrontare il problema intercettando il messaggio e chiedendo la forma principale di gestire la cosa:

type 
    TMainForm = class(TForm) 
    protected 
    procedure WMHelp(var Message: TWMHelp); message WM_HELP; 
    end; 
.... 
procedure TMainForm.WMHelp(var Message: TWMHelp); 
begin 
    if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
    and (Message.HelpInfo.hItemHandle=ClientHandle) then 
    Message.HelpInfo.hItemHandle := Handle; 
    inherited; 
end; 

Se si vuole essere ancora più difensiva si potrebbe scrivere in questo modo:

if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
    and (FindControl(Message.HelpInfo.hItemHandle)=nil) then 
    Message.HelpInfo.hItemHandle := Handle; 

I' Ho appena dato un'occhiata alla mia applicazione MDI e posso vedere che ho un codice simile per affrontare questo problema esatto. Se non fosse stato scritto più di 10 anni fa, forse avrei ricordato prima!

+0

Fantastico, grazie mille per tutto il tuo aiuto! Ho dovuto apportare una piccola modifica al codice, ho aggiunto: 'con Message.HelpInfo {$ IFNDEF CLR}^{$ ENDIF} do' perché il compilatore non ha gradito iContextType, l'ho ottenuto da quello VCL .Forms aveva nel suo WMHelp. (E poi ha estratto Message.HelpInfo dalla seconda parte del e.) – Sentient

+0

Buono. Felice di aver aiutato. –

Problemi correlati