2010-11-26 18 views
2

Je suis en train d'ajouter dynamiquement actionitems, je peux ajouter l'article et il fonctionne quand je fais ceci:Comment puis-je ajouter programatically actions à un gestionnaire d'action dans Delphi 2010

HostActionItem := ActionManager.ActionBars[0].Items[0].Items[2]; 
    NewItem := HostAction.Items.Add; 
    NewItem.Action := MyActionToPerform; 
    NewItem.Caption := Description; 
    NewItem.ImageIndex := 1; 
    NewItem.Tag := 13; 

Cependant, lorsque l'action Exécuter feux de méthode je tente d'obtenir le ActionComponent de l'objet de l'expéditeur comme ceci:

if (Sender is TAction) then 
    tag := (Sender As TAction).ActionComponent.Tag; 

Mais le ActionComponent est toujours nul. Pourquoi le composant ActionComponent n'est pas initialisé?

+1

_ "Pourquoi le composant ActionComponent n'est pas initialisé?" _ Semble être la vraie question ici, plutôt que de savoir comment ajouter des actions à un gestionnaire d'actions. En passant, essayez d'utiliser l'action 'Tag' et si vous avez besoin de tags différents pour la même action, cela peut-être symptomatique, vous avez besoin d'une autre action, au lieu de créer un gestionnaire d'événements" dieu "(http: //en.wikipedia. org/wiki/God_object). – Trinidad

+0

Désolé de confondre la question en la formulant comme je l'ai fait. Essentiellement, vous avez raison. Je suis à la recherche d'actions dynamiques et j'ai donc besoin d'un gestionnaire d'événements assez flexible. Suggérez-vous de créer dynamiquement les actions sous-jacentes ou existe-t-il une meilleure façon de le faire? –

Répondre

5

réponse courte:

Vous attendez un TActionClientItem pour apparaître comme ActionComponent d'un TAction. Cela n'arrivera pas puisque TActionClientItem ne descend pas de TComponent.

réponse plus longue:

Je crois que vous ajoutez votre article à une barre de menu. Il semble être par conception qu'un TAction lié à un élément de menu ne supporterait pas le ActionComponent. Les éléments d'une barre de menus sont de type TActionClientItem. C'est un 'objet de collection', pas un 'composant'. Par conséquent, le menu ne peut pas remplir le paramètre ActionComponent avec l'élément de menu lors de l'appel de la méthode Execute du lien d'action de l'élément sélectionné. Si cela vous semble confus, je suppose que les citations ci-dessous à partir de la source VCL préciserait:

TBasicActionLink.Execute méthode:

function Execute(AComponent: TComponent = nil): Boolean; virtual; 

Le composant passé est affecté à FAction.ActionComponent avant qu'il ne soit exécuté.

Comment il est appelé à partir TCustomActionMenuBar.ExecAction:

FSelectedItem.ActionLink.Execute; 

Pour la question dans le titre, je ne pense pas que vous faites quelque chose de mal, à part la mise en Caption et ImageIndex d'un TActionClientItem est inutile, comme c'est le titre et l'image de TAction qui seront montrés.

+0

Merci pour la réponse. J'ai mis la légende, imageindex & tag parce que je réutilise la même action pour plusieurs liens d'action. Est-ce que je fais ça à la dure? Y a-t-il une meilleure façon d'essayer de réaliser des actions dynamiques? –

+0

@Leigh - Je ne vois pas de moyen plus facile .. ajouter un élément client et l'associer à une action, c'est à peu près tout. Notez que si vous réutilisez des actions, vous ne serez pas en mesure d'offrir la capacité de personnalisation intégrée. Et si vous avez besoin de différencier la source dans OnExecute, la seule manière semble être d'utiliser une action par élément. –

+0

Merci, je maintiens juste des actions séparées pour les éléments créés dynamiquement et cela fonctionne bien. –