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

Lazarus Pascal Discussion :

SQLite3, Zeos et RichMemo [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut SQLite3, Zeos et RichMemo
    Bonjour,

    voilà, j'essaie d'enregistrer dans une base SQLite, un texte mis en forme saisi dans un RichMemo.

    J'utilise les composants ZeosLib (7.0.3), et Lazarus 1.0.4.

    Je n'arrive pas à enregistrer correctement les textes et encore moins à les récupérer.

    Quelqu'un a déjà fait cela ?

    Merci d'avance

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    C'est la mise en forme que vous n'arrivez pas à enregistrer ? A restituer dans un (autre) RichMemo après enregistrement et relecture dans la base ? ou cela concerne uniquement le texte contenu dans le RichMemo ? Parce qu'en réalité, il y a 2 problèmes. Si vous voulez afficher votre RichMemo dans une dbGrid (ou une StringGrid), évidemment le texte brut suffit. Mais si après lecture dans la base, vous voulez également l'afficher à nouveau dans un Richmemo, là, il faut enregistrer en plus les attributs du texte ce qui implique l'enregistrement dans de 2 champs différents de votre table. Il faudrait utiliser pour le 2ème champ les fonctions Load/SaveRichText.
    J'ai lu mais pas testé (je ne les utilise plus) que les RichMemo avaient (eu) des problèmes avec l'UTF8 et sous Nux... A regarder de près, même si je suppose que cela a été réglé depuis le temps : http://bugs.freepascal.org/view.php?id=19624

    Cordialement. Gilles
    Dernière modification par Invité ; 07/01/2013 à 11h39.

  3. #3
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    Tout d'abord merci d'avoir répondu, ensuite mon problème est assez bizarre.

    Après plusieurs recherche il s'avère en fait que c'est l'utilisation des "MemoryStream" qui pose problème.

    Je m'explique. Afin d'enregistrer et lire du texte mis en forme dans une base SQLite j'utilise les possibilités des champs blob et du composant RichMemo de lire et ecrire dans des stream. Afin de ne pas solliciter le disque dur, je suis passé par des MemoryStream. Le problème est que ça ne fonctionne pas. Si je passe par des FileStream, tout roule. Mais, dans ce cas, je dois écrire sur le disque le filestream depuis le champsblob ou depuis le RichMemo pour le lire à nouveau et le mettre soit dans le RichMemo ou dans le champ blob.

    En gros, j'ai les schémas suivants :

    ChampBlob --> fichier temporaire --> RichMemo
    et
    RichMemo --> fichier temporaire --> ChampBlob

    Ça fonctionne, mais ce n'est pas très optimisé au niveau du disque dur.

    Du coup, je me demandais s'il ne serait pas plus simple de faire comme je fais déjà pour les blob images, que je stocke sur le disque dur (dans un dossier spécifique) et dont seul le nom est stocké dans la base...

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    Pardon pour cette question, mais as-tu essayé avec des MemoryStream dont tu avais remis la Position à 0 avant de les passer pour lecture ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    A priori, je dirais... non ? Mais plus réellement, ce serait !

    Bref, que veux-tu dire exactement ? Je ne suis pas du tout, mais alors pas du tout, familiarisé avec les stream...
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonsoir,

    Les TMemoryStream utilisent un "curseur" qui permet de lire ou d'écrire à partir d'une certaine position identifiée par la propriété MS.position. Souvent après une écriture (WriteToStream par exemple) le curseur est situé en fin du flux. Si on veut lire le flux depuis le début, certaines fonctions nécessitent de repositionner ce curseur au début par
    MS.position:=0 ou par
    MS.seek(0,soFromBeginning)
    sinon le curseur se trouvant à la fin, rien ne sera lu.

    André

  7. #7
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    Ah ... Okay !

    Ceci explique peut-être cela alors...

    Je vais refaire des essaies, fort de ces nouvelles informations.


    Merci beaucoup pour ces compléments.

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  8. #8
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    Cool, ça fonctionne parfaitement.

    Merci à vous tous. Vous êtes mes Maîtres...

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    j'avais commencé par quelque chose d'équivalent mais cela ne me parait pas aussi simple que cela. Win et Nux n'utilisent pas toujours les mêmes encodages dans les flux. Donc la portabilité est à vérifier de très près d'autant que si j'ai bien compris la chaine issue du flux est enregistrée dans une table. Mon idée serait de "forcer" vers une ansistring.
    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
    {http://stackoverflow.com/questions/732666/converting-tmemorystream-to-string-in-delphi-2009}
    {Ici, sous Win}
    //sRTF : String;  
     
    function StreamToString(aStream: TStream): string;
    var
      SS: TStringStream;
    begin
      if aStream <> nil then
      begin
        SS := TStringStream.Create('');
        try
          SS.CopyFrom(aStream, 0);  // No need to position at 0 nor provide size
          Result := SS.DataString;
        finally
          SS.Free;
        end;
      end else
      begin
        Result := '';
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ms1 : TMemoryStream;
    begin
      try
        ms1 := TMemoryStream.Create();
        try
          ms1.Seek(0, soFromBeginning);
          RichMemo1.SaveRichText(ms1);
          sRTF := StreamToString(ms1);
          showmessage(sRTF);
        except
          showmessage('Oups');
        end;
      finally
        ms1.Free;
      end;
    end;
     
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      ms2 : TStringStream;
    begin
      try
        ms2 := TStringStream.Create(sRTF);
        try
          ms2.Seek(0, soFromBeginning);
          RichMemo2.LoadRichText(ms2);
         except
           showmessage('Oups');
          end;
        finally
          ms2.Free;
        end;
    end;
    Voir le lien cité au début du code.

    Sinon en code plus minimaliste, ce code de transfert d'un RichMemo1 à un RichMemo2 par l'intermédiaire de la string sRTF fonctionne :
    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
    //sRTF : String; 
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ms1 : TStringStream;
    begin
      try
        ms1 := TStringStream.Create('');
        RichMemo1.SaveRichText(ms1);
        sRTF := ms1.DataString;
        showmessage(sRTF);
      except
        showmessage('Oups');
      end;
      ms1.Free;
    end;
     
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      ms2 : TStringStream;
    begin
      try
        ms2 := TStringStream.Create(sRTF);
        RichMemo2.LoadRichText(ms2);
      except
        showmessage('Oups');
      end;
      ms2.Free;
    end;
    Cordialement. Gilles
    Dernière modification par Invité ; 08/01/2013 à 13h11. Motif: Orthographe

  10. #10
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    Gilles,

    mon code est le suivant
    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
     
    {rm_Texte est un TRichMemo
    tbl_Texte est une ZeosTable
    tbl_Textemm_Texte est un champ blob }
     
     
    //Procedure pour actualiser le RichMemo lors du déplacement du curseur de //Table
    Procedure Tform1.Tbl_texteafterscroll( Dataset : Tdataset) ;
    Var
      oMS	: TMemoryStream;
     
    Begin
      oMs := TMemoryStream.Create;
      Try
        rm_Texte.Clear;
        Tbl_textemm_texte.SaveToStream( oMS);
        oMs.Position := 0;
        rm_Texte.LoadRichText( oMS);
      Finally
        oMS.Free;
      End;     
    End;
     
    //Procedure pour mettre à jour le champ blob avant le Post.
    Procedure Tform1.Tbl_textebeforepost( Dataset : Tdataset) ;
    Var
      oms	: TMemoryStream;
     
    Begin
      oMs := TMemoryStream.Create;
      Try
        If rm_Texte.SaveRichText( oMS) Then
        Begin
    	    oMs.Position := 0;
      	  Tbl_textemm_texte.LoadFromStream( oMS);
        End;
      Finally
        oMS.Free;
      End;      
    End;
    Le code fonctionne sous Seven 32bit. Je n'ai pas moyen de tester sous Linux pour le moment.
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  11. #11
    Invité
    Invité(e)
    Par défaut
    Je suis à mon lycée cet après-midi. Je testerai les codes à mon retour sur Nux (64) et Win 7 64 en fin d'après-midi.
    Bonne fin de journée. Gilles


    PS : avez-vous terminé vos boutons images ? J'y ai incorporé mes codes (le mode 9 images à la Windev). Mais j'ai un problème de transparence sous Linux avec l'image "du-dessus" si cette dernière est en au format png ou gif avec gestion interne (à l'image) de la transparence. Autrement dit, si une image png ou gif est réalisée en utilisant le "mauve" comme couleur de transparence (canal alpha), le mauve apparaît dans le bouton. Par contre, si j'utilise la bmp qui m'a servi de modèle et que je déclare la couleur mauve comme transparente alors le mauve est bien transparent.
    Le jour où je trouve une bib. graphique "complète" mais pas trop lourde et stable... et documentée... et qui gère pareillement tous ces prob en Win et Nux, je l'étudie.
    Dernière modification par Invité ; 08/01/2013 à 13h30.

  12. #12
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    Citation Envoyé par selzig Voir le message
    Je suis à mon lycée cet après-midi. Je testerai les codes à mon retour sur Nux (64) et Win 7 64 en fin d'après-midi.
    Bonne fin de journée. Gilles
    Merci d'avance

    Citation Envoyé par selzig Voir le message
    PS : avez-vous terminé vos boutons images ?
    J'ai réalisé un "truc" qui me satisfait pour le moment (bien qu'avec quelques soucis sur la transparence en grisé). Je peux vous envoyer mon "code brouillon" si ça vous dis, pour que vous regardiez. Ça marche sous Seven 32bits.
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bon alors j'ai commencé les premiers tests.
    Il est nécessaire sous GTK2 d'utiliser le patch suivant pour installer le TRichMemo
    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
    Index: gtk2/gtk2richmemo.pas
    ===================================================================
    --- gtk2/gtk2richmemo.pas	(wersja 1314)
    +++ gtk2/gtk2richmemo.pas	(kopia robocza)
    @@ -31,9 +31,9 @@
       // LCL
       LCLType, Controls, Graphics,
       // Gtk2 widget
    -  GtkDef,
    -  GTKWinApiWindow, GtkGlobals, GtkProc, InterfaceBase,
    -  GtkWSControls,
    +  Gtk2Def,
    +  GTK2WinApiWindow, Gtk2Globals, Gtk2Proc, InterfaceBase,
    +  Gtk2WSControls,
       // RichMemo
       WSRichMemo;
     
    @@ -98,7 +98,7 @@
     class procedure TGtk2WSCustomRichMemo.SetCallbacks(
       const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo);
     begin
    -   TGtkWSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject));
    +   TGtk2WSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject));
     end;
     
     class function TGtk2WSCustomRichMemo.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle;
    Réf. : http://bugs.freepascal.org/view.php?id=17319

    Pour l'instant, les tests ont l'air plutôt négatifs :la string reste désespérément vide quels que soient nos codes... mais ce qui me semble le plus inquiétant c'est que sans passer par la string, donc en restant avec le Stream, cela ne passe pas non plus.

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ms1 : TMemoryStream;
    begin
      try
        ms1 := TMemoryStream.Create();
        try
          //ms1.Seek(0, soFromBeginning);
          ms1.Position:= 0;
          RichMemo1.SaveRichText(ms1);
     
          //ms1.Seek(0, soFromBeginning);
           ms1.Position :=0;
           RichMemo2.LoadRichText(ms1);
        except
          showmessage('Oups');
        end;
      finally
        ms1.Free;
      end;
    end;
    Impossible de répliquer le contenu du RichMemo1 dans le RichMemo2 avec ce code... et pas de déclenchement d'exceptions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RichMemo1.SaveRichText(ms1);
     ms1.Seek(0, soFromBeginning); {ou  ms1.Seek(0, soBeginning) ou ms1.Poistion := 0}
     showmessage(intTostr(ms1.size));
    renvoie 0.

    Cela ne fonctionne pas mieux fonctionner en Win7 64 bits. L'appel RichMemo1.SaveRichText(ms1) renvoie une erreur RichEditWndProc RunError(216). La méthode incriminée semble être la ligne 373 SendMessage(RichEditWnd, EM_STREAMOUT, SF_RTF, LPARAM(@cbs) ); dans
    class function TRichEditManager.SaveRichText(RichEditWnd: Handle; ADst: TStream): Boolean; du fichier Win32RichMemoProc...

    Je m'y prends peut-être mal. Il va falloir prendre contact avec le forum de Lazarus... avec mon "broken english" . Je verrai cela demain. Dites donc Jon Shannow, cela laisse supposer des talents luinguistiques dans la langue de Shakespeare... Je peux faire un petit compte-rendu en français... for translation
    Cordialement. Gilles
    Dernière modification par Invité ; 08/01/2013 à 23h09.

  14. #14
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    Citation Envoyé par selzig Voir le message
    Bon alors j'ai commencé les premiers tests.
    Il est nécessaire sous GTK2 d'utiliser le patch suivant pour installer le TRichMemo
    S'il n'y a que cela, ce n'est pas très grave...

    Citation Envoyé par selzig Voir le message
    Pour l'instant, les tests ont l'air plutôt négatifs :la string reste désespérément vide quels que soient nos codes... mais ce qui me semble le plus inquiétant c'est que sans passer par la string, donc en restant avec le Stream, cela ne passe pas non plus.
    Ça c'est plus embêtant...


    Citation Envoyé par selzig Voir le message
    Impossible de répliquer le contenu du RichMemo1 dans le RichMemo2 avec ce code... et pas de déclenchement d'exceptions.

    Cela ne fonctionne pas mieux fonctionner en Win7 64 bits. L'appel RichMemo1.SaveRichText(ms1) renvoie une erreur RichEditWndProc RunError(216). La méthode incriminée semble être la ligne 373 SendMessage(RichEditWnd, EM_STREAMOUT, SF_RTF, LPARAM(@cbs) ); dans
    class function TRichEditManager.SaveRichText(RichEditWnd: Handle; ADst: TStream): Boolean; du fichier Win32RichMemoProc...

    Je m'y prends peut-être mal. Il va falloir prendre contact avec le forum de Lazarus... avec mon "broken english" . Je verrai cela demain. Dites donc Jon Shannow, cela laisse supposer des talents luinguistiques dans la langue de Shakespeare... Je peux faire un petit compte-rendu en français... for translation
    Cordialement. Gilles
    Aïe !
    Fort maille innegliche, no problaime. Ail canne rouiatte ouate you tell (guillaume), inn heu parfaicte innegliche.
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [D 2005][MySQL][Zeos] ResultSet
    Par aragom dans le forum Bases de données
    Réponses: 5
    Dernier message: 21/08/2006, 23h31
  2. [ZEOS] récupérer le SQLCODE ?
    Par qi130 dans le forum Bases de données
    Réponses: 1
    Dernier message: 27/09/2005, 23h09
  3. zeos / liste des tables
    Par Tcheby dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/09/2005, 20h29
  4. EmptyTable Zeos
    Par defluc dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/08/2005, 13h46
  5. Réponses: 5
    Dernier message: 09/12/2002, 22h23

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