bonjour tt le monde,
voila je vt savoir comment on peut fait un evenement de tel sorte que
ce variable declenche un evenement quand sa valeur se change
exemple
variable a
a=5 ---------------------------------->a=8
declenchement d'un evenement
Version imprimable
bonjour tt le monde,
voila je vt savoir comment on peut fait un evenement de tel sorte que
ce variable declenche un evenement quand sa valeur se change
exemple
variable a
a=5 ---------------------------------->a=8
declenchement d'un evenement
Tu utilises donc Machin et tu t'abonnes à l'évènement OnMachinChanged ...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Public Event OnMachinChanged As EventHandler Private pmachin As Integer = 0 Public Property Machin() As Integer Get Return pmachin End Get Set(ByVal value As Integer) pmachin = value RaiseEvent OnMachinChanged(Me, EventArgs.Empty) End Set End Property
comment j'excute le procedure dû au declanchement de l'evenement
un exemple peut faire l'affaire
et merci,
ça doit être un truc genre ça :
par contre, tu devrais lire ceci :Code:
1
2
3
4 Public Sub OnMachinChangedHandler(ByVal sender As Object, ByVal e As EventArgs) Handles OnMachinChanged ... End Sub
http://plasserre.developpez.com/cours/vb-net/
+1 pour la suggestion de Smyley...
J'ai juste une petite remarque sur les conventions de nommage : normalement le nom de l'évènement ne prend pas de préfixe On, donc l'évènement devrait s'appeler MachinChanged et non OnMachinChanged. OnMachinChanged, typiquement, sera le nom d'une méthode protégée pour déclencher l'évènement (qui n'est pas vraiment nécessaire en VB.NET vu que Raise vérifie que le handler n'est pas null)
désolé de squater
je suis pas sur d'avoir compris comment marche les évènements en c#, est-ce que ca revient au meme qu'en vb.net quand meme ?
un handler est il managé ou non ?
Grosso modo, oui. Mais VB.NET a l'instruction Raise, qui n'existe pas en C#, et qui vérifie si des handlers sont abonnés à l'évènement avant d'essayer de les appeler. En C#, il faut faire cette vérification soi-même, donc pour un évènement MachinChanged, on écrira souvent une méthode comme ça :
qu'on appelle à la place de RaiseCode:
1
2
3
4
5
6 protected void OnMachinChanged() { var handler = MachinChanged; if (handler != null) handler(this, EventArgs.Empty) }
Pour l'explication de la variable handler intermédiaire : c'est pour parer le cas (improbable) où MachinChanged deviendrait null entre le test et l'appel. Eric Lippert a publié un billet sur son blog où ce problème est décrit de façon plus approfondie...
Qu'est-ce que tu entends par là ?
Si tu veux dire "géré par le garbage collector", comme tous les objets .NET, oui, bien sûr, il est managé
dans le framework, les handlers sont retirés dans le dispose dans la partie où meme appelé depuis le finalize c'est fait, donc partie réservées au choses non managée ...
alors que le peu que j'ai pu en voir dans reflector les event c'est une collection de délégués pour chaque évènement ...
serait-ce pour etre sur de vider ses collections de choses inutiles ?? étrange ...
Pour la convention de nommage c'est tout à fait ça (sauf que dans la précipitation d'écrire du code C# et de le convertir en ligne, j'ai pas fait attention :aie:).
Pour la dernière question, je vois pas où tu veux en venir (Pol ou sperot ? :roll:). En tout cal les events restent attachés même dans les finalizers mais on n'a pas à les libérer soit même. Après si j'ai bien compris les évènements sont des références faibles et pas fortes donc avoir une référence via un évènement ne compte pas dans les cycles du GC ...
je me demande surtout si on est obligé de mettre quelquepart un removehandler pour chaque addhandler qui est passé
en vb.net (je sais pas si ca y est en c#) on peut déclarer des variables en rajoutant le mot-clé WithEvents
ca permet de pouvoir écrire derrière une sub Handles Instance.Event
le compilateur pour ce genre de chose s'occupe de faire le addhandler, mais aussi le removehandler
(-- 2 minutes plus tard en ayant utilisé quelques neurones--)
ca doit etre pour ne pas handler plusieurs instances à la fois que ca compile de cette manière ...
si à ca on rajoute le fait que des removehandler dans les dispose j'arrive pas à en retrouver dans reflector ca veut dire que les remove seraient facultatifs ...
c'est troublant ?Citation:
(Pol ou sperot ? :roll:)
Oui on doit s'abonner aux évènements mais on es pas obligé de supprimer l'abonnement. En C# c'est += et -= pour les évènements.
Le WithEvents du vb j'ai pas compris à quoi ça sert (mais entre nous ça ne me dérange pas ;)) mais en C# pour rajouter un évènement c'est systématiquement Machin += new EventHandler(...).
en vb.net on a encore un truc de fénéant
au lieu de
on peut faireCode:
1
2
3
4
5
6
7
8 private _btn as new button public sub new addhandler _btn.click, btnclick end sub private sub btnclick end sub
à la compilation le withevents transforme la variable en propriété et dans le set ca fait removehandler si value is nothing puis le addhandlerCode:
1
2
3
4
5 private withevents _btn as new button private sub btnclick Handles _btn.click end sub
en plus en vb, on peut retirer sender et e ca rale pas ... (par contre on peut pas les utiliser du coup :aie:)
bon par contre ca empeche quand meme d'écrire des conneries genre de mettre que sender, ou e pas du bon type
tous les controles sont déclarés dans le fichier designer avec withevents
et je trouve ca plutot pratique, sur une sub on sait directement pas qui elle sera appelée
(on peut meme avoir des handles multiples genre Handles btn1.click, btn2.click, textbox1.textchanged)
j'aurais bien pourri le post d'origine !! :aie: