Utilizzo dell'evento KeyDown nella finestra principale di un'applicazione Delphi Mdi

StackOverflow https://stackoverflow.com/questions/225052

  •  03-07-2019
  •  | 
  •  

Domanda

Come faccio a far funzionare l'evento KeyDown in una finestra padre delle applicazioni MDI di Delphi (2007), anche se una finestra figlio è attiva?

Vorrei implementare un tasto di scelta rapida (F1) che richiama una schermata di aiuto in un'applicazione MDI, ho aggiunto la procedura KeyDown alla finestra MDI Parent e abilitato KeyPreview in entrambe le finestre Parent e Child, ma lo fa non funziona come previsto.

Se inserisco un punto di interruzione nel codice KeyDown dei genitori, vedo che non viene mai eseguito, anche se non ci sono finestre figlio aperte. Ma se aggiungo lo stesso codice alla finestra figlio funziona bene.

Esiste un modo per far sì che la finestra principale riceva le pressioni dei tasti, anche se la finestra figlio ha lo stato attivo, poiché l'aggiunta del codice a 25+ forme di giunzioni un po 'dispendiose?

È stato utile?

Soluzione

Ho avuto lo stesso identico problema questa settimana! L'ho risolto creando un'azione in ActionManager sul modulo principale. Questa azione apre il file della guida e ha il tasto F1 impostato come collegamento. Funziona anche con tutte le schermate secondarie MDI.

Altri suggerimenti

Potresti usare un locale (globale non è necessario) gancio per tastiera . È inoltre possibile derivare tutti i moduli MDI Child da una classe base di moduli signle e implementarli lì una volta. Scoprirai che questo design è utile anche per altri problemi.

modifica

I tasti di scelta rapida / i collegamenti a livello di applicazione possono anche essere implementati con l'evento TApplication.OnShortCut. Vedi http://delphi.about.com/od/adptips2004/a/bltip0904_3 htm

F1 è già la scorciatoia della guida standard che attiva TApplication.OnHelp. Quindi forse vuoi usare l'evento OnHelp? E se usi le proprietà HelpFile, HelpContext, HelpType e HelpKeyword probabilmente non avrai nemmeno bisogno di implementare alcun codice.

  

Come faccio a far funzionare l'evento KeyDown in una finestra padre delle applicazioni MDI di Delphi (2007), anche se una finestra figlio è attiva?

Come soluzione più generica (per applicazioni diverse da F1 per assistenza) uso un codice simile a questo per intercettare un evento keydown nel modulo principale. Questo ottiene tutte le chiavi, qualunque cosa accada, anche quando un bambino MDI è attivo. In questo esempio sto facendo il contrario di quello che stai cercando di fare (voglio che il messaggio sia gestito dal mio modulo figlio anziché dal modulo principale), ma il concetto di prendere le chiavi nel genitore è lo stesso).

Application.OnMessage := AppMessage;

procedure TMainForm.Appmessage(var Msg: TMsg; var Handled: Boolean);
var
  message: TWMKey;
begin
  If (msg.message = WM_KEYDOWN) and
     ( LoWord(msg.wparam) = VK_TAB ) and
     (GetKeyState( VK_CONTROL ) < 0 ) and
     Assigned( ActiveMDIChild ) then
  Begin
    Move( msg.message, message.msg, 3*sizeof(Cardinal));
    message.result := 0;
    Handled := ActiveMDIChild.IsShortcut( message );
  End;
end;

L'elaborazione della guida in F1 è integrata in Delphi, quindi tutto ciò che devi fare è gestire correttamente i messaggi di aiuto. Potrebbe non essere sufficiente impostare la proprietà helpfile per l'applicazione. Puoi impostare pagine particolari usando l'aiuto del modulo ??? proprietà.

Fondamentalmente, basta usare il sistema di aiuto fornito e dimenticare il keydown. Questo è Delphi: non devi lavorare sodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top