2008-11-06 6 views
4

J'ai une application avec un formulaire principal. Dans ce formulaire j'ai placé trois TActionMainMenuBars, parce que l'application fonctionne essentiellement dans trois modes différents.Comment puis-je obtenir des raccourcis pour travailler avec plusieurs objets TActionMainMenuBar dans un seul formulaire?

Les barres de menus sont toutes construites à partir d'actions stockées (mandatées) dans un TActionManager sur le formulaire principal. Le gestionnaire d'actions fait référence à des listes d'actions sur divers autres formulaires.

Les barres de menus sont ensuite affichées + activées et masquées + désactivées, de sorte qu'une seule est visible à la fois. Cela fonctionne bien, avec les actions qui fonctionnent si on clique dessus ou si on navigue en utilisant ALT puis les touches fléchées ou le caractère souligné dans leur légende.

Le problème est cependant que les actions ne semblent pas répondre aux pressions de touche de raccourci.

Est-ce que quelqu'un sait ce qui pourrait causer les actions à ne pas déclencher?

Je fournirai volontiers plus d'informations si nécessaire, je suis en train de programmer dans C++ Builder 2007 RAD Studio dans WinXP SP3.

Merci à tous ceux qui le lisent, ou même le lit et propose une solution!

PeterMJ

Mise à jour: je ne ai pas dit que les raccourcis dans les différents menus se chevauchent en ce que les mêmes raccourcis sont utilisés dans les différents menus pour des actions différentes, mais tous les raccourcis sont uniques dans leur propre menu.

J'ai également depuis simplifié le problème dans une application de test, avec deux TActionMainMenuBars, et toutes les actions partagées un seul gestionnaire d'actions. Dans ce cas, j'ai deux actions avec le même raccourci. Ils sont placés sur des menus différents. Ensuite, un menu est activé à la fois. Dans ce cas, les raccourcis fonctionnent, MAIS lors de l'utilisation du raccourci commun, seule l'action dans le premier menu est déclenchée, même lorsque le menu de maintien est désactivé.

Ceci est légèrement meilleur que mon problème actuel en ce que certaines actions se déclenchent, mais souligne que les actions ne sont pas déclenchées correctement. Est-ce que quelqu'un n'est pas une solution?

+0

Désolé de savoir down, cliqué de mauvais endroit! –

Répondre

0

Assurez-vous que les actions que vous souhaitez utiliser sont réellement activées.
Si vous désactivez toutes les actions d'un objet ActionMainMenuBar lorsque vous désactivez la barre, vous avez un problème.
Veillez également à utiliser les raccourcis disponibles, sans entrer en conflit avec les raccourcis globaux de Windows.
À part ça, je ne vois pas pourquoi ça ne marcherait pas. J'ai essayé avec 2 ActionMainMenuBars dans Delphi et les raccourcis ont fonctionné.

+0

Merci de l'avoir essayé, cela m'a poussé à écrire une application de test avec deux barres de menus et des actions dans un seul gestionnaire d'actions. Comme vous pouvez le voir dans la mise à jour, cela ne fonctionne pas non plus. –

2

Activer/désactiver ou afficher/masquer un ActioneMenuBar n'a aucune conséquence sur les actions de la barre de menus. Si vous souhaitez effectuer certaines actions non disponibles dans un contexte/une situation spécifique, vous devez implémenter l'événement "OnUpdate" de l'action elle-même ou de la liste d'actions ou du gestionnaire d'actions dont elle fait partie. Par exemple, en utilisant l'événement OnUpdate suivant de votre gestionnaire d'actions, vous pouvez utiliser un TCheckBox pour décider laquelle des deux actions est actuellement activée.

if CheckBox1.Checked then 
    begin 
    Action1.Enabled:= False; 
    Action2.Enabled:= True; 
    end 
    else 
    begin 
    Action1.Enabled:= True; 
    Action2.Enabled:= False; 
    end; 

Imaginez, les deux actions ont le raccourci "Ctrl + A" attribué, cela signifie que en appuyant sur Ctrl + A n'activer Action1 lorsque CheckBox1 n'est pas cochée.

Cependant, il y a toujours un problème. La VCL arrêtera de rechercher des actions avec un certain raccourci une fois qu'elle a trouvé une action avec le raccourci dans un gestionnaire d'actions ou une liste d'actions dans le formulaire actuel, même si l'action trouvée n'est pas activée.

Pour résoudre ce problème, vous pouvez utiliser l'événement OnUpdate pour définir et réinitialiser dynamiquement la propriété shortcut des actions comme celle-ci:

if CheckBox1.Checked then 
    begin 
    Action1.Enabled:= False; 
    Action1.ShortCut:= scNone; 

    Action2.Enabled:= True; 
    Action2.ShortCut:= ShortCut(ord('A'), [ssCtrl]); 
    end 
    else 
    begin 
    Action2.Enabled:= False; 
    Action2.ShortCut:= scNone; 

    Action1.Enabled:= True; 
    Action1.ShortCut:= ShortCut(ord('A'), [ssCtrl]); 
    end; 

En utilisant ce code, en appuyant sur Ctrl + A activera Action2, si CheckBox1 est vérifié et activera Action1, si CheckBox1 n'est pas cochée. Vous n'avez pas besoin d'appeler explicitement l'événement OnUpdate d'une liste d'actions ou d'un gestionnaire d'actions. L'événement est déclenché régulièrement lorsque l'application est inactive et en attente de la saisie par l'utilisateur.

Questions connexes