Question

J'utilise Delpho 2006. Le scénario:

Sur le module de données que j'ai un ActionList. L'une des actions a un raccourci Ctrl + F4 et je veux avoir un raccourci secondaire Ctrl + W. J'ai essayé tous les éléments suivants:

Ajout Ctrl + W pour les actions de la liste dans l'EDI.

Ajout dans la procédure DataModuleCreate en utilisant soit

ActFileCloseFile.SecondaryShortCuts.Add('Ctrl+W');

ou

ActFileCloseFile.SecondaryShortCuts.AddObject('Ctrl+W',
  TObject(Menus.ShortCut(87, [ssCtrl])));

En utilisant ces deux méthodes dans la procédure Créer ou FormShow de la forme où il sera utilisé.

Le raccourci primaire fonctionne toujours, mais pas le secondaire.

Quand je mets le ActionList sur la principale forme à la place du module de données, il fonctionne en ajoutant simplement Ctrl + W dans l'IDE. Que dois-je fait de mal?

Était-ce utile?

La solution

La solution la plus élégante trouvé à ce jour est le suivant:

Sur la forme que vous voulez gérer le SecondaryShortCut, ajoutez à l'événement OnShortCut:

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := dmDataModule.ActionList1.IsShortCut(Msg);
end;

Alternative:

(Ce n'est pas une vraie solution, mais une solution de contournement.)

Mettre une liste d'actions sur la forme qui a une action identique à celui du module de données. Dans sa méthode execute et mettre à jour des événements il transmet uniquement les événements à l'action du module de données. Les menus du formulaire utilisent l'action locale.

Dans ce cas, il suffit d'ajouter Ctrl + W à la propriété SecondaryShortCuts en utilisant l'EDI.

Il est évident que, lorsque l'action sur les changements du module de données, je dois changer toutes les actions locales aussi.

Autres conseils

Pas une solution réelle, mais si vous créez le datamodule à partir du mainform cela fonctionne:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FDataModule := TMyDataModule.Create(self);
  TMyButton.Action := FDataModule.TheAction;
end;


procedure TMyDataModule.DataModuleCreate(Sender: TObject);
begin
  TheAction.SecondaryShortCuts.Add('Ctrl+W');
end;

Je pense que les raccourcis sont traités par la forme qui a le focus. Alors yo probablement obtenir les mêmes problèmes si vous les utilisez sous une autre forme.

Réponse courte:. Actions raccourcis ne pas automatiquement feu à travers les formes et les données-modules

Si vous suivez les instructions de la question, vous constaterez que même les feux primaires de raccourci. En effet, une étape clé a été laissé des instructions. Celui qui servira à expliquer pourquoi OP a connu la mise à feu primaire court-circuiter et non le secondaire.

Si vous incluez les étapes supplémentaires:

  • Ajoutez un menu à la forme.
  • et lier un élément de menu à l'action.

Alors le raccourci primaire sera en mesure de tirer l'action. En effet, le volet d'action pousse ses paramètres à l'élément de menu (y compris la propriété ShortCut). Cependant, ne met pas en œuvre TMenuItem le concept de raccourcis secondaires. Quelle est la raison pour laquelle on travaille et pas l'autre.


Pause pour envisager une application avec de nombreuses formes et données-modules; et l'implication si l'action des raccourcis pourrait tirer à travers tous. Il devrait être assez évident qu'ils ne devraient pas être en mesure feu automatiquement sans code explicite pour lui permettre. Vous ne voudriez pas une forme de fond faire un tas de choses parce que ses touches de raccourci configurées arriver à être enfoncée dans le cadre d'autres travaux sans rapport.

Le rel="nofollow"> souligne l'avantage de mettre les listes d'action sur les données -modules. Mais ne semble pas offrir aucune explication comment utiliser les actions avec des raccourcis sur un module de données correctement . Certes, rien est mentionné dans les endroits prévus, à savoir: ShortCut et SecondaryShortcuts . (Je serais déçu, mais mes attentes de la documentation décent ont été traînés assez bas.)

...

Qu'est-ce que devrait être fait pour obtenir des actions avec des raccourcis de travail sur les formes et les données modules?

Je l'ai fait un peu d'enquête et a trouvé quelques options. Comme toujours, évaluer la relative du compromis à ce que vous essayez d'atteindre.

  • Lorsque vous déposez une liste d'actions sur un formulaire (non principal), tous les raccourcis fonctionnent comme prévu. Tel est le scénario le plus courant et applique lorsque les actions sont locales et forme spécifique.

  • Lorsque vous déposez une liste d'actions sur le formulaire principal, tous ces raccourcis seront en mesure de tirer de toute autre forme. Ce qui est excellent pour les raccourcis d'application à l'échelle telles que l'ouverture d'autres formes.

NOTE: Il y a une séquence de priorités à où est testé un raccourci en premier. Donc, si la forme active a un raccourci correspondant à une de la forme principale, le raccourci est traitée localement. Et la principale forme sera évidemment pas l'obtenir.

  • Lorsqu'un formulaire est testé pour voir si elle gère un raccourci, tous les composants appartenant sont également vérifiés. (Ceci est en fait pourquoi les deux premiers au-dessus de travail.) Cela signifie que la mise simplement de votre-Owner module de données de façon appropriée, permettre à ses raccourcis pour appliquer à votre forme choisie.

i.e.. Au lieu de:

Application.CreateForm(TDataModule1, DataModule1);

Vous pouvez utiliser ce qui suit:

DataModule1 := TDataModule1.Create(LocalForm);

Cependant, étant donné que chaque instance d'un module de données peut avoir qu'un seul propriétaire: vous devez créer plusieurs instances pour laisser de multiples formes partagent les raccourcis. Que ce soit une option dépend de votre situation. Cependant, vous pouvez également la principale forme le propriétaire de votre module de données qui serait un peu équivalent à la deuxième option ci-dessus.

  • La dernière option qui offre le plus de contrôle est propre réponse OP. C'est à dire. Toute forme qui doit soutenir « raccourcis externes » peut gérer l'événement OnShortCut avec le code suivant:

Comme on peut le voir dans l'exemple de code, vous pouvez déléguerà plusieurs listes d'actions dans différents endroits en fonction de la priorité que vous choisissez.

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := DataModule1.ActionList3.IsShortCut(Msg);
  Handled := Handled or DataModule2.ActionList1.IsShortCut(Msg);
  Handled := Handled or DataModule1.ActionList1.IsShortCut(Msg);
end;

L'action est avalé par se forme ... Si vous voulez une forme secondaire / châssis / datamodule pour gérer l'action ... Vous devez désactiver le actionList du primaire d'abord ...

Form1.ActionList1.State: = asSuspended;

DataModule1.ActionList1.State: = asNormal;

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