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

C++Builder Discussion :

tcomport pour codegear rad studio 2009 [Tutoriel]


Sujet :

C++Builder

  1. #1
    Membre habitué

    Homme Profil pro
    Responsable Informatique Industrielle
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Informatique Industrielle
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 140
    Points
    140
    Par défaut tcomport pour codegear rad studio 2009
    Bonjour,

    Comme vous le savez peut être CodeGear a été racheté par Embarcadero le 30 juin 2008. Ce rachat a donné naissance à une nouvelle version de Studio nommée : Codegear Rad Studio 2009. Je suis donc passé à la nouvelle version, et je me suis rendu compte que l'installation de TComport n'était pas très aisée. Après quelques manipulations et lectures de blogs je vous propose un tutoriel explicitant son installation. J'espère qu'il vous plaira :

    http://trote.developpez.com/tutoriel...ar-rad-studio/

    nb : soyez indulgent c'est mon premier tutoriel sous dv

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Très bon tutoriel qui, j'en suis sur, en dépannera plus d'un
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  3. #3
    Membre habitué

    Homme Profil pro
    Responsable Informatique Industrielle
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Informatique Industrielle
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 140
    Points
    140
    Par défaut
    merci pour l'encouragement

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    salut
    je veux installer le composant TComport et donc je suis le tutoriel,
    la première étape de l'installation se passe très bien par contre à ce niveau rien ne va plus :
    Extrait du tuto :
    "Revenez sur CodeGear C++ Builder 2009 et faites clic droit dans la fenêtre des projets sur
    "DsgnCPortCB2009.bpi" et faites Installer."

    dans la fenêtre je ne trouve pas ce fameux "DsgnCPortCB2009.bpi" donc impossible de continuer.
    PS : Je tourne sur une machine vista.
    Salutations

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut nicao
    excellent Tuto
    Je vais jouer les rabats joie, dans Remarques il y a deux fois cette ligne
    L installation du composant sous "C:\Documents and Settings\All Users\Documents\RAD Studio\6.0\BPL" permet de mieux installer les composants et à C++ Builder de retrouver les dépendances.
    En tout cas felicitation bon boulot
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #6
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Bon tutoriel qui m'a bien aidé.
    Actuellement la dernière version est la 4.11 et elle va jusqu'à Xe.
    Pour ma part j'ai testé l’installation pour Delphi Xe et ça a bien marché. Sauf que je n'ai pas eu besoin de faire la copie du .bpi j'ai directement installé le DsgnCPort et ça a marché.
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    je développe sous Builder 6 et j'envisage une migration sous un compilateur plus récent. Le dernier en date étant Builder XE2, je suis en train de l'essayer. Par contre, impossible d'installer le scomposant ComPort malgré avoir bien suivi le tuto.
    En plus je travaille avec la version 4.11 et j'ai dû télécharger la 4.0beta pour faite les essais d'installation.

    Quelqu'un pourrait-il m'aider à installer la version 4.11 sous Builder XE2 si cela est possible.

    Merci d'avance

  8. #8
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    L'installation de ComPort est toujours galère.
    Après réinstallation d'un de mes PC, j'ai carrément préféré refaire à la main la liaison avec le COM plutot que de passer du temps à essayer d'installer ce composant.

    Ce n'est pas très long à faire, et cela évite bien des prises de tête suivant les versions de C++ Builder (la procédure n'est pas la même ni les version de TComPort ).

    Voici un exemple pour s'inspirer si le besoin de Comport n'est pas essenciel :

    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
     
    	/*! Si port non-ouvert */
    	if (Handle_Com1 == NULL)
    	{
    		/*! - Alors ouvrir le com port 1 */
    		Handle_Com1 = CreateFile( "COM1",
    										  GENERIC_READ | GENERIC_WRITE,
    										  0, 0,
    										  OPEN_EXISTING,
    										  0, 0);
     
    	  COMMTIMEOUTS ctmoNew = {0}, ctmoOld;
    	  GetCommTimeouts(Handle_Com1,&ctmoOld);
    	  ctmoNew.ReadTotalTimeoutConstant = 10;
    	  ctmoNew.ReadTotalTimeoutMultiplier = 0;
    	  ctmoNew.WriteTotalTimeoutMultiplier = 0;
    	  ctmoNew.WriteTotalTimeoutConstant = 0;
    	  SetCommTimeouts(Handle_Com1, &ctmoNew);
     
    	  DCB dcbCommPort;
    	  dcbCommPort.DCBlength = sizeof(DCB);
    	  GetCommState(Handle_Com1, &dcbCommPort);
    	  AnsiString ConfigTxt = "9600,N,8,1";
    	  ConfigTxt = Edit2->Text + "," + Edit4->Text + "," + Edit3->Text + "," + Edit5->Text;
    	  BuildCommDCB(ConfigTxt.c_str(), &dcbCommPort);
    	  SetCommState(Handle_Com1, &dcbCommPort);
     
    	  /*! Balancer un message d'erreur si ouverture du port com impossible sinon afficher image subD en vert*/
    	  if(Handle_Com1 == INVALID_HANDLE_VALUE)
    	  {
    			MessageBox(0,"Erreur d'ouverture de com port","Impossible d'ouvrir le port COM",0);
    			Handle_Com1 = NULL;
    	  }
    	  else
    	  {
    			Image1->Picture->LoadFromFile("src\\SubD9_Green.bmp");
    			Button6Click(NULL);
    	  }
    	}
    	else
    	{
    		PurgeComm(this->Handle_Com1, PURGE_RXABORT);
    		CloseHandle(this->Handle_Com1);
    		this->Handle_Com1=NULL;
    		if (this->Thread_COM1 != NULL)
    			Button6Click(NULL);
    		Image1->Picture->LoadFromFile("src\\SubD9_Red.bmp");
    	}
    Après il suffit d'envoyer recevoir ses trames classiquement ou via thread avec readfile et writefile
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    En même temps, quel est ce besoin d'installer systématiquement des Composants !

    Personnellement, j'ai utilisé le TComPort, en janvier 2012, pour la 1ère fois, pour un petit projet
    le TComPort fonctionne très bien avec des allocations dynamiques en RunTime sans avoir "poser" les composants depuis la Palette sur un TForm surtout quand le projet n'a ni Form ni DataModule !

    Pour le véritable projet, on utilise le TMSComm issu de "C:\Windows\system32\Mscomm32.ocx", un truc hérité du projet précédent en Visual Studio

    Idem, un jour, aussi par curiosité, je ferais la lecture du Port COM en mode Fichier, il me semble que l'on peut faire pareil avec les Ports USB !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Salut tout le monde,

    Argol_Medusa> Je n'ai pas compris ton exemple de code, aurais-tu une exemple un peu plus complet?

    ShaiLeTroll> De quelle façon utilise tu le <<TMSComm issu de "C:\Windows\system32\Mscomm32.ocx" >> ?? aurais-tu un exemple?

    Merci ! Je galère un peu avec le port COM sur C++ Builder XE2 ...

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Pour TMSComm fourni par Visual Studio, l'utilisation de ce composant a été fait bien avant que j'arrive dans la société, je ne connais pas cette partie, de ce que j'ai compris cela utilise les propriétés Input et Output avec des Variant Array créé par VarArrayCreate\varByte, le code est très fouilli car au sein du même programme cela gère aussi de l'IP (depuis l'extérieur c'est totalement transparent)
    Cela semble assez infame !

    Pour TCOMPort en XE2, je n'ai pas tenté d'installer le paquet, parce que je l'ai utilisé juste pour un projet d'aide au développement qui n'avait pas forcément une longue durée de vie !

    A la base, j'ai développe ce programme en 2007, je l'ai parallèlement testé en XE2 pour m'exercer à cette nouvelle version de l'IDE
    Voici la démarche d'utilisation SANS installation du package

    Pour 2007, il suffit d'ajouter CPort.pas et CPortClt.pas au projet
    Cela génère des HPP, il faut les ajouter au projet et les inclure dans les CPP\H qui en ont besoin
    Juste corriger les Constructeur des Exceptions qui ne supporte pas un overload
    Je n'ai pas mémoire d'avoir fait autre chose !

    Pour XE2, c'est incroyablement plus pénible !
    il fait ajouter CPort.pas, CPortEsc.pas, CPortTrmSet et CPortClt.pas au projet dans cette ordre !
    Ajouter la directive No_Dialogs au projet
    Il faut vérifier l'ordre de compilation d'abord CPort.pas, CPortEsc.pas, CPortTrmSet et CPortClt
    ajouter comme chemin de recherche Delphi ".\$(Platform)\$(Config)" pour qu'il trouve les DCU
    Cela génère des HPP, il faut les ajouter au projet et les inclure dans les CPP\H qui en ont besoin
    Ensuite, il faut corriger les HPP et retirer les Constructeurs des Exceptions qui ne supporte pas un overload
    Enfin cela compile, mais il faut se rendre compte qu'il faut tout faire à la main ensuite !

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    //---------------------------------------------------------------------------
    void __fastcall TPortComShaiSwitchMainForm::BtnOpenPortCOMClick(TObject *Sender)
    {
      BtnClosePortCOM->Click();
     
      if (cbxPortComSelector->ItemIndex >= 0)
      {
        if ( ! FComPort)
        {
          FComPort = new TComPort(NULL);
     
          TComDataPacket *TmpComDataPacket = new TComDataPacket(FComPort);
          TmpComDataPacket->ComPort = FComPort;
          TmpComDataPacket->StartString = (char)02;
          TmpComDataPacket->StopString = (char)0x0d;
          TmpComDataPacket->IncludeStrings = true;
          TmpComDataPacket->OnPacket = ComDataPacketEventHandler;
     
          TComLed *TmpComLed = new TComLed(FComPort);
          TmpComLed->ComPort = FComPort;
          TmpComLed->LedSignal = lsConn;
          TmpComLed->Left = ImageConnected->Left + ImageConnected->Width;
          TmpComLed->Top = ImageConnected->Top;
          TmpComLed->Parent = GroupBoxComSelector;
          TmpComLed->Visible = true;
     
          LabelComLedLegend->Top = TmpComLed->Top + TmpComLed->Height + 2;
          LabelComLedLegend->Left = TmpComLed->Left;
     
          TmpComLed = new TComLed(FComPort);
          TmpComLed->ComPort = FComPort;
          TmpComLed->LedSignal = lsRx;
          TmpComLed->Left = ImageConnected->Left + ImageConnected->Width + TmpComLed->Width;
          TmpComLed->Top = ImageConnected->Top;
          TmpComLed->Parent = GroupBoxComSelector;
          TmpComLed->Visible = true;
     
          TmpComLed = new TComLed(FComPort);
          TmpComLed->ComPort = FComPort;
          TmpComLed->LedSignal = lsTx;
          TmpComLed->Left = ImageConnected->Left + ImageConnected->Width + (2 * TmpComLed->Width);
          TmpComLed->Top = ImageConnected->Top;
          TmpComLed->Parent = GroupBoxComSelector;  
          TmpComLed->Visible = true;
     
          FComTerminal = new TComTerminal(FComPort);
          FComTerminal->ComPort = FComPort;
          FComTerminal->Emulation = teNone;
          FComTerminal->LocalEcho = true;
          FComTerminal->AppendLF = true;
          FComTerminal->ClearScreen();
     
          FComTerminal->Align = alClient;
          FComTerminal->Parent = TabSheetTerminal;
          FComTerminal->Visible = true;
        }
     
        FComPort->Port = cbxPortComSelector->Items->Strings[cbxPortComSelector->ItemIndex];
     
        if (RadioGroupComProtocol->ItemIndex == 0)
        {
          FComPort->BaudRate = br9600;
          FComPort->DataBits = dbSeven;
          FComPort->Parity->Bits = prEven;
          FComPort->StopBits = sbOneStopBit;
        }
        else
        {
          FComPort->BaudRate = br19200;
          FComPort->DataBits = dbEight;
          FComPort->Parity->Bits = prNone;
          FComPort->StopBits = sbOneStopBit;
        }
        FComPort->Open();
     
        GroupBoxComOperations->Visible = true;
        ImageConnected->Visible = true;
        ImageDisonnected->Visible = false;
     
        GroupBoxComOperations->Caption = "Opérations sur le Port COM Ouvert : " + FComPort->Port;
      }
      else
      {
        lblErrorPortComSelector->Caption = "Port non sélectionné !";
        lblErrorPortComSelector->Visible = true;
      }
    }
    ensuite, ceci pour écrire
    J'utilise un struct et pointer contenant les données binaires, aligné à 1 octet
    Très important, j'utilise Write(void*) (la variant non typé du Delphi) qui me garanti aucune altération lié à l'Unicode !

    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
    //---------------------------------------------------------------------------
    /*static*/ bool CShaiSwitchCOMToolHelp::SendShaiSwitchCOMMessage(TComPort* AComPort, const TShaiSwitchCOMMessage &AMsg, AnsiString &AHexaMsg)
    {
      bool Result = false;
      int BufferCount = sizeof(AMsg.Header) + AMsg.Data.DataLength + sizeof(AMsg.Footer);
     
      BYTE* Buffer = new BYTE[BufferCount];
      try
      {
        BYTE* BufferPtr = Buffer;
     
        CopyMemory(BufferPtr, &AMsg.Header, sizeof(AMsg.Header));
        BufferPtr += sizeof(AMsg.Header);
     
        if ((AMsg.Data.DataLength > 0) && AMsg.Data.Value)
        {
          CopyMemory(BufferPtr, AMsg.Data.Value, AMsg.Data.DataLength);
          BufferPtr += AMsg.Data.DataLength;
        }
     
        CopyMemory(BufferPtr, &AMsg.Footer, sizeof(AMsg.Footer));
     
        Result = AComPort->Write(Buffer, BufferCount) == BufferCount;
        if (Result)
        {
          char* HexaBuf = new char[BufferCount * 2 + 1];
          ZeroMemory(HexaBuf, BufferCount * 2 + 1);
          BinToHex(Buffer, HexaBuf, BufferCount);
          AHexaMsg = HexaBuf;
          delete [] HexaBuf;
        }
      }
      __finally
      {
        delete [] Buffer;
      }
     
      return Result;
    }
    Pour la reception ComDataPacket fourni une UnicodeString mais cela fonctionne très bien, j'expliquais dans le sujet
    [Tcomport] et un petit problème de configuration
    comment cela fonctionnait pour copier les octets reçus dans chaque octet de poids faible de l'Unicode

    Donc cette UnicodeString dans ComDataPacket.OnPacket, je la passe à une ma fonction de découpage "Parse", hors comme j'utilise explicitement AnsiString comme paramètre de "Parse", cela implique une conversion implicite de l'UnicodeString en AnsiString

    Et là, dans mon programme, on a aucune valeur qui dépasse 7F (127), le plus grand nombre sur 7 bits.
    En réalité c'est même plus limité que cela, car les octets sont tous de la forme 0011xxxx donc au max c'est 37 (63), c'est un protocole qui a presque 30 ans, lié à l'utilisation de RS422, type de Bus entre nos périphérique que l'on commercialise, que l'on centralise sur un "centralisateur" qui converti le RS422 en RS232 ou TCP\IP

    si je ne me trompe pas, les 255 premières valeurs de 0000 à 00FF de l'Unicode c'est l'ANSI, mais l'AnsiString dépend de la langue de l'OS, Windows-1252 en France, j'ignore ce qui se produit pour les valeurs entre 0000 et 0080, est-ce qu'il y a conversion ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. CodeGear RAD Studio 2009
    Par chedhane dans le forum Débuter
    Réponses: 5
    Dernier message: 27/05/2010, 22h54
  2. Mise à jour 3 de l'aide de CodeGear RAD Studio 2007
    Par delphichem dans le forum EDI
    Réponses: 0
    Dernier message: 30/04/2008, 15h49
  3. Correctif Avril 2008 pour CodeGear RAD Studio 2007
    Par delphichem dans le forum EDI
    Réponses: 0
    Dernier message: 19/04/2008, 12h17
  4. Mise à jour 2 de l'aide de CodeGear RAD Studio 2007
    Par delphichem dans le forum EDI
    Réponses: 2
    Dernier message: 14/03/2008, 12h31

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