IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème d'utilisation de la serialisation


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Points : 11
    Points
    11
    Par défaut Problème d'utilisation de la serialisation
    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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    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.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Points : 11
    Points
    11
    Par défaut
    Merci pour m'avoir répondu Mais pouvez-me donner un exemple de code pour la sérialisation ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    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);
        }
    }

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Points : 11
    Points
    11
    Par défaut
    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 : 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
    Code principal :
    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
    Les boutons ne se remettent pas en place, une fois la fenêtre fermer et puis réouverte ^^

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    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.

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Points : 11
    Points
    11
    Par défaut
    Bonjour j'ai suivis à la lettre vos indication, sauf que cela ne marche toujours pas :
    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
    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
    Voilà j'espère que vous aller m'éclairer sur le soucis ^^

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par Fundu31 Voir le message
    Bonjour j'ai suivis à la lettre vos indication, sauf que cela ne marche toujours pas :
    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 :
    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
    - 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.

    - 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.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/03/2010, 09h08
  2. [Asp.net/Vb.net] Problème utilisation Combobox
    Par NameX dans le forum ASP.NET
    Réponses: 0
    Dernier message: 13/11/2009, 15h16
  3. [ADO.Net] - Problème lors de l'utilisation de plusieurs DataReader
    Par Aurazed dans le forum Accès aux données
    Réponses: 1
    Dernier message: 29/10/2007, 16h21
  4. [VB.NET] problème d'utilisation de substotal (excel via VB)
    Par Pynuch dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/11/2005, 13h53
  5. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo