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

 Delphi Discussion :

FView ou Record sur fichier avec ligne différente


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut FView ou Record sur fichier avec ligne différente
    Bonjour à tous et à toutes.

    J'utilise actuellement ceci pour lire un fichier text qui comporte pour chaque ligne la meme dimension (meme longueur)

    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
    Type
     
      PFileStrucAPI = ^TFileStrucAPI;
      TFileStrucAPI = packed record
                private __NumFact        : array[0..7] of AnsiChar; // 8
                private __NumCompte      : array[0..8] of AnsiChar; // 8
                private __Date           : array[0..5]   of AnsiChar; // 6
                private __LibelleManuel  : array[0..59]  of AnsiChar; // 60
                private __Debit          : array[0..19]  of AnsiChar; // 20
                private __Credit         : array[0..19]  of AnsiChar; // 20
                private __RepEcheances   : array[0..259] of AnsiChar; // 260
                private __RepAnalytique  : array[0..399] of AnsiChar; // 400
                private __Devise         : array[0..7]   of AnsiChar; // 8
                private __Cours          : array[0..19]  of AnsiChar; // 20
                private __LibellePiece   : array[0..59]  of AnsiChar; // 60
                private __FlagPiece      : array[0..0]   of AnsiChar; // 1
                private __Quantite       : array[0..14]  of AnsiChar; // 14
                private __Unite          : array[0..2]   of AnsiChar; // 3
                private __Reserve        : array[0..29]  of AnsiChar; // 30
                private __FinECR         : array[0..1]   of AnsiChar; // 2
                private __NomLogiciel    : array[0..59]  of AnsiChar; // 60
                private __CodeDossier    : array[0..59]  of AnsiChar; // 60
                private __TypeDeLaPiece  : array[0..59]  of AnsiChar; // 60
                private __IdentDGI       : array[0..29]  of AnsiChar; // 30
                private __InfoLibre      : array[0..119] of AnsiChar; // 120
                private __FinLigne       : array[0..1]   of AnsiChar; // 2
              end;
     
    Const
      SizeOfFileStrucAPI = SizeOf(TFileStrucAPI);
     
    implementation
     
    //LECTURE PARTIELLE
    {$REGION LECTURE PARTIELLE}
    function ApiCompteNodup(Fichier: TStringList;Chemin, BaseAccess:string): TStringList;
    var
      FV         : TFileView;
      i,n, count : Integer;
      Cnx        : TADOConnection;
      Qry        : TADOQuery;
      NbFichiers : Integer;
    begin
      result := TStringList.Create;
      result.sorted := True;
      result.duplicates := dupIgnore;
     
      NbFichiers := Fichier.Count;
      Dossier := TStringList.Create;
      Logiciel := TStringList.Create;
      Dossier.Duplicates := dupAccept;
      Logiciel.Duplicates := dupAccept;
     
      for i := 0 to NbFichiers - 1 do
      begin
        FV  := TFileView.Create(Trim(Fichier[i]));
        try
          if FV.Loaded then
          begin
            Count := ((FV.FileSize) div SizeOfFileStrucApi); // nombre d'elements
            for n := 0 to count-1 do
            begin
              if n = 0 then
              begin
                Dossier.Add(Trim(PFileStrucAPI(Pointer(Integer(FV.View) + (SizeOfFileStrucAPI*n)))^.__CodeDossier));
                Logiciel.Add(Trim(PFileStrucAPI(Pointer(Integer(FV.View) + (SizeOfFileStrucAPI*n)))^.__NomLogiciel));
              end;
              Result.Add(Trim(PFileStrucAPI(Pointer(Integer(FV.View) + (SizeOfFileStrucAPI*n)))^.__NumCompte));
            end;
          end;
        finally
          FV.Free;
        end;
      end;
    // ...
    end;
     
    {$ENDREGION LECTURE PARTIELLE}
    J'obtiens donc un TStringList comportant aucun doublon sur __NumCompte.

    Mais je suis maintenance face une fichier qui n'a pas là même longueur pour chaque ligne donc

    Count := ((FV.FileSize) div SizeOfFileStrucApi); // nombre d'elements

    est erronée et je ne peux pas parcourir chaque ligne.

    Est-il possible avec le TFileView de faire un parcourir de chaque ligne sachant qu'au bout de chaque ligne j'ai un 0D0A

    Merci.

    Vous pouvez retrouvez l'unite FView ici
    Ps : le sujet INITIAL

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    héhéhé je reconnais ma p'tite classe

    mmm des lignes de longueurs variable hein ... pas évident.
    FileView c'est bien pour tout ce qui est fixe ou déterminable.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    héhéhé je reconnais ma p'tite classe

    mmm des lignes de longueurs variable hein ... pas évident.
    FileView c'est bien pour tout ce qui est fixe ou déterminable.
    Parfaitement Dr.Who

    Et tu peux voir que cela sert...

    Donc admettons que la fin d'une ligne est toujours le même caractère, comme puis-je procéder ?

    Envoyer mon fichier text dans un memo ? (et traiter les lignes) ?

    Il y a-t-il quelquechose de plus pro ?

    En plus précis, je sais aussi que le premier caractère de chaque ligne me permet de savoir quel traitement je doit y faire.

    Mon fichier ressemble à cela (ligne par ligne):

    A88
    B401000 TARTANPION
    B607000 ACHAT
    B445660 TVA 19,6
    C
    A88
    B512000 BANQUE
    B401000 TARTANPION
    C

    j'ai donc A qui me permet de savoir que je commence à lire des écritures, B sont les écritures et C la fin de mon écriture.
    A, B et C sont toujours de même longueur
    A fait 3, B fait 326 et C Fait 1
    et se termine toujours par un retour chariot

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 083
    Points
    41 083
    Billets dans le blog
    62
    Par défaut
    mais pourquoi faire compliqué quand on peut faire simple ?
    Bien que FileView soit TRÈS intéressant pourquoi ne pas retourner au basiques (CSV)
    J'ai également découvert (a ma grande joie) le TSimpleDataset de D2010 je pense que D2009 l'a aussi

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    mais pourquoi faire compliqué quand on peut faire simple ?
    Bien que FileView soit TRÈS intéressant pourquoi ne pas retourner au basiques (CSV)
    J'ai également découvert (a ma grande joie) le TSimpleDataset de D2010 je pense que D2009 l'a aussi
    Salut Serge,
    Après ce que je viens de lire sur ce TsimpleDataSet je ne vois pas comment pourvoir l'appliquer sur ce genre de fichier.
    1) Je n'ai pas pour chaque ligne la même taille
    2) je doit découper les lignes en morceau (colonne)
    Comment faire un lien sur ce genre avec un DataSet ? j'imagine qu'il faut pouvoir identifier des colonnes (donc des champs) et au vue de ma remarque 1) c'est impossible ?

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Salut Buzz.
    Je n'ai pas pour chaque ligne la même taille
    ... Suggestion style sytème "D" : tu peux utiliser FileView après avoir créé à partir du fichier original un fichier de travail dans lequel les lignes commençant par un B seront toutes complétées par autant d'espaces ' ' que nécessaire afin que ces lignes aient toutes la même taille.

    Comme Ligne:=Ligne + StringOfChar(' ',DeltaLongueur) est une concaténation assez lente tu peux, pour gagner de la speed utiliser la routine suivante de ShailLeTroll qui est plus rapide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure CopyAndFill5(var S: string; NewLength: Integer; CharFill: Char; Left : boolean); 
    var       OldLength: Integer;
    begin     OldLength := Length(S);
              if OldLength >= NewLength then EXIT
              else
              begin
                SetLength(S, NewLength);
                if Left then
                begin CopyMemory(@S[NewLength - OldLength + 1], @S[1], OldLength);
                      FillMemory(@S[1], NewLength - OldLength, Byte(CharFill));
                end else FillMemory(@S[OldLength + 1], NewLength - OldLength, Byte(CharFill));
              end;
    end;
    Utilisation : Avec Left := False elle ajoute autant de CharFill:=' ' à droite de S qu'il faut afin que length(S) soit égale à NewLength ... (et avec Left:=True elle les ajoute à gauche)

    A+.

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    @Gilbert,

    Je me suis penché la dessus mais j'avais peur des lenteurs, grace à toi je vais pouvoir m'en ralentir une partie du traitement.

    Reste quand même à faire du readln classique dessus, j'espere que cela ne va pas ralentir trop le traitement, et ensuite un writeln.
    Ou alors j'envoi tout sur un Tmemo, ou un Stream et StreamsDelphi.pdf, je sais pas encore...

    je vais tester ta proposition.
    Merci

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re,

    Reste quand même à faire du readln classique dessus, j'espere que cela ne va pas ralentir trop le traitement, et ensuite un writeln.
    Ou alors j'envoi tout sur un Tmemo, ou un Stream et StreamsDelphi.pdf, je sais pas encore...
    ... readln puis writeln peut être acceptable.
    ... un TMemo va être plus lent à cause de l'affichage, lui préférer une StringList.
    ... des Stream ça peut être plus rapide mais plus compliqué vu que la taille des lignes du fichier original n'est pas constante.

    A+

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    ...des Stream ça peut être plus rapide mais plus compliqué vu que la taille des lignes du fichier original n'est pas constante.

    A+
    Avec ta methode en fait,
    1) je lis avec un stream,
    2) je modifie avec ta méthode chaque ligne
    3) j'envoi dans un record
    4) j'ecris avec stream

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re,

    Avec ta methode en fait,
    1) je lis avec un stream,
    2) je modifie avec ta méthode chaque ligne
    3) j'envoi dans un record
    4) j'ecris avec stream
    ... je n'ai pas évoqué une seule methode mais 3

    Et la plus simple c'est :
    1) MaStringList1.LoadfromFile(NomFichierOriginal)
    2) For i:=0 to MaStringList1.Count-1 do MaStringList1[i]:=CopyAndFill5(MaStringList1[i], LongueurMax, ' ', False);
    3) MaStringList1.SavetoFile(NomFichierDestination)
    4) Utilisation de FView avec FichierDestination
    ... mais tu es libre de faire plus compliqué.

    A+.

    EDIT : PS : ne pas oublier MaStringList1:=tStringList.create au début.

  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Re,
    ... je n'ai pas évoqué une seule methode mais 3


    EDIT : PS : ne pas oublier MaStringList1:=tStringList.create au début.


    Bon,
    J'ai des drôles de caractères à la place d'un espace !!!

    Voilà ma procédure

    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
    function FixLigneFile(Fichier: TStringList; LMax:Integer; CharFill: Char): TStringList;
    Var
      i,j         : Integer;
      TempFile    : TStringlist;
      xStr        : String;
     
      OldLength: Integer;
    begin
    // Lecture des lignes des fichiers \\
      result := TStringList.Create;
      result.sorted := True;
      for i := 0 to Fichier.Count - 1 do
      begin
        TempFile := TStringlist.Create;
        Try
          TempFile.LoadFromFile(Fichier[i]);
     
          for j := 0 to TempFile.Count - 1 do
          begin
            xStr := TempFile[j];
      showmessage(xStr);
            OldLength := Length(xStr);
            if OldLength < LMax then
            begin
              SetLength(xStr, LMax);
              FillMemory(@xStr[OldLength + 1], LMax - OldLength, Byte(CharFill));
            end;
       showmessage(xStr);
            TempFile[j] := xStr;
          end;
     
          TempFile.SaveToFile(Fichier[i]+'.tmp');
     
          Result.Add(Fichier[i]+'.tmp');
        Finally
          TempFile.free;
        End;
      end;
    end;
    Bon j'ai simplifié, j'utilise que le right et je met cela directement dans le count du Stringlist

    Je passe par un xStr car sinon big boom.

    Donc là, la taille est respectée et le FView qui suit fonctionne, mais le fichier .tmp créer comporte des croix de jésus christ !!! (je me demande si mon pc n'est à notre Pape ) à la place d'un espace !!:


  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re,

    Donc là, la taille est respectée et le FView qui suit fonctionne, mais le fichier .tmp créer comporte des croix de jésus christ !!! (je me demande si mon pc n'est à notre Pape ) à la place d'un espace !!:
    ... l'essentiel est que le FView qui suit fonctionne
    ... ensuite si ça te chagrine que dans le fichiers temporaires t'as des croix à la place d'espaces, tu peux remplacer CharFill:=' ' par CharFill:='-' ou CharFill:='z'

    Et pour la vitesse ça va ???

    A+

  13. #13
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Re,


    ... l'essentiel est que le FView qui suit fonctionne
    ... ensuite si ça te chagrine que dans le fichiers temporaires t'as des croix à la place d'espaces, tu peux remplacer CharFill:=' ' par CharFill:='-' ou CharFill:='z'

    Et pour la vitesse ça va ???

    A+
    Pour la vitesse c'est parfait, sauf que je ne peux pas l'utiliser, encore un fois si je demande des espaces il me mets n'importe naouak.
    Et je ne peux pas malheureusement mettre un autre caractères.
    Pourquoi ?

    Tout simplement car ensuite
    1) je là lit avec le FView, pendant cette lecture je récupère donc une position du pointeur et donc un certain nombre de caracètre
    2) je doit ensuite tester selon ce que je retourne si la chaine est vide ou non !!!
    - Si est elle vide (c'est que j'était sur une ligne A ou C) et donc aucun interet de prendre l'info
    - Sinon (cas du B) je doit le récupèrer dans mon StringList.

    Pour contourner cette problématique pour le moment j'ai utiliser cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xStr := xStr + StringOfChar(CharFill,LMAx - Length(xStr));
    Mais de tout façon cela ma énormément aidé.

    MErci encore.

  14. #14
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Pour la vitesse c'est parfait, sauf que je ne peux pas l'utiliser, encore un fois si je demande des espaces il me mets n'importe quoi.
    Et je ne peux pas malheureusement mettre un autre caractères.
    Pourquoi ?
    ...
    2) je doit ensuite tester selon ce que je retourne si la chaine est vide ou non !!!
    - Si est elle vide ...aucun interet de prendre l'info
    - Sinon (cas du B) je doit le récupèrer dans mon StringList.

    Pour contourner cette problématique pour le moment j'ai utiliser cela :

    xStr := xStr + StringOfChar(CharFill,LMAx - Length(xStr));
    ... je suppose que si la xStr-originale est vide tu l'ignores et tu ne fais pas xStr:=xSt+StringOfChar() donc le pb des lignes vides est réglé d'entrée de jeu ... et comme xStr:=xSt+StringOfChar() fait la même chose que CopyAndFill avec ajout des CharFill il ne reste donc que le problème des lignes-non-vides que tu calibres en ajoutant des espaces à droite et que tu veux qu'ils soient des espaces et pas les croix.
    Il reste deux possibiltés à tester :
    - soit tes croix apparaissent du fait que l'affichage des lignes nécessite d'être achevées par #13#10 (CRLF) et que leur absence interfère sur le rendu de l'affichage ???
    - et au lieu d'utiliser CharFill:=' ' ou CharFill:=Chr(32) qui correspondent à un espace dit "normal" tu peux essayer avec CharFill:=Chr(160) qui est un espace dit "insécable" (c'est un espace visuellement identique à un espace "normal" mais qui dans les applis de traitement de texte est considéré comme un caractère faisant partie intégrante de deux mots qu'il sépare visuellement ainsi par exemple 'boeuf bourguignon' y est considéré comme un seul mot)

    A+.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/01/2010, 14h10
  2. [Grep] RegEx sur fichier avec séparateur ";"
    Par Ticoche dans le forum Applications et environnements graphiques
    Réponses: 7
    Dernier message: 20/02/2009, 16h12
  3. [Sunopsis v3] création d'un fichier avec ligne d'entête
    Par raphoun07 dans le forum ODI (ex-Sunopsis)
    Réponses: 3
    Dernier message: 20/02/2009, 13h17
  4. I/O sur fichiers avec JBoss
    Par FredKéKé dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 26/09/2006, 09h18
  5. Problème d'E.S. sur fichier avec open
    Par Bubonik software dans le forum C
    Réponses: 6
    Dernier message: 04/02/2004, 19h42

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