<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Best Practices</title><link>http://blogs.microsoft.fr/pascalbe/category/24.aspx</link><description>Best Practices</description><managingEditor>Pascal Belaud</managingEditor><dc:language>fr-FR</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Pascal Belaud</dc:creator><title>Le congélateur m'a sauver</title><link>http://blogs.microsoft.fr/pascalbe/archive/2006/09/06/45034.aspx</link><pubDate>Wed, 06 Sep 2006 17:29:00 GMT</pubDate><guid>http://blogs.microsoft.fr/pascalbe/archive/2006/09/06/45034.aspx</guid><wfw:comment>http://blogs.microsoft.fr/pascalbe/comments/45034.aspx</wfw:comment><comments>http://blogs.microsoft.fr/pascalbe/archive/2006/09/06/45034.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.microsoft.fr/pascalbe/comments/commentRss/45034.aspx</wfw:commentRss><trackback:ping>http://blogs.microsoft.fr/pascalbe/services/trackbacks/45034.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;FONT face=Verdana color=#000000&gt;&lt;SPAN lang=FR style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: FR"&gt;[&lt;STRONG&gt;UPDATE&lt;/STRONG&gt;] Mon blog a &lt;A href="http://blogs.msdn.com/pascal" target=_blank&gt;&lt;FONT color=#000080 size=2&gt;d&amp;#233;m&amp;#233;nag&amp;#233;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; et ce post est d&amp;#233;sormais disponible &lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/pascal/archive/2006/09/06/750581.aspx" target=_blank&gt;&lt;FONT color=#000080 size=2&gt;ici&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;FONT face=Verdana color=#000000&gt;&lt;SPAN lang=FR style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: FR"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;Je vais vous raconter une petite histoire &amp;#233;tonnante.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Introduction&lt;/STRONG&gt; : quelques jours avant le jeudi 31 ao&amp;#251;t 2006 et de temps en temps seulement, j&amp;#8217;entendais un petit bruit bizarre au niveau du disque dur de mon portable mais cela ne m&amp;#8217;avait pas alert&amp;#233; plus que cela, quelle erreur !&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Acte 1 &lt;/STRONG&gt;: jeudi dernier donc, en voulant mettre &amp;#224; jour mon &lt;A href="http://g.msn.com/8SEENUS020100/DesktopSearch" target=_blank&gt;MSN Search&lt;/A&gt;, je d&amp;#233;cide de le d&amp;#233;sinstaller, supprimer le r&amp;#233;pertoire d&amp;#8217;index puis r&amp;#233;installer la derni&amp;#232;re version. Je d&amp;#233;cide alors de relancer l&amp;#8217;indexation (disk activity intensive of course), qui, g&amp;#233;n&amp;#233;ralement, prend plusieurs heures (1 700 000+ documents &amp;#224; indexer).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Acte 2&lt;/STRONG&gt; : le vendredi matin, je constate que mon laptop est compl&amp;#232;tement fig&amp;#233;. Le plus grave &amp;#233;tant qu&amp;#8217;il &amp;#233;tait fig&amp;#233; &amp;#224; l&amp;#8217;&amp;#233;tape du &lt;A href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chkdsk.mspx?mfr=true" target=_blank&gt;CheckDisk&lt;/A&gt;, preuve que le laptop avait red&amp;#233;marr&amp;#233; tout seul. Pas bon signe pour le disque. J&amp;#8217;arr&amp;#234;te donc ce laptop et au red&amp;#233;marrage de celui-ci, un bruit caract&amp;#233;ristique me glace le sang. Le disque dur est parti en sucette et tout d&amp;#8217;un coup, je r&amp;#233;alise que je n&amp;#8217;ai pas fait de backup depuis bien longtemps&amp;#8230;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Acte 3&lt;/STRONG&gt; : je d&amp;#233;monte le disque dur et je le mets dans un boitier USB externe. M&amp;#234;me constat, un bruit monstrueux et aucun moyen d&amp;#8217;acc&amp;#233;der &amp;#224; mes donn&amp;#233;es. Je suis vert !&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Acte 4&lt;/STRONG&gt; : lundi 04 septembre 2006&amp;nbsp;- 09H00, j&amp;#8217;envoie un mail en interne mais je n&amp;#8217;y crois plus trop&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Acte 5&lt;/STRONG&gt; : je re&amp;#231;ois beaucoup de r&amp;#233;ponses et surtout la r&amp;#233;ponse suivante d'un coll&amp;#232;gue : &amp;#171; Pour te permettre de r&amp;#233;cup&amp;#233;rer les donn&amp;#233;es tu as la technique du &amp;#8216;cong&amp;#233;lo&amp;#8217;. Tu mets ton disque dans un sac de cong&amp;#233;lation HERMETIQUE et tu le laisses au cong&amp;#233;lo une bonne heure et tu devrais pouvoir l&amp;#8217;utiliser ensuite pendant un certain temps (suffisant pour backuper) &amp;#187;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Acte 6&lt;/STRONG&gt; : je n&amp;#8217;ai plus rien &amp;#224; perdre et je me lance. Je mets mon disque dans un sac &amp;#224; cong&amp;#233;lation herm&amp;#233;tique. Je mets ce sac bien ferm&amp;#233; dans un autre sac &amp;#224; cong&amp;#233;lation herm&amp;#233;tique et j&amp;#8217; &amp;#171; enfourne &amp;#187; mon disque vers 09H30. A 10H30, la sonnerie me pr&amp;#233;vient que le disque dur devrait &amp;#234;tre &amp;#224; point. Je le sors d&amp;#233;licatement du cong&amp;#233;lo puis des sacs, je l&amp;#8217;enclenche dans le boitier USB pr&amp;#233;c&amp;#233;dent puis je lance un &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;amp;DisplayLang=en" target=_blank&gt;Robocopy&lt;/A&gt; de tout mon lecteur C: vers un disque plus s&amp;#251;r.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Acte 7 &lt;/STRONG&gt;: vers 18H00, j&amp;#8217;avais r&amp;#233;cup&amp;#233;r&amp;#233; 100% de mes donn&amp;#233;es (25 Go) sans &lt;STRONG&gt;aucune erreur de copie&lt;/STRONG&gt; pendant plus 7H. Le temps de copie a &amp;#233;t&amp;#233; long mais je ne vais pas faire la fine bouche !&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Conclusion &lt;/STRONG&gt;: mon coll&amp;#232;gue a largement m&amp;#233;rit&amp;#233; l&amp;#8217;ap&amp;#233;ro que je lui avais promis si &amp;#231;a marchait. Ca tombe bien, j&amp;#8217;ai aussi des gla&amp;#231;ons dans ce cong&amp;#233;lo (juste &amp;#224; c&amp;#244;t&amp;#233; du routeur) !&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;J&amp;#8217;ai vraiment eu du mal &amp;#224; y croire mais force est de constater que le coup du cong&amp;#233;lo, &amp;#231;a marche ! Si quelqu&amp;#8217;un a une explication scientifique, je suis preneur :-)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;En tout cas, on a fait commander un cong&amp;#233;lo pour chacun de mes&amp;nbsp;coll&amp;#232;gues dans la division, au cas o&amp;#249; !&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.microsoft.fr/pascalbe/aggbug/45034.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Pascal Belaud</dc:creator><title>Web Services Enhancements (WSE) 2.0 SP3 disponible</title><link>http://blogs.microsoft.fr/pascalbe/archive/2005/03/04/806.aspx</link><pubDate>Fri, 04 Mar 2005 19:39:00 GMT</pubDate><guid>http://blogs.microsoft.fr/pascalbe/archive/2005/03/04/806.aspx</guid><wfw:comment>http://blogs.microsoft.fr/pascalbe/comments/806.aspx</wfw:comment><comments>http://blogs.microsoft.fr/pascalbe/archive/2005/03/04/806.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.microsoft.fr/pascalbe/comments/commentRss/806.aspx</wfw:commentRss><trackback:ping>http://blogs.microsoft.fr/pascalbe/services/trackbacks/806.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;[&lt;STRONG&gt;UPDATE&lt;/STRONG&gt;] Mon blog a &lt;A href="http://blogs.msdn.com/pascal" target=_blank&gt;&lt;FONT color=#000080 size=2&gt;d&amp;#233;m&amp;#233;nag&amp;#233;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt; et ce post est d&amp;#233;sormais disponible &lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/pascal/archive/2005/03/04/750526.aspx" target=_blank&gt;&lt;FONT color=#000080 size=2&gt;ici&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Le SP3 des Web Services Enhancements&amp;nbsp;(WSE) 2.0 est maintenant disponible.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Pas de nouveaut&amp;#233;s majeures mais plut&amp;#244;t des am&amp;#233;liorations au niveau performance et s&amp;#233;curit&amp;#233; notamment.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Lien pour t&amp;#233;l&amp;#233;charger le SP3 :&lt;BR&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=1BA1F631-C3E7-420A-BC1E-EF18BAB66122&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=1BA1F631-C3E7-420A-BC1E-EF18BAB66122&amp;amp;displaylang=en&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Lien vers le site WSE :&lt;BR&gt;&lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/webservices/building/wse"&gt;&lt;FONT face=Verdana size=2&gt;http://msdn.microsoft.com/webservices/building/wse&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.microsoft.fr/pascalbe/aggbug/806.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Pascal Belaud</dc:creator><title>Mise en place d'événements/delegates en VB.NET et C#.NET </title><link>http://blogs.microsoft.fr/pascalbe/archive/2004/09/21/227.aspx</link><pubDate>Tue, 21 Sep 2004 21:52:00 GMT</pubDate><guid>http://blogs.microsoft.fr/pascalbe/archive/2004/09/21/227.aspx</guid><wfw:comment>http://blogs.microsoft.fr/pascalbe/comments/227.aspx</wfw:comment><comments>http://blogs.microsoft.fr/pascalbe/archive/2004/09/21/227.aspx#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://blogs.microsoft.fr/pascalbe/comments/commentRss/227.aspx</wfw:commentRss><trackback:ping>http://blogs.microsoft.fr/pascalbe/services/trackbacks/227.aspx</trackback:ping><description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;[&lt;STRONG&gt;UPDATE&lt;/STRONG&gt;] Mon blog a &lt;A href="http://blogs.msdn.com/pascal" target=_blank&gt;d&amp;#233;m&amp;#233;nag&amp;#233;&lt;/A&gt; et ce post est d&amp;#233;sormais disponible &lt;A href="http://blogs.msdn.com/pascal/archive/2004/09/21/750513.aspx" target=_blank&gt;ici&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;Une question qui revient assez souvent dans les newsgroups est :&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Comment mettre en place une communication entre mes classes m&amp;#233;tiers et mes IHM ?&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;Comment faire &amp;#231;a avec la philosophie .NET ?&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;EM&gt;(les exemples de code utilis&amp;#233;s dans cet article&amp;nbsp;sont en libre t&amp;#233;l&amp;#233;chargement&amp;nbsp;&lt;/EM&gt;&lt;A href="http://www.olymars.net/Blogs/EventsDelegates/EventsDelegates.zip"&gt;&lt;EM&gt;ici&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;)&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Un exemple assez classique pour illustrer le propos reste la copie de fichier. L'id&amp;#233;al est de cr&amp;#233;er une classe m&amp;#233;tier qui va s'occuper de la copie du fichier puis de cr&amp;#233;er une IHM qui va consommer cette classe. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Cependant, si le fichier fait 10Mo, il peut &amp;#234;tre utile de pr&amp;#233;senter &amp;#224; l'utilisateur une gauge de progression pour le faire patienter. De plus, si il d&amp;#233;cide d'annuler la copie, il doit pouvoir le faire, ce qui veut dire que l'interface graphique ne doit pas &amp;#234;tre bloqu&amp;#233;e durant cette copie. A titre d'exemple, voici une classe "classique" (&lt;FONT color=#0000ff&gt;Librairie_CS.GestionFichiers&lt;/FONT&gt;&amp;nbsp;ou &lt;FONT color=#ff0000&gt;Librairie_VB.GestionFichiers&lt;/FONT&gt;) permettant de r&amp;#233;aliser cette op&amp;#233;ration de copie :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;using System;&lt;BR&gt;using System.IO;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;namespace Librairie_CS {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;public class GestionFichiers {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private string cheminFichier = string.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public string CheminFichier {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return(this.cheminFichier);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;public GestionFichiers(string cheminFichier) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.cheminFichier = cheminFichier;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;public void CopieFichier(string cheminFichierDestination, bool ecrasement) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On v&amp;#233;rifie si le fichier de destination n'existe pas d&amp;#233;j&amp;#224;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (File.Exists(cheminFichierDestination)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// Si demand&amp;#233;, on &amp;#233;crase le fichier de destination&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (ecrasement) {&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.Delete(cheminFichierDestination);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new IOException(string.Format("Le fichier de destination '{0}' existe d&amp;#233;j&amp;#224;.", cheminFichierDestination));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On ouvre le fichier de destination en &amp;#233;criture&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (FileStream fileStreamDestination = new FileStream(cheminFichierDestination, FileMode.Create, FileAccess.Write)) {&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On ouvre le fichier d'origine en lecture&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (FileStream fileStreamOriginal = new FileStream(this.cheminFichier, FileMode.Open, FileAccess.Read)) {&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On lit le prochain octet&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int octet = fileStreamOriginal.ReadByte();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (octet != -1) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On &amp;#233;crit l'octet&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStreamDestination.WriteByte((byte)octet);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;octet = fileStreamOriginal.ReadByte();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStreamOriginal.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStreamDestination.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Voici le m&amp;#234;me code &amp;#233;crit en VB.NET:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Imports System&lt;BR&gt;Imports System.IO&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Namespace Librairie_VB&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Class GestionFichiers&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private privateCheminFichier As String = String.Empty&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property CheminFichier() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return (Me.privateCheminFichier)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New(ByVal fichier As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.privateCheminFichier = fichier&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub CopieFichier(ByVal cheminFichierDestination As String, ByVal ecrasement As Boolean)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' On v&amp;#233;rifie si le fichier de destination n'existe pas d&amp;#233;j&amp;#224;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If File.Exists(cheminFichierDestination) Then&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' Si demand&amp;#233;, on &amp;#233;crase le fichier de destination&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If ecrasement Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File.Delete(cheminFichierDestination)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw New IOException(String.Format("Le fichier de destination '{0}' existe d&amp;#233;j&amp;#224;.", cheminFichierDestination))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' On ouvre le fichier de destination en &amp;#233;criture&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim fileStreamDestination As New FileStream(cheminFichierDestination, FileMode.Create, FileAccess.Write)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' On ouvre le fichier d'origine en lecture&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim fileStreamOriginal As New FileStream(Me.privateCheminFichier, FileMode.Open, FileAccess.Read)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' On lit le prochain octet&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim octet As Integer = fileStreamOriginal.ReadByte()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; While octet &amp;lt;&amp;gt; -1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' On &amp;#233;crit l'octet&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileStreamDestination.WriteByte(CType(octet, Byte))&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; octet = fileStreamOriginal.ReadByte()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End While&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileStreamOriginal.Close()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileStreamDestination.Close()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Class&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;End Namespace&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Ceci &amp;#233;tant fait, il faudrait maintenant impl&amp;#233;menter trois &amp;#233;v&amp;#233;nements dans nos classes:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;CopieDemarrage&lt;/STRONG&gt; : cet &amp;#233;v&amp;#233;nement devra &amp;#234;tre &amp;#233;mis juste avant le d&amp;#233;marrage proprement dit de l'op&amp;#233;ration de copie. Il devra permettre notament d'informer le client de la taille du fichier &amp;#224; copier&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;CopieEnCours&lt;/STRONG&gt; : cet &amp;#233;v&amp;#233;nement devra &amp;#234;tre &amp;#233;mis &amp;#224; intervalle r&amp;#233;gulier de mani&amp;#232;re &amp;#224; indiquer la progression de la copie. Il devra &amp;#233;galement permettre au client d'annuler l'op&amp;#233;ration en cours&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;CopieFin&lt;/STRONG&gt; : cet &amp;#233;v&amp;#233;nement devra &amp;#234;tre &amp;#233;mis en fin de processus en indiquant le statut final de l'op&amp;#233;ration (Succ&amp;#232;s, Echec, Annulation)&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Pou mettre en place ce genre de choses, il faut passer par des Delegates:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;CopieDemarrageEventHandler&lt;/STRONG&gt;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;CopieEnCoursEventHandler&lt;/STRONG&gt;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;CopieFinEventHandler&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Notez que le plan de nommage utilis&amp;#233; en standard par le .NET Framework consiste &amp;#224; terminer le nom de ses Delegates par &lt;STRONG&gt;EventHandler&lt;/STRONG&gt;. Une fois les Delegates d&amp;#233;clar&amp;#233;s, il faut ensuite d&amp;#233;clarer les &amp;#233;v&amp;#233;nements eux-m&amp;#234;mes. Les &amp;#233;v&amp;#233;nements que nous allons d&amp;#233;clar&amp;#233;s auront pour type les Delegates pr&amp;#233;c&amp;#233;dents. Voici les d&amp;#233;clarations que nous allons utiliser :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;namespace Librairie_CS {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;STRONG&gt;&amp;nbsp;public delegate void CopieDemarrageEventHandler(object sender, CopieDemarrageEventArgs e);&lt;BR&gt;&amp;nbsp;public delegate void CopieEnCoursEventHandler(object sender, CopieEnCoursEventArgs e);&lt;BR&gt;&amp;nbsp;public delegate void CopieFinEventHandler(object sender, CopieFinEventArgs e);&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;public class GestionFichiers {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;public event CopieDemarrageEventHandler CopieDemarrage = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public event CopieEnCoursEventHandler CopieEnCours = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public event CopieFinEventHandler CopieFin = null;&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Namespace Librairie_VB&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Delegate Sub CopieDemarrageEventHandler(ByVal sender As Object, ByVal e As CopieDemarrageEventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Delegate Sub CopieEnCoursEventHandler(ByVal sender As Object, ByVal e As CopieEnCoursEventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Delegate Sub CopieFinEventHandler(ByVal sender As Object, ByVal e As CopieFinEventArgs)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Class GestionFichiers&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Event CopieDemarrage As CopieDemarrageEventHandler&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Event CopieEnCours As CopieEnCoursEventHandler&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Event CopieFin As CopieFinEventHandler&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Notons au passage que la cr&amp;#233;ation de Delegate n'est pas obligatoire mais que le compilateur VB.NET en cr&amp;#233;era un de toute fa&amp;#231;on pour &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;vous. Autant bien comprendre cette notion et les &amp;#233;crire nous m&amp;#234;me... Exemple :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&amp;lt;&lt;STRONG&gt;Apart&amp;#233;&lt;/STRONG&gt;&amp;gt;&lt;BR&gt;Imaginons que nous d&amp;#233;clarions un Event en VB.NET comme suit :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Event Test(ByVal monParam As Integer)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;L'introspection de la DLL g&amp;#233;n&amp;#233;r&amp;#233;e gr&amp;#226;ce &amp;#224; &lt;STRONG&gt;&lt;A href="http://msdn.microsoft.com/library/en-us/cptutorials/html/ildasm_introduction.asp"&gt;ILDASM&lt;/A&gt;&lt;/STRONG&gt;, nous permet de d&amp;#233;couvrir que le compilateur a effectivement boss&amp;#233; pour nous en cr&amp;#233;ant le Delegate directement au niveau du code IL :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#a52a2a size=2&gt;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |___[CLS] &lt;STRONG&gt;&lt;U&gt;TestEventHandler&lt;/U&gt;&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .class nested public auto ansi sealed &lt;BR&gt;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extends [mscorlib]System.&lt;STRONG&gt;&lt;U&gt;MulticastDelegate&lt;/U&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana color=#000000 size=2&gt;puis&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;FONT face="Courier New" color=#a52a2a size=2&gt;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |___[FLD] &lt;STRONG&gt;&lt;U&gt;TestEvent&lt;/U&gt;&lt;/STRONG&gt; : private class Librairie_VB.GestionFichiers/&lt;STRONG&gt;&lt;U&gt;TestEventHandler&lt;/U&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&amp;lt;&lt;STRONG&gt;/Apart&amp;#233;&lt;/STRONG&gt;&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Revenons maintenant &amp;#224; nos moutons. Vous avez certainement remarqu&amp;#233; que la d&amp;#233;claration des signatures de mes Delegates (et donc de mes &amp;#233;v&amp;#233;nements in fine) avait l'air de suivre une r&amp;#232;gle commune:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#0000ff&gt;(object sender, xxxEventArgs e)&lt;/FONT&gt;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#ff0000&gt;(ByVal sender As Object, ByVal e As xxxEventArgs)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Le premier argument appel&amp;#233; &lt;STRONG&gt;sender&lt;/STRONG&gt;&amp;nbsp;permet &amp;#224; l'abonn&amp;#233;&amp;nbsp;de l'&amp;#233;v&amp;#233;nement de conna&amp;#238;tre pr&amp;#233;cis&amp;#233;ment l'instance de l'objet qui a &amp;#233;mis l'&amp;#233;v&amp;#233;nement. A quoi cela peut-il servir me direz-vous ?&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Et bien imaginons un instant que je poss&amp;#232;de deux instances d'un m&amp;#234;me objet, &lt;STRONG&gt;Instance1&lt;/STRONG&gt; et &lt;STRONG&gt;Instance2&lt;/STRONG&gt;, et que je souhaite m'abonner &amp;#224; l'&amp;#233;v&amp;#233;nement &lt;STRONG&gt;NouveauButPourLOM&lt;/STRONG&gt;. Comme dans mon cas le traitement que j'ai &amp;#224; faire dans cet &amp;#233;v&amp;#233;nement c&amp;#244;t&amp;#233; abonn&amp;#233; est identique pour les deux instances, je me dis que cela serait sympa de n'utiliser qu'une seule et m&amp;#234;me&amp;nbsp;&lt;STRONG&gt;m&amp;#233;thode&lt;/STRONG&gt; pour traiter les deux &amp;#233;v&amp;#233;nements. Et bien l'argument &lt;STRONG&gt;sender&lt;/STRONG&gt; m'a justement me permettre de savoir si l'&amp;#233;v&amp;#233;nement a &amp;#233;t&amp;#233; &amp;#233;mis par &lt;STRONG&gt;Instance1&lt;/STRONG&gt; ou &lt;STRONG&gt;Instance2&lt;/STRONG&gt;. A noter que si nous d&amp;#233;cidions que notre m&amp;#233;thode &lt;STRONG&gt;CopieFichier&lt;/STRONG&gt; &amp;#233;tait &lt;STRONG&gt;statique &lt;/STRONG&gt;(&lt;FONT face="Courier New" color=#0000ff&gt;&lt;STRONG&gt;static&lt;/STRONG&gt;&lt;/FONT&gt; ou &lt;FONT face="Courier New" color=#ff0000&gt;&lt;STRONG&gt;Shared&lt;/STRONG&gt;&lt;/FONT&gt;), ce premier argument n'aurait pas de sens et ne figurerait pas dans la signature.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;G&amp;#233;n&amp;#233;ralement, l'&amp;#233;v&amp;#233;nement &amp;#233;mis par une classe &amp;#224; destination d'une autre classe abonn&amp;#233;e transporte avec lui un certain nombre d'informations qui pourraient &amp;#234;tre utiles &amp;#224; l'abonn&amp;#233;. On pourrait &amp;#234;tre tent&amp;#233; de cr&amp;#233;er autant de param&amp;#232;tres &amp;#224; la signature de notre Delegate/Event que n&amp;#233;cessaire. Ce n'est pas l'approche qui a &amp;#233;t&amp;#233; choisie par les d&amp;#233;veloppeurs du framework .NET.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Lorsqu'on souhaite d&amp;#233;clarer un &amp;#233;venement qui n'a aucun param&amp;#232;tre particulier &amp;#224; transmettre, on utilise comme deuxi&amp;#232;me param&amp;#232;tre du Delegate/Event la classe &lt;STRONG&gt;System.EventArgs&lt;/STRONG&gt;. Voici ce que la &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpguide/html/cpconAddingRelationshipBetweenTwoTables.asp"&gt;&lt;FONT face=Verdana size=2&gt;documentation&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt; indique sur cette classe :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana color=#ffa500 size=2&gt;EventArgs est la classe de base des classes contenant des donn&amp;#233;es d'&amp;#233;v&amp;#233;nement.Cette classe ne contient pas de donn&amp;#233;es d'&amp;#233;v&amp;#233;nement; elle est utilis&amp;#233;e par des &amp;#233;v&amp;#233;nements qui ne passent pas d'informations d'&amp;#233;tat &amp;#224; un gestionnaire d'&amp;#233;v&amp;#233;nements lorsqu'un &amp;#233;v&amp;#233;nement est d&amp;#233;clench&amp;#233;. Si le gestionnaire d'&amp;#233;v&amp;#233;nements n&amp;#233;cessite des informations d'&amp;#233;tat, l'application doit &lt;STRONG&gt;d&amp;#233;river&lt;/STRONG&gt; une classe &amp;#224; partir de cette classe pour contenir les donn&amp;#233;es.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Et voil&amp;#224; tout est dit, d&amp;#232;s qu'on veut passer un certain nombre d'informations &amp;#224; un Delegate/Event, on &amp;#233;crit une classe qui d&amp;#233;rive de la classe &lt;STRONG&gt;EventArgs&lt;/STRONG&gt; &amp;#224; laquelle on ajoute les informations suppl&amp;#233;mentaires. Vous avez not&amp;#233; que le nom de ces classes se terminent g&amp;#233;n&amp;#233;ralement par &lt;STRONG&gt;Event&lt;NOM l?event de&gt;Args&lt;/STRONG&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Pour l'&amp;#233;v&amp;#233;nement &lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;CopieDemarrage&lt;/STRONG&gt;, ce dont on a besoin est simplement la &lt;STRONG&gt;taille&lt;/STRONG&gt; du fichier &amp;#224; copier. Ainsi cela permettra d'&amp;#234;tre notifi&amp;#233; de &lt;SPAN lang=FR style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: FR; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;l&amp;#8217;imminence &lt;/SPAN&gt;du d&amp;#233;marrage de la copie et de pouvoir ajuster les valeurs de notre gauge de progression en fonction de la taille du fichier &amp;#224; copier. De plus, il pourrait &amp;#234;tre utile de pouvoir r&amp;#233;cup&amp;#233;rer les chemins complets des fichiers &lt;STRONG&gt;source&lt;/STRONG&gt; et &lt;STRONG&gt;destination&lt;/STRONG&gt;.&amp;nbsp;Cela nous donne :&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;namespace Librairie_CS {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;public class CopieDemarrageEventArgs : System.EventArgs {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private string fichierSource = string.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public string FichierSource {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return(this.fichierSource);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private string fichierDestination = string.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public string FichierDestination {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return(this.fichierDestination);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private long tailleFichier = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public long TailleFichier {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return(this.tailleFichier);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;public CopieDemarrageEventArgs(string fichierSource, string fichierDestination, long tailleFichier) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.fichierSource = fichierSource;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.fichierDestination = fichierDestination;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.tailleFichier = tailleFichier;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Namespace Librairie_VB&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Class CopieDemarrageEventArgs&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits System.EventArgs&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private privateFichierSource As String = String.Empty&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property FichierSource() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return (Me.privateFichierSource)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private privateFichierDestination = String.Empty&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property FichierDestination() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return (Me.privateFichierDestination)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private privateTailleFichier As Long = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property TailleFichier() As Long&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return (Me.privateTailleFichier)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New(ByVal source As String, ByVal destination As String, ByVal taille As Long&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.privateFichierSource = source&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.privateFichierDestination = destination&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.privateTailleFichier = taille&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Class&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;End Namespace&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Pour l'&amp;#233;v&amp;#233;nement &lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;CopieFin&lt;/STRONG&gt;, ce dont on a besoin est simplement le statut final de la copie. On sait que la copie peut s'achever de trois mani&amp;#232;res diff&amp;#233;rentes : &lt;STRONG&gt;Succes&lt;/STRONG&gt;, &lt;STRONG&gt;Echec&lt;/STRONG&gt; ou encore &lt;STRONG&gt;Annulation&lt;/STRONG&gt; (par l'utilisateur). C'est un cas id&amp;#233;al de cr&amp;#233;ation d'une &lt;STRONG&gt;&amp;#233;num&amp;#233;ration&lt;/STRONG&gt; :&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;namespace Librairie_CS {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;public enum StatutCopie {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;Aucun,&lt;BR&gt;&amp;nbsp;&amp;nbsp;Succes,&lt;BR&gt;&amp;nbsp; Echec,&lt;BR&gt;&amp;nbsp; Annulation&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Namespace Librairie_VB&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Enum StatutCopie&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Aucun&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Succes&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Echec&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Annulation&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Enum&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;End Namespace&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;De plus, il peut &amp;#234;tre utile d'indiquer dans cet &amp;#233;v&amp;#233;nement en combien de temps s'est d&amp;#233;roul&amp;#233; l'op&amp;#233;ration de copie. Cela nous donne finalement ceci:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;namespace Librairie_CS {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;public class CopieFinEventArgs : System.EventArgs {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private StatutCopie statutCopie = StatutCopie.Aucun;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public StatutCopie StatutCopie {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return(this.statutCopie);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private int duree = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public int Duree {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return(this.duree);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;public CopieFinEventArgs(StatutCopie statutCopie, int duree) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.statutCopie = statutCopie;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.duree = duree;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Namespace Librairie_VB&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Class CopieFinEventArgs&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits System.EventArgs&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private privateStatutCopie As StatutCopie = StatutCopie.Aucun&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property StatutCopie() As statutCopie&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return (Me.privateStatutCopie)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private privateDuree As Integer = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property Duree() As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return (Me.privateDuree)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New(ByVal statutCopie As StatutCopie, ByVal duree As Integer)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.privateStatutCopie = statutCopie&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.privateDuree = duree&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Class&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;End Namespace&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Finalement, pour &lt;STRONG&gt;CopieEnCours&lt;/STRONG&gt;, il faudrait fournir le nombre d'octets d&amp;#233;j&amp;#224; copi&amp;#233;s au moment de l'&amp;#233;mission de l'&amp;#233;v&amp;#233;nement. Aucune difficult&amp;#233; particuli&amp;#232;re ici. Par contre, on souhaite &amp;#233;galement donner la possibilit&amp;#233; &amp;#224; l'abonn&amp;#233; de pouvoir annuler la copie &amp;#224; tout le moment. L'utilisation de cet &amp;#233;v&amp;#233;nement pour permettre l'annulation de l'op&amp;#233;ration est alors l'id&amp;#233;al car appel&amp;#233; tr&amp;#232;s r&amp;#233;guli&amp;#232;rement durant le processus de copie. Voici ce que cela donne :&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;namespace Librairie_CS {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;public class CopieEnCoursEventArgs : System.EventArgs {&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;private long position = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public long Position {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return(this.position);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private bool cancel = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public bool Cancel {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return(this.cancel);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;set {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.cancel = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;public CopieEnCoursEventArgs(long position) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.position = position;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Namespace Librairie_VB&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Class CopieEnCoursEventArgs&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits System.EventArgs&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private privatePosition As Long = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ReadOnly Property Position() As Long&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return (Me.privatePosition)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private privateCancel As Boolean = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Property Cancel() As Boolean&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return (Me.privateCancel)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set(ByVal Value As Boolean)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.privateCancel = Value&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New(ByVal position As Long)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.privatePosition = position&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Class&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;End Namespace&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Notez que dans ce cas, la propri&amp;#233;t&amp;#233; &lt;STRONG&gt;Cancel&lt;/STRONG&gt; doit &amp;#234;tre en lecture &lt;STRONG&gt;ET&lt;/STRONG&gt; &amp;#233;criture pour donner une chance &amp;#224; l'abonn&amp;#233; de pouvoir modifier sa valeur.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;A ce niveau l&amp;#224;, on a fait le plus dur (et ce n'&amp;#233;tait pas bien dur, il faut bien l'avouer&amp;nbsp;;-) ). Il nous reste &amp;#224; modifier le code de la fonction &lt;STRONG&gt;CopieFichier&lt;/STRONG&gt; pour d&amp;#233;clencher l'&amp;#233;mission des &amp;#233;v&amp;#233;nements comme il faut. Cela donne ceci :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;public void CopieFichier(string cheminFichierDestination, bool ecrasement) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&lt;FONT color=#008000&gt;// On v&amp;#233;rifie si le fichier de destination n'existe pas d&amp;#233;j&amp;#224;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;if (File.Exists(cheminFichierDestination)) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// Si demand&amp;#233;, on &amp;#233;crase le fichier de destination&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (ecrasement) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.Delete(cheminFichierDestination);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;else {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new IOException(string.Format("Le fichier de destination '{0}' existe d&amp;#233;j&amp;#224;.", cheminFichierDestination));&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;StatutCopie statutCopie = StatutCopie.Aucun;&lt;BR&gt;&amp;nbsp;int dureeCopie = System.Environment.TickCount;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;try {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;statutCopie = StatutCopie.Succes;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On ouvre le fichier de destination en &amp;#233;criture&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;using (FileStream fileStreamDestination = new FileStream(cheminFichierDestination, FileMode.Create, FileAccess.Write)) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On ouvre le fichier d'origine en lecture&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (FileStream fileStreamOriginal = new FileStream(this.cheminFichier, FileMode.Open, FileAccess.Read)) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On informe l'abonn&amp;#233; de l'imminence de la copie&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (CopieDemarrage != null) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CopieDemarrage(this, new CopieDemarrageEventArgs(this.cheminFichier, cheminFichierDestination, fileStreamOriginal.Length));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On lit le prochain octet&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int octet = fileStreamOriginal.ReadByte();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (octet != -1) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On &amp;#233;crit l'octet&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStreamDestination.WriteByte((byte)octet);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On informe l'abonn&amp;#233; de la progression de la copie&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (CopieEnCours != null) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CopieEnCoursEventArgs copieEnCoursEventArgs = new CopieEnCoursEventArgs(fileStreamOriginal.Position);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CopieEnCours(this, copieEnCoursEventArgs);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// L'utilisateur a-t'il demand&amp;#233; l'annulation de la copie ?&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (copieEnCoursEventArgs.Cancel) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;statutCopie = StatutCopie.Annulation;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;octet = fileStreamOriginal.ReadByte();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStreamOriginal.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStreamDestination.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;catch {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On renvoit telle quelle l'exception qui a lieu,&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// l'objectif &amp;#233;tant simplement de pouvoir indiquer&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// correctement le statut de la copie&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;statutCopie = StatutCopie.Echec;&lt;BR&gt;&amp;nbsp;&amp;nbsp;throw;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;finally {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;dureeCopie = System.Environment.TickCount - dureeCopie;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// On informe l'abonn&amp;#233; de la fin de la copie&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (CopieFin != null) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CopieFin(this, new CopieFinEventArgs(statutCopie, dureeCopie));&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Public Sub CopieFichier(ByVal cheminFichierDestination As String, ByVal ecrasement As Boolean)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&lt;FONT color=#008000&gt;' On v&amp;#233;rifie si le fichier de destination n'existe pas d&amp;#233;j&amp;#224;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;If File.Exists(cheminFichierDestination) Then&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' Si demand&amp;#233;, on &amp;#233;crase le fichier de destination&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If ecrasement Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.Delete(cheminFichierDestination)&lt;BR&gt;&amp;nbsp;&amp;nbsp;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Throw New IOException(String.Format("Le fichier de destination '{0}' existe d&amp;#233;j&amp;#224;.", cheminFichierDestination))&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;Dim statutCopie As statutCopie = statutCopie.Aucun&lt;BR&gt;&amp;nbsp;Dim dureeCopie As Integer = System.Environment.TickCount&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;Try&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;statutCopie = statutCopie.Succes&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' On ouvre le fichier de destination en &amp;#233;criture&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;Dim fileStreamDestination As New FileStream(cheminFichierDestination, FileMode.Create, FileAccess.Write)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' On ouvre le fichier d'origine en lecture&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;Dim fileStreamOriginal As New FileStream(Me.privateCheminFichier, FileMode.Open, FileAccess.Read)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' On informe l'abonn&amp;#233; de l'imminence de la copie&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;RaiseEvent CopieDemarrage(Me, New CopieDemarrageEventArgs(Me.privateCheminFichier, cheminFichierDestination, fileStreamOriginal.Length))&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' On lit le prochain octet&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;Dim octet As Integer = fileStreamOriginal.ReadByte()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;While octet &amp;lt;&amp;gt; -1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' On &amp;#233;crit l'octet&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStreamDestination.WriteByte(CType(octet, Byte))&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' On informe l'abonn&amp;#233; de la progression de la copie&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim copieEnCoursEventArgs As copieEnCoursEventArgs = New copieEnCoursEventArgs(fileStreamOriginal.Position)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;RaiseEvent CopieEnCours(Me, copieEnCoursEventArgs)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' L'utilisateur a-t'il demand&amp;#233; l'annulation de la copie ?&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If copieEnCoursEventArgs.Cancel Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;statutCopie = statutCopie.Annulation&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit While&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;octet = fileStreamOriginal.ReadByte()&lt;BR&gt;&amp;nbsp;&amp;nbsp;End While&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;fileStreamOriginal.Close()&lt;BR&gt;&amp;nbsp;&amp;nbsp;fileStreamDestination.Close()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;Catch&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' On renvoit telle quelle l'exception qui a lieu,&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' l'objectif &amp;#233;tant simplement de pouvoir indiquer&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' correctement le statut de la copie&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;statutCopie = statutCopie.Echec&lt;BR&gt;&amp;nbsp;&amp;nbsp;Throw&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;Finally&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;dureeCopie = System.Environment.TickCount - dureeCopie&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' On informe l'abonn&amp;#233; de la fin de la copie&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;RaiseEvent CopieFin(Me, New CopieFinEventArgs(statutCopie, dureeCopie))&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;End Try&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Ceci &amp;#233;tant fait, il ne nous reste plus qu'&amp;#224; compiler l'ensemble de ce code dans une assembly&amp;nbsp;(&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;Librairie_CS.dll&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;Librairie_VB.dll&lt;/FONT&gt;&lt;/FONT&gt;).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Enfin, pour illustrer l'utilisation de ces &amp;#233;v&amp;#233;nements depuis une IHM, nous allons cr&amp;#233;er un projet de type &lt;STRONG&gt;Application Windows&lt;/STRONG&gt; et d&amp;#233;poser deux &lt;STRONG&gt;Label&lt;/STRONG&gt;, deux &lt;STRONG&gt;TextBox&lt;/STRONG&gt;,&amp;nbsp;deux &lt;STRONG&gt;Button&lt;/STRONG&gt; et une &lt;STRONG&gt;ProgressBar&lt;/STRONG&gt; :&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;IMG src="http://www.olymars.net/Blogs/EventsDelegates/Copie1.jpg"&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana color=#000000 size=2&gt;Puis voici le code client :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;namespace ClientWindows_CS {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;public class Form1 : System.Windows.Forms.Form {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private Librairie_CS.GestionFichiers gestionFichiers = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;private float taille = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;private bool cancel = false;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private void buttonCopie_Click(object sender, System.EventArgs e) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;gestionFichiers = new Librairie_CS.GestionFichiers(textBoxFichierSource.Text);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;gestionFichiers.CopieDemarrage += new Librairie_CS.CopieDemarrageEventHandler(gestionFichiers_CopieDemarrage);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;gestionFichiers.CopieEnCours += new Librairie_CS.CopieEnCoursEventHandler(gestionFichiers_CopieEnCours);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;gestionFichiers.CopieFin += new Librairie_CS.CopieFinEventHandler(gestionFichiers_CopieFin);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;gestionFichiers.CopieFichier(textBoxFichierDestination.Text, true);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private void buttonAnnuler_Click(object sender, System.EventArgs e) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;cancel = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonAnnuler.Enabled = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.DoEvents();&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private void gestionFichiers_CopieDemarrage(object sender, Librairie_CS.CopieDemarrageEventArgs e) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;cancel = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;taille = Convert.ToSingle(e.TailleFichier);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;progressBar1.Minimum = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;progressBar1.Maximum = 100;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;progressBar1.Value = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonAnnuler.Enabled = true;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.DoEvents();&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private void gestionFichiers_CopieEnCours(object sender, Librairie_CS.CopieEnCoursEventArgs e) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Cancel = cancel;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;progressBar1.Value = Convert.ToInt32(Convert.ToSingle(e.Position) / taille * 100D);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.DoEvents();&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;private void gestionFichiers_CopieFin(object sender, Librairie_CS.CopieFinEventArgs e) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;progressBar1.Value = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonAnnuler.Enabled = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(this, string.Format("Statut : {0} - La dur&amp;#233;e du traitement a &amp;#233;t&amp;#233; de {1}", e.StatutCopie.ToString(), (new TimeSpan(0, 0, 0, 0, e.Duree)).ToString()), "Copie finie");&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Public Class Form1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits System.Windows.Forms.Form&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private WithEvents gestionFichiers As Librairie_VB.GestionFichiers&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private taille As Single = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private cancel As Boolean = False&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub buttonCopie_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonCopie.Click&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gestionFichiers = New Librairie_VB.GestionFichiers(textBoxFichierSource.Text)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Autre moyen pour s'abonner aux &amp;#233;venements :&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' -------------------------------------------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'AddHandler gestionFichiers.CopieDemarrage, AddressOf gestionFichiers_CopieDemarrage&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'AddHandler gestionFichiers.CopieEnCours, AddressOf gestionFichiers_CopieEnCours&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'AddHandler gestionFichiers.CopieFin, AddressOf gestionFichiers_CopieFin&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gestionFichiers.CopieFichier(textBoxFichierDestination.Text, True)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub ButtonAnnuler_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAnnuler.Click&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cancel = True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ButtonAnnuler.Enabled = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.DoEvents()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub gestionFichiers_CopieDemarrage(ByVal sender As Object, ByVal e As Librairie_VB.CopieDemarrageEventArgs) Handles gestionFichiers.CopieDemarrage&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cancel = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; taille = Convert.ToSingle(e.TailleFichier)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; progressBar1.Minimum = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; progressBar1.Maximum = 100&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; progressBar1.Value = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ButtonAnnuler.Enabled = True&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.DoEvents()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub gestionFichiers_CopieEnCours(ByVal sender As Object, ByVal e As Librairie_VB.CopieEnCoursEventArgs) Handles gestionFichiers.CopieEnCours&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Cancel = cancel&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; progressBar1.Value = Convert.ToInt32(Convert.ToSingle(e.Position) / taille * 100D)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.DoEvents()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub gestionFichiers_CopieFin(ByVal sender As Object, ByVal e As Librairie_VB.CopieFinEventArgs) Handles gestionFichiers.CopieFin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; progressBar1.Value = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ButtonAnnuler.Enabled = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(Me, String.Format("Statut : {0} - La dur&amp;#233;e du traitement a &amp;#233;t&amp;#233; de {1}", e.StatutCopie.ToString(), (New TimeSpan(0, 0, 0, 0, e.Duree)).ToString()), "Copie finie")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;End Class&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;A&amp;nbsp;noter l'utilisation du mot-cl&amp;#233; &lt;STRONG&gt;WithEvents&lt;/STRONG&gt; en VB.NET lors de la d&amp;#233;claration de la variable &lt;STRONG&gt;gestionFichiers&lt;/STRONG&gt; pour permettre d'utiliser la technique d'abonnement &lt;STRONG&gt;Handles&lt;/STRONG&gt; :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Private Sub gestionFichiers_[Event]&lt;Event&gt;(ByVal sender As Object, ByVal e As Librairie_VB.&lt;EVENTS&gt;EventArgs) &lt;STRONG&gt;&lt;U&gt;Handles&lt;/U&gt;&lt;/STRONG&gt; gestionFichiers.[Event]&lt;Event&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;A noter &amp;#233;galement qu'il y'a une autre possibilit&amp;#233; pour s'abonner &amp;#224; un &amp;#233;v&amp;#233;nement en VB.NET :&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;&lt;STRONG&gt;&lt;U&gt;AddHandler&lt;/U&gt;&lt;/STRONG&gt; gestionFichiers.[Event]&lt;Event&gt;, &lt;STRONG&gt;&lt;U&gt;AddressOf&lt;/U&gt;&lt;/STRONG&gt; gestionFichiers&lt;Event&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;et&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=+0&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000 size=2&gt;Private Sub gestionFichiers_[Event]&lt;Event&gt;(ByVal sender As Object, ByVal e As Librairie_VB.&lt;EVENTS&gt;EventArgs)&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;Voil&amp;#224;, j'esp&amp;#232;re que cet article vous a &amp;#233;t&amp;#233; utile pour comprendre la notion &lt;STRONG&gt;Delegate&lt;/STRONG&gt;/&lt;STRONG&gt;Event&lt;/STRONG&gt;. Si vous avez des commentaires &amp;#224; faire sur cet article, positifs comme n&amp;#233;gatifs, n'h&amp;#233;sitez pas en m'en faire part gr&amp;#226;ce &amp;#224; la section commentaire ci-dessous.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;A bient&amp;#244;t pour un autre sujet technique !&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;EM&gt;(les exemples de code utilis&amp;#233;s dans cet article&amp;nbsp;sont en libre t&amp;#233;l&amp;#233;chargement&amp;nbsp;&lt;/EM&gt;&lt;/FONT&gt;&lt;A href="http://www.olymars.net/Blogs/EventsDelegates/EventsDelegates.zip"&gt;&lt;FONT size=2&gt;&lt;EM&gt;ici&lt;/EM&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;&lt;EM&gt;)&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/Event&gt;&lt;/Event&gt;&lt;/Event&gt;&lt;/Event&gt;&lt;/Event&gt;&lt;img src ="http://blogs.microsoft.fr/pascalbe/aggbug/227.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>