11
votes

Delphi: Comment attribuer dynamiquement un gestionnaire d'événements sans écraser le gestionnaire d'événements existant?

J'ai besoin de boucler à travers des composants et d'attribuer un gestionnaire d'événements (par exemple, attribuer de manière dynamique l'événement Onclick pour tous les Tbutton à

ShowMessage('This is Button1'); // design time event handler code
ShowMessage('You clicked on ' + (Sender as TButton).Name); // runtime added


3 commentaires

Question similaire (avec le code complet comme réponse): Stackoverflow.com/Questtions/2441672/...


Jetez un coup d'œil sur la source de l'application, il y a le même événement que vous voulez.


Le terme général pour ce que vous voulez est événements de multidiffusion , mais Delphi n'a pas cette fonctionnalité.


3 Réponses :


17
votes

Vous pouvez rechercher une affectation d'OnClick avant de l'écraser, persister cela et l'utiliser dans votre nouveau gestionnaire - enchaînant essentiellement les événements.

Quelque chose comme ceci: P>

  if assigned(original) then original(Sender);


1 commentaires

Merci pour l'idée, cela devrait fonctionner. De plus, l'idée de collecte (un nombre de génériques par exemple) est très bonne.



2
votes

Si vous écrivez les gestionnaires de remplacement vous-même, vous pouvez effectuer ce qui suit:

  • Avant d'affectation du nouveau gestionnaire, stockez une référence à l'objet et à une référence au gestionnaire d'origine dans une liste ou une autre structure.

  • Dans votre gestionnaire de remplacement, le code inclus pour vérifier la liste pour voir si l'objet actuel a une entrée. Si tel est le cas, appelez la méthode stockée avant de faire votre propre travail.

    Ceci est assez léger (une liste où chaque entrée est deux pointeurs). Avec un peu de travail supplémentaire (pour soutenir la commande), vous pouvez probablement même chaîner plus d'un gestionnaire remplacé.


0 commentaires

1
votes

Vous ne pouvez pas le faire directement car Delphi ne prend pas en charge les événements chaînés (je suppose que VCL Delphi).

Donc, tout ce que vous voulez faire qui consiste à attribuer directement l'événement OnClick ne fonctionnera pas. Ce que vous pourriez faire est de créer un composant intercepteur, c'est-à-dire quelque chose avec cette signature: xxx

Vous devrez remplacer la propriété OnClick afin que l'événement écriture stocke l'événement. gestionnaire dans une liste interne, disponible en classe. xxx

puis sur le gestionnaire SETONClick, vous pourrez simplement stocker votre gestionnaire d'événements dans la liste interne.

Maintenant, vous devrez remplacer la procédure de clic afin d'invoquer chaque délégué (chaque gestionnaire d'événements) à son tour. xxx

et cela le fera.

Notez que, après tout, vous serez un type de sous-classement de la classe Tbutton, même si vous utilisez le même nom ... Quoi qu'il en soit, c'est la meilleure solution que je puisse penser. La chose cool à ce sujet est que vous pouvez toujours utiliser des missions sans avoir à connaître des événements chaînés, vous pouvez simplement faire: xxx

et il sera automatiquement enchaîné au reste de gestionnaires d'événements.


0 commentaires