Question

J'ai fait de mon mieux et je ne peux pas comprendre ce qui s'est passé ici. Cela fonctionnait bien dans Delphi 4. Après la mise à niveau vers Delphi 2009, je ne sais pas si c’est comme cela que cela est censé fonctionner ou si c’est un problème:

Voici à quoi ressemble le menu de mon programme en mode Création sous Delphi 2009:

 entrer la description de l'image ici

Notez que chaque mot du menu principal et du sous-menu Fichier comporte une lettre soulignée. C'est supposé être comme ça. Cette lettre soulignée s'appelle la touche d'accélérateur. Elle est standard dans les applications Windows. Vous pouvez donc utiliser la touche Alt et cette lettre pour sélectionner rapidement l'élément de menu, puis l'élément de sous-menu avec le clavier plutôt qu'avec votre souris.

Vous les obtenez de cette façon en utilisant les " & amp; " caractère faisant partie de la légende de l'élément, par exemple: Enregistrer & amp; sous ...

Lorsque j'exécute mon application et que j'utilise le souris pour ouvrir le menu Fichier, il se présente comme suit:

 entrer la description de l'image ici

Les caractères sont soulignés dans le menu principal, mais pas dans le menu Fichier.

Si, au lieu de cela, j'utilise la touche Alt-F pour ouvrir le sous-menu Fichier, alors cela ressemble à ceci:

 entrer la description de l'image ici

et toutes les lettres de la touche d’accélérateur sont correctement soulignées.

J'ai joué avec l'option AutoHotKeys mais ce n'est pas le problème.

Est-ce que quelqu'un a déjà rencontré ce problème? Est-ce que l'exemple dans la 2ème image est un comportement correct que je ne connais pas? Ou y a-t-il une option ou une erreur de codage que j'ai peut-être manquée?

Nov 2009 (un an plus tard): mghie semble avoir atteint le fond du problème et compris le problème. Voir sa réponse acceptée ci-dessous.

Était-ce utile?

La solution

Un paramètre Windows standard (sous les propriétés d'affichage) permet de masquer normalement ces accélérateurs sauf si vous maintenez la touche Alt enfoncée. Cela expliquerait pourquoi l'ouverture du menu avec Alt + F10 les montre pour vous. Peut-être que c'est la cause?

[EDIT]: Non, ce n'est pas. Je viens d’essayer, et un simple TForm avec un élément de menu affiche l’accélérateur, mais dès que j’ajoute une TImageList et que je définis le ImageIndex de l’élément de menu unique, ou que je règle simplement OwnerDraw sur true, le soulignement de l’accélérateur disparaît. Je suppose que c’est vraiment un bug de la VCL.

BTW, il s’agit de Windows XP.

Solution de contournement:

J'ai débogué cela avec Delphi 2009 sous Windows XP 64 et la cause principale des accélérateurs manquants semble être que Windows envoie des messages WM_DRAWITEM avec l'indicateur ODS_NOACCEL . , ce qui ne devrait pas être le cas si le système est configuré pour afficher les accélérateurs à tout moment. On peut donc dire que ce n’est pas un bogue de la VCL, mais un problème de Windows sur lequel la VCL ne fonctionne pas.

Cependant, vous pouvez contourner ce problème dans votre propre code, il vous suffit de réinitialiser l'indicateur avant de transmettre le message à la VCL. Remplacer la fenêtre proc

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

comme ça:

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;

Ceci est uniquement du code de démonstration, vous ne devez pas appeler SystemParametersInfo () chaque fois qu'un message WM_DRAWITEM est reçu, mais une fois au début du programme, puis à chaque fois que votre programme reçoit un message WM_SETTINGCHANGE .

Autres conseils

C’est une "fonctionnalité" introduit avec Windows 2000:

L'ancienne nouvelle chose: Pourquoi Windows masque-t-il les raccourcis clavier? et mettre au point les rectangles par défaut?

Il semblerait que Delphi 4 ne prenne pas en charge cette fonctionnalité Windows.

Pour que les menus 2000 et XP affichent les touches de raccourci, cliquez avec le bouton droit de la souris sur un emplacement vide du bureau, choisissez Propriétés, cliquez sur l'onglet Apparence, puis sous Effets, décochez Masquer les lettres soulignées pour une navigation au clavier jusqu'à ce que j'appuie sur la touche Alt. Clé . Cliquez deux fois sur OK.

Vous ne savez pas comment procéder sous Vista.

Je ne pense pas que ce soit un bogue généré par Delphi, car vous avez le même comportement avec Notepad sous Vista. Aussi dans Delphi même BTW ...
Je dois avouer que je n'ai pas fait attention avant votre question. Merci de le signaler.

Comme Jim McKeeth l’a noté (correctement) ci-dessus, il s’agit "de par sa conception". comportement. Si les menus sont déclenchés par une action du clavier, les accélérateurs doivent être affichés, mais s'ils sont déclenchés par la souris, les accélérateurs ne sont pas affichés intentionnellement.

Mon XP est configuré pour afficher les accélérateurs à tout moment, mais un test rapide avec cette option modifiée confirme que les menus ne doivent pas non plus afficher les soulignés (Visual Studio a répondu comme je l’attendais, pas de soulignement lors de l’utilisation de la souris). Toutefois, Microsoft Office ignore ce paramètre et affiche toujours les soulignés. Cela ressemble donc à un bug dans la façon dont les menus sont dessinés dans Delphi (je n'ai aucune expérience avec Delphi moi-même).

J'ai également trouvé l'option pour Vista: http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html

  

Vous pouvez l'activer dans le nouveau Centre de facilité d'accès (allez à Contrôle   Panneau de configuration, cliquez sur Facilité d’accès, puis sur Facilité d’accès au centre). Dans   la facilité d'accès, cliquez sur Rendre le clavier plus facile à utiliser, puis   tout en bas, sélectionnez les raccourcis clavier Souligné et accédez à   la case à cocher des clés.

Lors de mes recherches ultérieures, j'ai trouvé ce bogue associé sur les forums Delphi: http: //qc.codegear.com/wc/qcmain.aspx?d=37403

Dans votre cas, il semble que les fenêtres enfants (les menus dessinés) ne reçoivent pas ou ne traitent pas le message WM_UIUPDATESTATE à partir de la fenêtre mère, ce qui explique le rafraîchissement avec les accélérateurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top