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 Réponses :
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);
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.
Si vous écrivez les gestionnaires de remplacement vous-même, vous pouvez effectuer ce qui suit: p>
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. P> LI>
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. P> li> ul>
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é. P>
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: p> 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. p> puis sur le gestionnaire SETONClick, vous pourrez simplement stocker votre gestionnaire d'événements dans la liste interne. P> Maintenant, vous devrez remplacer la procédure de clic afin d'invoquer chaque délégué (chaque gestionnaire d'événements) à son tour. p> et cela le fera. P> 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: p> et il sera automatiquement enchaîné au reste de gestionnaires d'événements. p> p>
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 i>, mais Delphi n'a pas cette fonctionnalité.