Bonjour,
puis-je créer dans mon WindowsForm une fonction qui s'execute automatiquement lorsq'une de mes variables partagées change de valeur?
Merci
Bonjour,
puis-je créer dans mon WindowsForm une fonction qui s'execute automatiquement lorsq'une de mes variables partagées change de valeur?
Merci
il y a moyen oui, tout est possible en programmation
si j'ai bien compris tu aurai une variable et quand celle-ci change de valeur tu veux qu'une fonction se lance automatiquement.
faudrait une précision du comment déjà tu fais pour changer ta variable si c'est sur un evenement click d'un bouton, une frappe sur une touche du clavier etc...
sur l'evenement click d'un bouton tu compares ta variable partagé si elle est égale à celle qui existait si elle est différente tu lances ta fonction.
ça ferai un truc dans le genre
private sub Bouton_click(byval ............. eventargs) handles Bouton.click
if maVariablePartagé = ManouvelleVariable then
MaFonction()
end if
end sub
voilà si j'ai bien compris
Mon idée serait de passer par une propriété pour changer la valeur de la variable.
Ta propriété peux donc tester si la valeur change et
ce test est transparent pour tous les objets modifiant cette valeur.
Je comprends un truc... si ta variable change ... c'est qu'il y a eu un "evenement".
Pourquoi ne pas utiliser cet évênement pour lancer ta méthode ?
Je pense volontiers à penser aux choses auxquelles je pense que les autres ne penseront pas
'lutation
Connaissais vous les accesseurs get/set ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 private int _maVar public int maVariablePartage { get() { return _maVar;} set() { _maVar = value; MaFonction();// tu peu meme la mettre avant l'affectation de ta valeur ;) } }
1 || 1 = 1
1 && 1 = 1
1 * 1 = 1
Bon après tout, peut-être que Van Damme avait raison:
1 + 1 = 1 // harmonie parfaite
pourquoi faire un accesseur si juste l'appel de la fonction suffit ??
Merci de m'espliquer![]()
Je pense volontiers à penser aux choses auxquelles je pense que les autres ne penseront pas
ah bon !!??Elle est globale a toute l'application.
Donc exit l'accesseur en lecture et/ou écriture.
La variable ne change peut être pas qu'à un seul endroit...
Cela pourrait devenir lourd d'appeler la fonction à chaque fois que tu modifies ta variable.
Par contre, je rejoins l'idée d'ekinox17 tu peux créer un accesseur dans un module.
Oup !! Je viens de relire ton post et je crois avoir cerner le problème...
En fait, tu veux provoquer un évenement dans ta Form, lorsque la variable partagée a été modifiée. (elle peut très bien être modifée ailleurs que dans ta form, si j'ai bien compris.)
En y reflechissant, je ne pense pas que cela soit possible de cette façon.
Si tu as la possibilté de la faire, ma solution serait de stocker une propriété et non une variable dans une classe à instance unique ou tu pourrais provoquer un évenement (récupérable dans ta form si tu récupère l'instance)
Exemple :
Tu ajoutes un bouton sur MonForm et sur MonForm2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 Public Class MaClasseSINGLETON Private Shared m_clsInstance As MaClasseSINGLETON ' L'instance unique Private mStr_MaVariable As Integer = 0 ' La variable partagée ' Evenement lorsque la variable change Public Event MaVariableChange As EventHandler '*** Méthode Standard qui renvoie l'instance unique '*** de la classe (SINGLETON) Public Shared Function GetInstance() As MaClasseSINGLETON If m_clsInstance Is Nothing Then _ m_clsInstance = New MaClasseSINGLETON Return m_clsInstance End Function '*** Accesseur ma variable Public Property MaVariable() As Integer Get Return mStr_MaVariable End Get Set(ByVal Value As Integer) If mStr_MaVariable <> Value Then mStr_MaVariable = Value RaiseEvent MaVariableChange(Me, New EventArgs) End If End Set End Property End Class Public Class MonForm Inherits System.Windows.Forms.Form '*** Récupération instance MaClasseSINGLETON Private WithEvents clsMaClasseSINGLETON As MaClasseSINGLETON = _ MaClasseSINGLETON.GetInstance '*** Evenement provoqué lorsque la variable partagé est modifiée Private Sub clsMaClasseSINGLETON_MaVariableChange( _ ByVal sender As Object, _ ByVal e As System.EventArgs _ ) Handles clsMaClasseSINGLETON.MaVariableChange MsgBox("Ma variable a changée !") End Sub '*** Click sur bouton1, on affiche MonForm2 Private Sub Button1_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs _ ) Handles Button1.Click Dim frmMonForm2 As MonForm2 Try frmMonForm2 = New MonForm2 frmMonForm2.Show() Catch ex As Exception ' Gestion des exceptions MsgBox(ex.ToString) End Try End Sub End Class Public Class MonForm2 Inherits System.Windows.Forms.Form '*** Click sur bouton de la form2 qui modifie 'la valeur de la variable partagée Private Sub Button1_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs _ ) Handles Button1.Click MaClasseSINGLETON.GetInstance.MaVariable = 1 End Sub End Class
Bon il faut juste expliquer d'avantage ce que tu entends dire par variable partagée, mais globalement c'est possible de le faire avec les delegates en utilisant comme precedement un accesseur.
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public delegate void ValueChangedDelegate(object o, ValueChangedEventArgs e); public class ValueChangedEventArgs { public string AttributeName; public object AttributeValue; public ValueChangedEventArgs(string valueName, object newValue) { AttributeName = valueName; AttributeValue = newValue; } } public class Notifier { private event ValueChangedDelegate ValueChangedEvent; protected void Notify(string propertyName, object propertyValue) { if (ValueChangedEvent != null) ValueChangedEvent(this, new ValueChangedEventArgs(propertyName, propertyValue)); } public Notifier(ValueChangedDelegate theDelegate) { ValueChangedEvent += theDelegate; } } public class MyClass : Notifier { private int x; // x remplace ta variable partagée public MyClass(ValueChangedDelegate theDelegate) : base(theDelegate) {} public int X { get { return x; } set { x= value; Notify("X", value); } } }
et la tu as une methode de ta windows form qui s'inscrit a l'evenement
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 private void XChangeValeur(object o, ValueChangedEventArgs e) { Console.WriteLine("X a changé, nouvelle valeur : {0}", e.AttributeValue); } MyClass myClass=new MyClass( new ValueChangedDelegate(XChangeValeur));
Voila j'espere que ca va t'aider à resoudre ton probleme.
Mehdi Feki : Modérateur .Net
excuses-moi, mais il y a cette erreur à la compilation
Code : Sélectionner tout - Visualiser dans une fenêtre à part The name 'ValueChangedEvent' does not exist in the current context
Effectivement, code corrigé
Mehdi Feki : Modérateur .Net
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager