Bonsoir,
Je cherche en vain a savoir comment sérialiser la position de mes boutons créer dynamiquement, mais aucune réponse ^^
Pourriez-vous m'éclairer sur la sérialisation de la position de mes boutons créer dynamiquement ?
Merci d'avance
Bonsoir,
Je cherche en vain a savoir comment sérialiser la position de mes boutons créer dynamiquement, mais aucune réponse ^^
Pourriez-vous m'éclairer sur la sérialisation de la position de mes boutons créer dynamiquement ?
Merci d'avance
Bonjour,
Ca dépend un peu de la finalité de ce que tu veux faire. Si tu veux simplement conserver la position de tes boutons sur une form, tu crées une classe PositionBoutons avec 2 propriétés (Left, Top) et tu sérialises une List(of PositionBoutons)
Maintenant si la finalité est plus complexe genre serializer toutes les propriétés du bouton (text, position, taille, events appelés) ou un bouton peut-être placé sur un container de type panel ou encore serializer autre chose qu'un bouton, la problématique sera un peu différente.
Merci pour m'avoir répondu Mais pouvez-me donner un exemple de code pour la sérialisation ?
Le net regorge d'exemples. J'en ai fait un petit mais je viens de voir qu'on était sur le forum VB. Mon exemple est en C# mais ne pose pas de difficulté de conversion (au pire, il y a des outils). Exemple de serialisation d'une classe myClass ayant des propriétés de type simple :
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 private void button1_Click(object sender, EventArgs e) { List<myClass> l = new List<myClass>(); myClass c; c = new myClass(); c.Width = 10; c.Height = 20; l.Add(c); c = new myClass(); c.Width = 220; c.Height = 210; l.Add(c); serialize(l); } private void button2_Click(object sender, EventArgs e) { List<myClass> l = deserialize(); } // deSerialisation d'une List(of myClass) private List<myClass> deserialize() { XmlSerializer x = new XmlSerializer(typeof(List<myClass>)); using (StreamReader reader = new StreamReader(@"d:\temp\serial.xml")) { return (List<myClass>)x.Deserialize(reader); } } // Serialisation d'une List(of myClass) private void serialize(List<myClass> list) { XmlSerializer x = new XmlSerializer(typeof(List<myClass>)); using (TextWriter writer = new StreamWriter(@"d:\temp\serial.xml")) { x.Serialize(writer, list); } }
J'ai converti le code asser facilement, mais par contre j'ai test que la serialisation, mais cela ne marche pas
Code de ma classe :
Code principal :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Public Class Boutonn Property X As Integer Property Y As Integer End Class
Les boutons ne se remettent pas en place, une fois la fenêtre fermer et puis réouverte ^^
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 Imports System.Xml.Serialization Imports System.IO Public Class Options_controls Public Num As Integer Public WithEvents btn As Button Public LocalMousePosition As Point Public Nu As Integer Private Sub serialize(list As List(Of Boutonn)) Dim x As New XmlSerializer(GetType(List(Of Boutonn))) Using writer As TextWriter = New StreamWriter("c:\serial.xml") x.Serialize(writer, list) End Using End Sub Private Sub Options_controls_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseClick If e.Button = MouseButtons.Left And Form1.btn = 1 Then btn = New Button Num += 1 Nu = 1 btn.Text = "Button" + Num.ToString btn.Name = "Button" + Num.ToString LocalMousePosition = Me.PointToClient(Cursor.Position) btn.Location = New Drawing.Point(LocalMousePosition.X, LocalMousePosition.Y) Me.Controls.Add(btn) AddHandler Me.Controls(btn.Name).MouseDown, AddressOf btn_MouseDown End If End Sub Private Sub btn_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) If e.Button = MouseButtons.Right And Form1.btn = 1 Then btn = CType(sender, Button) Timer1.Start() Else Timer1.Stop() End If End Sub Private Sub Timer1_Tick_1(sender As Object, e As EventArgs) Handles Timer1.Tick LocalMousePosition = PointToClient(Cursor.Position) btn.Location = New Drawing.Point(LocalMousePosition.X, LocalMousePosition.Y) End Sub Private Sub Options_controls_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) Then If MsgBox("Voulez vous enregistrer?", MsgBoxStyle.YesNo, "Enregistrement") = MsgBoxResult.Yes Then Timer1.Stop() Dim l As New List(Of Boutonn) Dim c As Boutonn c = New Boutonn c.X = btn.Location.X c.Y = btn.Location.Y l.Add(c) serialize(l) Me.Close() Else Timer1.Stop() Me.Close() End If End If End Sub End Class
C'est normal, regarde ton code : Tu ne déserialises pas ton fichier au démarrage (load) de la form.
L'idée serait :
Lorsque tu fermes ta form, tu sérialises les coordonnées de tes boutons tel que tu le fais actuellement.
Lorsque tu Load ta form, tu déserialises le fichier => cela créera une liste de Buttonn (liste d'objets ne contenant que les coordonnées de tes futurs boutons). Tu parcours cette liste, instancies les boutons et les places sur la form.
Bonjour j'ai suivis à la lettre vos indication, sauf que cela ne marche toujours pas :
Enfaite, je veut que quant la msgbox apparaît, elle nous demande si on veut enregistrer. Si on répond oui sa enregistre les positions de tous les boutons que l'on a créer dynamiquement avec la souris, si on répond non sa enregistre rien du tout
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 Imports System.Xml.Serialization Imports System.IO Imports System.ComponentModel Public Class Options_controls Public Num As Integer Public WithEvents btn As Button Public LocalMousePosition As Point Public Nu As Integer Private Sub serialize(list As List(Of Boutonn)) Dim x As New XmlSerializer(GetType(List(Of Boutonn))) Using writer As TextWriter = New StreamWriter("c:\serial.xml") x.Serialize(writer, list) End Using End Sub Private Function deserialize() As List(Of Boutonn) Dim x As New XmlSerializer(GetType(List(Of Boutonn))) Using reader As New StreamReader("c:\serial.xml") Return DirectCast(x.Deserialize(reader), List(Of Boutonn)) End Using End Function Private Sub Options_controls_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseClick If e.Button = MouseButtons.Left And Form1.btn = 1 Then btn = New Button Num += 1 Nu = 1 btn.Text = "Button" + Num.ToString btn.Name = "Button" + Num.ToString LocalMousePosition = Me.PointToClient(Cursor.Position) btn.Location = New Drawing.Point(LocalMousePosition.X, LocalMousePosition.Y) Me.Controls.Add(btn) AddHandler Me.Controls(btn.Name).MouseDown, AddressOf btn_MouseDown End If End Sub Private Sub btn_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) If e.Button = MouseButtons.Right And Form1.btn = 1 Then btn = CType(sender, Button) Timer1.Start() Else Timer1.Stop() End If End Sub Private Sub Timer1_Tick_1(sender As Object, e As EventArgs) Handles Timer1.Tick LocalMousePosition = PointToClient(Cursor.Position) btn.Location = New Drawing.Point(LocalMousePosition.X, LocalMousePosition.Y) End Sub Private Sub Options_controls_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) Then If MsgBox("Voulez vous enregistrer?", MsgBoxStyle.YesNo, "Enregistrement") = MsgBoxResult.Yes Then Timer1.Stop() Me.Close() Else Timer1.Stop() End If End If End Sub Private Sub Options_controls_Load(sender As Object, e As EventArgs) Handles Me.Load Dim l As List(Of Boutonn) = deserialize() End Sub Private Sub Options_controls_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing Dim l As New List(Of Boutonn) Dim c As Boutonn c = New Boutonn c.X = btn.Location.X c.Y = btn.Location.Y l.Add(c) serialize(l) End Sub End Class
Voilà j'espère que vous aller m'éclairer sur le soucis ^^
Effectivement, ça ne peut toujours pas fonctionner tel quel. Plusieurs choses :
- Au click souris, il y a une création de bouton. D'abord, il faut éviter de mettre du code qui pourrait servir par ailleurs directement dans l'event du click. Il est préférable de créer une sub avec paramètres afin de pouvoir appeler ce code par ailleurs. Ici ce sera le cas, une sub créant un bouton pourra être appelé au click souris et lors de la désérialisation. Un truc comme ça :
- A chaque création de bouton, il faut ajouter dans la liste qui sera sérialisée les coordonnées du bouton nouvellement créé. Car actuellement à la sortie du programme, tu sérialises uniquement les coordonnées du dernier bouton ajouté (btn) et non l'ensemble des boutons créés. D'ailleurs, btn est une variable globale qui ne sert à rien. Il faut éviter au maximum l'utilisation de variables globales, ça rend difficile la maintenance du code. Ce sera le cas pour tes variables Btn et LocalMousePosition voire Num que tu peux implicitement récupérer par la liste de coordonnées de tu renseigneras au fur et à mesure des créations.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Function CreateButton(location As Point, text As String) As Button Dim btn As Button = New Button() Dim LocalMousePosition = Me.PointToClient(Cursor.Position) btn.Location = location btn.Text = text Me.Controls.Add(btn) AddHandler btn.MouseDown, AddressOf btn_MouseDown Return btn End Function
- Au load tu déserialises la liste et puis ... plus rien (!!). Il faut créer les instances des boutons, ça ne peut pas se faire tout seul. Pour rappel, ce ne sont pas les boutons qui sont sérialisés mais uniquement leurs coordonnées.
- L'event Closing de la form devra plutôt être utilisée pour empêcher la fenêtre de se fermer si besoin. Utilise de préférence l'event Closed.
Il y aura d'autres choses à dire mais déjà, tout ça te donnera du grain à moudre. N'hésite pas si tu as des questions ou si je ne suis pas clair.
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