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

Windows Forms Discussion :

Probleme boucle For Each controls


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut Probleme boucle For Each controls
    Bonjour bonjour,

    J'ai une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub DisposeAll(ByVal MyForm As Form)
            Dim C As Control
            For Each C In MyForm.Controls
                MsgBox(C.ToString)
                C.Dispose()
                C = Nothing
            Next
        End Sub
    Mais je ne comprend pas pourquoi cette fonction ne prend pas en compte les élements qui n'ont plus le meme état que lorsque qu'ils ont été créés...
    Plus précisement, je crée quelques élements dynamiquement, et les élements qui, par exemple comme un bouton qui serait enabled (ne l'étant pas lors de sa création), n'ont pas le même état, ne sont pas pris en compte dans la boucle...

    Merci d'avance pour une petite aide qui serait la bienvenue ^^

  2. #2
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Excuse mais je n'ai pas bien saisie ton soucis...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Un peu plus de code t'éclairera surement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Friend Shared WithEvents S_ADV As TextBox
    Friend Shared WithEvents S_CHK As CheckBox
    Friend Shared WithEvents S_NEXT As Button
    Friend Shared WithEvents S_IMG As PictureBox

    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
    Public Shared Sub InitializeComponent()
            With InstallForm
     
                S_ADV = New TextBox
                S_CHK = New CheckBox
                S_NEXT = New Button
                S_IMG = New PictureBox
     
                components = New System.ComponentModel.Container
                CType(S_IMG, System.ComponentModel.ISupportInitialize).BeginInit()
                .SuspendLayout()
                '
                'S_ADV
                '
                S_ADV.Location = New System.Drawing.Point(12, 63)
                S_ADV.Multiline = True
                S_ADV.Name = "S_ADV"
                S_ADV.ReadOnly = True
                S_ADV.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
                S_ADV.Size = New System.Drawing.Size(560, 233)
                S_ADV.TabIndex = 0
                S_ADV.Text = "blablabla"
                '
                'S_CHK
                '
                S_CHK.AutoSize = True
                S_CHK.Location = New System.Drawing.Point(12, 302)
                S_CHK.Name = "S_CHK"
                S_CHK.Size = New System.Drawing.Size(15, 14)
                S_CHK.TabIndex = 1
                S_CHK.UseVisualStyleBackColor = True
                S_CHK.Text = "reblablabla"
                AddHandler S_CHK.CheckedChanged, AddressOf S_CHK_CheckedChanged
                '
                'S_NEXT
                '
                S_NEXT.Location = New System.Drawing.Point(472, 329)
                S_NEXT.Name = "S_NEXT"
                S_NEXT.Size = New System.Drawing.Size(100, 23)
                S_NEXT.TabIndex = 2
                S_NEXT.UseVisualStyleBackColor = True
                S_NEXT.Text = "Suiva&nt >"
                S_NEXT.Enabled = False
                AddHandler S_NEXT.Click, AddressOf S_NEXT_Click
                '
                'S_IMG
                '
                S_IMG.Location = New System.Drawing.Point(12, 7)
                S_IMG.Name = "S_IMG"
                S_IMG.Size = New System.Drawing.Size(560, 50)
                S_IMG.TabIndex = 5
                S_IMG.TabStop = False
                S_IMG.Image = My.Resources.ban1
                '
                'InstallForm
                '
                .Controls.Add(S_ADV)
                .Controls.Add(S_CHK)
                .Controls.Add(S_NEXT)
                .Controls.Add(S_IMG)
                S_CHK.Select()
                .Icon = My.Resources.icon
                .Text = "ICSI - Assistant d'installation"
                CType(S_IMG, System.ComponentModel.ISupportInitialize).EndInit()
                .ResumeLayout(False)
                .PerformLayout()
            End With
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Private Shared Sub S_CHK_CheckedChanged(ByVal sender As CheckBox, ByVal e As EventArgs)
            S_NEXT.Enabled = sender.Checked
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Shared Sub S_NEXT_Click(ByVal sender As Button, ByVal e As EventArgs)
            Try
                DisposeAll(InstallForm)
            Finally
                Msgbox("blabla")
            End Try
        End Sub
    La fonction DisposeAll est dans mon premier post.

    Bon voila mon probleme : La fonction DisposeAll recense tous les controles de la form InstallForm, il y en a 4 ici : S_ADV, S_CHK, S_NEXT et S_IMG. Or seuls les controles S_ADV et S_IMG sont recensés pas la boucle For Each.

    Je pense savoir d'où vient le probleme :

    • S_CHK est instancié Checked=False, or au moment ou j'appelle la fonction DisposeAll, il est Checked=True.
    • S_NEXT, lui, est instancié Enabled=False, or au moment ou j'appelle la fonction DisposeAll, il est Enabled=True.


    Les deux autres controles sont tels quels lors de l'appel de la fonction DisposeAll...

    Voilà, j'aimerais que ma fonction DisposeAll recense tous les elements de la form, pas seulement ceux qui n'ont pas changé...

    J'espere avoir été plus clair.

    Merci d'avance.

  4. #4
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Bonjour.

    Je ne vois aucune espéce de raison qui explique ce comportement.

    Par contre, apparemment tu n'utilises pas le option strict on puisque tu passes une "installform" comme une form à la fonction.

    Est-ce que cela joue qu'il y ait conversion implicite de installform en form ?

    A tester peut être.

    Cdt.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Salut,

    Merci pour ta réponse, mais cela ne change rien en dotnet 2.0 (d'ailleurs je programme en 3.5), enfin c'est ce que j'ai cru lire je ne sais plus où, et apres avoir testé j'en ai eu la confirmation.
    Je n'utilise pas Option Strict On, sinon les fonctions (private shared) que je rappelle avec AddHandler ne sont pas compatibles.

    Sinon je ne peux pas la déclarer as new InstallForm, pour la simple raison que la form est ouverte est j'effectue des modifications sur celle-ci : J'ajoute et je retire des controles, il me faut cette fonction avec for each pour supprimer tous les composants de la form, car suivant certaines conditions il se peut que je me retrouve avec plus ou moins de controles sur la form.

    Je cherche depuis 3 jours. Je ne comprend pas vraiment là.

    Edit : Le pire c'est que si je fais un MsgBox(MyForm.Controls.Count) dans ma fonction DisposeAll, il me dit 4, et il n'en dispose que 2.

    Edit 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            For i = 0 To MyForm.Controls.Count - 1
                MsgBox(MyForm.Controls.Item(i).ToString)
                MyForm.Controls.Item(i).Dispose()
            Next
    Ne fonctionne pas non plus. C'est d'ailleurs hallucinant qu'il me dise qu'il y en ait 4, et quand i arrive à 2, il me dit que c'est hors limite.

  6. #6
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Bonjour.

    Bon j'ai essayé de recopier ton code pour voir ... mais y'a pas tout là ...

    Donc si tu peux mettre la totale (A la rigueur mets aussi la façon dont tu instancies cette form).

    Par contre je comprend pas pourquoi tes controls sont en shared et pourquoi ils sont dans le .designer (d'aprés le code que je vois) si c'est pour de la création en dynamique.

    Cdt.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Le Designer, c'est moi qui l'ai créé, je me suis inspiré du form designer de vs.

    J'ai créé une form basique avec un simple design...

    [...]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Public Sub DisposeAll(ByVal MyForm As Form)
     
            Dim c As Control
            For Each c In MyForm.Controls
                MsgBox(c.ToString)
                c.Dispose()
            Next
     
        End Sub
    La form s'ouvre au demarrage de l'application, et j'y effectue mes modifications.
    Voila.

  8. #8
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Re

    On est vraiment des buses ...

    J'avais pas réfléchi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            For Each c In MyForm.Controls
                MsgBox(c.ToString)
                c.Dispose()
            Next
    En faisant le dispose, tu modifies la collection .controls donc ton for each déconne complétement (le curseur sur la collection y perd ses petits là !).

    Fais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            MyForm.Controls.Clear()
    Ca marchera mieux !!!!!!!!!!!!!!!!

    PS : des fois j'te jure !

    Cdt.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Tiens...

    Je l'avais pas vu le Clear... pourtant j'y ai fouillé là n'dans !

    Bah j'ai testé ça marche, c'est super... Bah je te remercie, j'le saurais maintenant, j'ai compris la leçon.

    Merci encore (et désolé) pour ton temps passé dessus.



    Mais... une question persiste, est-ce que Clear libère la mémoire ?

  10. #10
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Bonjour.

    Ben non, le .clear dispose pas les controls !!!

    http://msdn2.microsoft.com/en-us/lib...ion.clear.aspx

    Bon en désespoir de cause, tu peux toujour coder ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Public Sub DisposeAll(ByVal MyForm As Form)
     
            Dim c As Control
    flag1:
            For Each c In MyForm.Controls
                MsgBox(c.ToString)
                c.Dispose()
                GoTo flag1
            Next
     
        End Sub
    C'est pourri mais bon, ça marche ...

    Nota : si quelqu'un voit mieux je suis preneur aussi !

    Cdt.

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je pense qu'une boucle qui supprime le dernier controle à chaque itération devrait donner un résultat acceptable sans pourrir la collection.

  12. #12
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Je ne comprends pas le code de olsimare...

    Pourquoi ne pas faire tout simplement ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Public Sub DisposeAll(ByVal MyForm As Form)
            For Each c As COntrol In MyForm.Controls
                MsgBox(c.ToString)
                c.Dispose()
            Next
        End Sub

  13. #13
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Bonjour.

    Ben Aspic, c'est tout bête ... c'est que ça marche pas !

    C'était justement la raison de ce post ...

    Cf les échanges précédents.

    Remarque que le goto je le remplacerais bien par un do until .count > 0 mais j'ai pas testé.

    Cdt.

  14. #14
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Pourquoi ne pas faire tout simplement ca :
    J'ai l'impression que quelqu'un a oublié de le lire le topic en entier

    Pour résumer, foreach utilise un énumérateur pour le parcours, l'énumérateur yield tous les objets de la collection lors du premier passage dans le foreach (en gros). Donc quand tu fais un dispose sur un des éléments, tu déséquilibre le foreach car la collection contient un élément de moins tandis que le foreach a toujours le même nombre d'élément. C'est à peu près le schéma du problème.

    L'idée est donc d'arriver à "foreacher" une collection en étant capable de supprimer des éléments sans déséquilibrer l'énumérateur. C'est la raison pour laquelle olsimare rafraichit l'énumérateur par le retour au début du foreach (avec le goto). <avis personnel>Je trouve que c'est très laid</avis personnel>. J'ai donc suggéré de parcourir les éléménts sans itérateur mais avec un for et de supprimer le dernier élément à chaque fois.

    PS : Pour les pointilleux en fait, le foreach est remplacé par un GetEnumerator et un while moveNext() par le compilateur, c'est la raison pour laquelle le goto fonctionne car, il "remonte" le traitement à l'instruction GetEnumerator.

    Une idée me vient comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While (maCollection.GetEnumerator().MoveNext())
        maCollection.GetEnumerator().Current.Dispose()
    End While
    Veuillez excuser mon VB.NET un peu crotteux.

  15. #15
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    J'ai l'impression que quelqu'un a oublié de le lire le topic en entier

    Pour résumer, foreach utilise un énumérateur pour le parcours, l'énumérateur yield tous les objets de la collection lors du premier passage dans le foreach (en gros). Donc quand tu fais un dispose sur un des éléments, tu déséquilibre le foreach car la collection contient un élément de moins tandis que le foreach a toujours le même nombre d'élément. C'est à peu près le schéma du problème.

    L'idée est donc d'arriver à "foreacher" une collection en étant capable de supprimer des éléments sans déséquilibrer l'énumérateur. C'est la raison pour laquelle olsimare rafraichit l'énumérateur par le retour au début du foreach (avec le goto). <avis personnel>Je trouve que c'est très laid</avis personnel>. J'ai donc suggéré de parcourir les éléménts sans itérateur mais avec un for et de supprimer le dernier élément à chaque fois.

    PS : Pour les pointilleux en fait, le foreach est remplacé par un GetEnumerator et un while moveNext() par le compilateur, c'est la raison pour laquelle le goto fonctionne car, il "remonte" le traitement à l'instruction GetEnumerator.

    Une idée me vient comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While (maCollection.GetEnumerator().MoveNext())
        maCollection.GetEnumerator().Current.Dispose()
    End While
    Veuillez excuser mon VB.NET un peu crotteux.
    Merci pour l'explication, je ne le savais pas au moins j'aurais appris un truc aujourd'hui

    PS : Ton code VB.NET est nickel

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Bonjour bonjour,

    Merci SaumonAgile, mais ton code me renvoit l'erreur suivante : Variable objet ou variable d'un bloc With non définie.

    En revanche, apres avoir lu vos réponses j'ai fait ceci, cela se rappoche beaucoup de la solution d'olsimare, mais je pense que c'est un petit peu plus beau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            While MyForm.Controls.Count > 0
                For Each c As Control In MyForm.Controls
                    MsgBox(c.ToString)
                    c.Dispose()
                Next
            End While
    Ca marche très bien...

  17. #17
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Bonjour.

    Oui, SaumonAgile, c'est trés trés laid on est d'accord !

    Je ne te tiens donc pas rigueur d'un avis que je partage !

    Vivement une méthode collection.ClearAndDispose !

    Bon un do until machin.count > 0 ça le fait ça ?

    Cdt.

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Avec un machin.item(machin.count-1).dispose ?

    Oui c'est pas bête, edit, mais ça marche pas ^^

  19. #19
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Merci de penser au Tag quand la solution a été trouvé

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    AH, bah si ça marche, avec Do Until, faut un egal !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Do Until MyForm.Controls.Count = 0
                MyForm.Controls.Item(MyForm.Controls.Count - 1).Dispose()
            Loop
    C'est parfait. Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Probleme bouton afficher/masquer avec boucle for-each
    Par CouicCouic dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 25/11/2011, 09h48
  2. [XL-2007] Probleme boucle For each
    Par franc83 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/07/2011, 19h42
  3. [XL-2007] Probleme de boucle For Each
    Par Jessyline dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/05/2009, 18h21
  4. Probleme VBS et boucle For each + tableau
    Par fas3r dans le forum Windows
    Réponses: 0
    Dernier message: 26/02/2008, 04h00
  5. Boucle For each
    Par roots_man dans le forum ASP
    Réponses: 10
    Dernier message: 18/02/2005, 10h55

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