Domanda

Ho fatto del mio meglio e non riesco a capire cosa è successo qui. Ha funzionato bene in Delphi 4. Dopo l'aggiornamento a Delphi 2009, non so se questo è il modo in cui dovrebbe funzionare, o se è un problema:

Ecco come appare il menu del mio programma in modalità Progettazione in Delphi 2009:

 inserisci qui la descrizione dell'immagine

Nota che ogni parola nel menu principale e nel sottomenu File ha una lettera sottolineata. Dovrebbe essere così. Questa lettera sottolineata si chiama Accelerator Key ed è standard nelle applicazioni Windows in modo da poter utilizzare il tasto Alt e quella lettera per selezionare rapidamente la voce di menu e quindi la voce di sottomenu con la tastiera anziché con il mouse.

Puoi ottenerli in questo modo utilizzando " & amp; " carattere come parte della didascalia dell'oggetto, ad esempio: Salva & amp; As ...

Quando eseguo la mia applicazione e utilizzo il mouse per aprire il menu File, è simile al seguente:

 inserisci qui la descrizione dell'immagine

I caratteri sono sottolineati nel menu principale, ma non sono sottolineati nel menu File.

Se invece utilizzo il tasto Alt-F per aprire il sottomenu File, allora sembra corretto in questo modo:

 inserisci qui la descrizione dell'immagine

e tutte le lettere della chiave dell'acceleratore sono sottolineate correttamente.

Ho giocato con l'opzione AutoHotKeys ma non è questo il problema.

Qualcuno ha riscontrato questo problema prima? L'esempio nella seconda immagine è un comportamento corretto che non conosco? Oppure c'è qualche opzione o errore di codifica che potrei aver perso?


Nov 2009 (un anno dopo): mghie sembra essere arrivata alla radice di questo e ha capito il problema. Vedi la sua risposta accettata di seguito.

È stato utile?

Soluzione

Esiste un'impostazione standard di Windows (sotto le proprietà del display) per nascondere normalmente quegli acceleratori a meno che non venga tenuto premuto il tasto Alt. Ciò spiegherebbe perché l'apertura del menu con Alt + F10 li mostra per te. Forse è questa la causa?

[EDIT]: No, non lo è. Ho appena provato, e un semplice TForm con una voce di menu mostra l'acceleratore, ma non appena aggiungo una TImageList e imposto ImageIndex della singola voce di menu, o semplicemente imposta OwnerDraw su true, l'acceleratore sottolineato scompare. Immagino che sia davvero un bug nel VCL.

A proposito, questo è su Windows XP.

Soluzione:

Ho eseguito il debug di questo utilizzando Delphi 2009 su Windows XP 64 e la causa principale degli acceleratori mancanti sembra essere che Windows invia messaggi WM_DRAWITEM con il flag ODS_NOACCEL , cosa che non dovrebbe fare se il sistema è impostato per mostrare gli acceleratori in ogni momento. Quindi potresti dire che non è un bug VCL, ma un problema di Windows su cui il VCL non funziona.

Tuttavia, puoi aggirarlo nel tuo codice, devi solo ripristinare il flag prima di passare il messaggio al VCL. Sostituisci la finestra proc

protected
  procedure WndProc(var Message: TMessage); override;

in questo modo:

procedure TYourForm.WndProc(var Message: TMessage);
const
  ODS_NOACCEL = $100;
var
  pDIS: PDrawItemStruct;
  ShowAccel: BOOL;
begin
  if (Message.Msg = WM_DRAWITEM) then begin
    pDIS := PDrawItemStruct(Message.LParam);
    if (pDIS^.CtlType = ODT_MENU)
      and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0)
    then begin
      if ShowAccel then
        pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL;
    end;
  end;
  inherited;
end;

Questo è solo un codice dimostrativo, non dovresti chiamare SystemParametersInfo () ogni volta che viene ricevuto un messaggio WM_DRAWITEM , ma una volta all'avvio del programma e quindi ogni volta che il tuo programma riceve un messaggio WM_SETTINGCHANGE .

Altri suggerimenti

È una funzione " " introdotto con Windows 2000:

The Old New Thing: Perché Windows nasconde gli acceleratori da tastiera e mettere a fuoco i rettangoli per impostazione predefinita?

Sembrerebbe che Delphi 4 non supportasse questa funzionalità di Windows.

Per fare in modo che i menu 2000 e XP mostrino i tasti di scelta rapida, fare clic con il pulsante destro del mouse su un punto vuoto del desktop, scegliere Proprietà, fare clic sulla scheda Aspetto e in Effetti, deselezionare Nascondi lettere sottolineate per la navigazione della tastiera fino a quando non premo il tasto Alt tasto . Fai clic su OK due volte.

Non sono sicuro di come farlo in Vista.

Non penso che sia un bug generato da Delphi poiché hai lo stesso comportamento con Notepad su Vista. Anche in Delphi stesso BTW ...
Devo confessare di non aver prestato attenzione prima della tua domanda. Grazie per averlo segnalato.

Come Jim McKeeth ha osservato sopra (correttamente), questo è "di progettazione". comportamento. Se i menu vengono attivati ??tramite l'azione della tastiera, dovrebbero essere mostrati gli acceleratori, ma se attivati ??dal mouse gli acceleratori non vengono mostrati intenzionalmente.

Ho il mio XP configurato per mostrare gli acceleratori in ogni momento, ma un test rapido con quell'opzione modificata conferma che i menu non dovrebbero mostrare sottolineature (Visual Studio ha risposto come mi aspettavo, nessuna sottolineatura quando si utilizza il mouse). Tuttavia, Microsoft Office ignora questa impostazione e mostra sempre le sottolineature. Quindi sembra un bug nel modo in cui i menu sono disegnati in Delphi (non ho alcuna esperienza con Delphi me stesso).

Ho trovato anche l'opzione per Vista: http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html

  

Puoi attivarlo nel nuovo Centro accesso facilitato (vai su Controllo   Pannello, fare clic su Accesso facilitato e quindi su Centro accesso facilitato). Nel   Centro di accesso facilitato, fai clic su Rendi la tastiera più facile da usare e   in fondo selezionare le scorciatoie da tastiera Sottolineato e accedere   casella di controllo chiavi.

Durante ulteriori ricerche ho trovato questo bug correlato sui forum Delphi: http: //qc.codegear.com/wc/qcmain.aspx?d=37403

Sembra che nel tuo caso le finestre secondarie (i menu disegnati) non ricevano o non gestiscano il messaggio WM_UIUPDATESTATE dalla finestra principale, che è ciò che causa il ridisegno con gli acceleratori.

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