<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - padbrain</title>
		<link>https://www.developpez.net/forums/blogs/1388908-padbrain/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Tue, 08 Sep 2026 17:04:51 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - padbrain</title>
			<link>https://www.developpez.net/forums/blogs/1388908-padbrain/</link>
		</image>
		<item>
			<title><![CDATA[Gestionnaire d'évènements personnalisés]]></title>
			<link>https://www.developpez.net/forums/blogs/1388908-padbrain/b9902/gestionnaire-d-evenements-personnalises/</link>
			<pubDate>Fri, 20 Nov 2020 14:15:20 GMT</pubDate>
			<description>Suite à la demande d’Ézéchias...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Suite à la demande d’Ézéchias sur le forum Windev, je vous livre ma version d'un gestionnaire d'évènements personnalisés afin de pallier ce manque dans l'AGL de PC Soft.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				<div class="bbcode_postedby">
					<img src="https://forum.developpez.be/images/misc/quote_icon.png" alt="Citation" /> Envoyé par <strong>denouezechias</strong>
					<a href="showthread.php?p=11648406#post11648406" rel="nofollow"><img class="inlineimg" src="https://forum.developpez.be/images/buttons/viewpost-right.png" alt="Voir le message" /></a>
				</div>
				<div class="message">Bonjour,<br />
Je suis en train de convertir un script qui a été ecrit en Visual basic et j'ai besoin d'aide pour ce genre d'instruction ci dessous:<br />
<i>AddHandler event, AddressOf eventhandler  </i><br />
<br />
Merci d'avance</div>
			
		</div>
	</div>
</div>La solution est, somme toute, triviale. Une classe va se charger de répertorier une procédure à exécuter pour chaque évènement dont le nom pourra être défini.<br />
<br />
C'est parti :<br />
<br />
tout d'abord, la déclaration de la classe cEventHandler, avec ces membres et sa méthode d'instanciation globale afin de n'instancier qu'un seul gestionnaire d'évènements.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td valign="top"><pre style="margin: 0">
cEventHandler is Class
	
	PRIVATE
		//	Enregistre la liste des écouteurs
		_events is associative array of Procédures
		
		GLOBAL
			_instance is cEventHandler dynamic
	
END

PROCÉDURE PRIVATE Constructor()
//     Rien ici


PROCÉDURE PUBLIC GLOBAL getInstance()
IF _instance = Null THEN
	_instance &lt;- new cEventHandler
END
RESULT _instance</pre></td></tr></table></pre>
</div>Une fois le gestionnaire d'évènements instancié, nous voulons pouvoir inscrire un évènement personnel avec le traitement qui lui sera associé :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">
PROCÉDURE onEventDo(pEvent is personalEvent, pCallable is Procédure)
_events[pEvent..Name] = pCallable</pre></td></tr></table></pre>
</div>Ici, le paramètre pEvent est une énumération afin de s'assurer que le nom de l'évènement est sans équivoque.<br />
<br />
Maintenant que l'évènement est enregistré, il suffit de déclencher un appel vers ce dernier afin d'exécuter la procédure associée :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td valign="top"><pre style="margin: 0">
PROCÉDURE emit(pEvent is personalEvent, *)

	returnedProcess is Procédure &lt;- _getProcess(pEvent)
	IF returnedProcess &lt;&gt; Null THEN
		SWITCH MyParameters..Count
			CASE &gt; 1
				WHEN EXCEPTION IN
					returnedProcess(MyParameters[2 TO])
					RESULT True
				DO
					RESULT returnedProcess(MyParameters[2 TO])
				END
				
			OTHER CASE
				WHEN EXCEPTION IN
					returnedProcess()
					RESULT True
				DO
					RESULT returnedProcess()
				END
				
		END
	END
RESULT Null</pre></td></tr></table></pre>
</div>Que fait cette méthode :<br />
<br />
- Si l'évènement personnalisé existe dans la liste des évènements enregistrés :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">
PROCÉDURE PRIVATE _hasEvent(pEvent is personalEvent) : boolean
RESULT _events[pEvent..Name]..Exist</pre></td></tr></table></pre>
</div>- il est récupéré pour être exécuté<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0">
PROCÉDURE PRIVATE _getProcess(pEvent is personalEvent) : Procédure

pProc is Procédure = Null
IF _hasEvent(pEvent) THEN
	pProc = _events[pEvent..Name]
END
RESULT pProc</pre></td></tr></table></pre>
</div>Enfin, une méthode permettant de supprimer un évènement déjà enregistré dans la liste :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">
PROCÉDURE deleteEvent(pEvent is personalEvent)
IF _hasEvent(pEvent) THEN
	_events.delete(pEvent)
END</pre></td></tr></table></pre>
</div>L'utilisation de ce gestionnaire est alors simple : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br /></div></td><td valign="top"><pre style="margin: 0">

//     Énumération des évènements
personalEvent est énumération
     dire_bonjour
     dire_autre_chose
FIN

//     Instanciation du gestionnaire d'évènements
MonGestionnaireDevenementsPersos est un cEventHandler dynamique &lt;- cEventHandler.getInstance()

//     Définition des procédures associées aux évènements
     // Sans paramètres
     PROCEDURE INTERNE hello()
     trace(&quot;Hello world !&quot;)
     FIN

     // Avec paramètres
     PROCEDURE INTERNE tell(*)
     POUR indexParam = 1 _A_ MesParamètres..occurence
     trace(MesParamètres[indexParam])
     FIN
     FIN

//     Inscrire les évènements auprès du gestionnaire
MonGestionnaireDevenementsPersos.onEventDo(dire_bonjour, hello)
MonGestionnaireDevenementsPersos.onEventDo(dire_autre_chose, tell)

//     Déclencher l'évènement
MonGestionnaireDevenementsPersos.emit(dire_bonjour)
// La trace vaut
// Hello world !

MonGestionnaireDevenementsPersos.emit(dire_autre_chose, &quot;Hello&quot;, &quot;world&quot;, &quot;!&quot;)
// La trace vaut
// Hello
// world
// !</pre></td></tr></table></pre>
</div>Voilà, il peut sans doute être amélioré mais est déjà bien fonctionnel en l'état.<br />
J'espère qu'il pourra être utile à certains d'entre vous.</blockquote>

]]></content:encoded>
			<dc:creator>padbrain</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/1388908-padbrain/b9902/gestionnaire-d-evenements-personnalises/</guid>
		</item>
	</channel>
</rss>
