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 :

Probl�me ListView et receiveText()


Sujet :

C++Builder

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut Probl�me ListView et receiveText()
    Bonjours � tous !
    Dans une appli client/serveur
    Voila j'ai cr�� un ListView avec plusieurs colonnes :
    -Utilisateur : nom d' utilisateur du client
    -@ IP :adresse Ip du client
    Cot� client :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    AnsiString info =ClientSocket1->Socket->RemoteHost;
    ClientSocket1->Socket->SendText(info) ;
    AnsiString adresse=ClientSocket1->Address;
    ClientSocket1->Socket->SendText(adresse);
    Donc je veux r�ceptionner le text cot� serveur:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    AnsiString Buffer = Socket->ReceiveText();
     
    //ajoute le texte
    TListItem *Item =ListView1->Items->Add();
    Item->Caption=Buffer;
    Item->SubItems->Add(Buffer);
    Item->SubItems->Add("1.0");
    Item->SubItems->Add(Buffer);        
    }
    screen:

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    Ai-je mal lu ou il n'y a pas de question?

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    oups oui j'ai �t� un peu vite :
    enfait ma question se r�sume ;comment faire pour recevoir l @ IP et l'Host dans les bonne colonnes ?

  4. #4
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    Il faut que tu fasses la d�composition analytique de la cha�ne de caract�re re�u.

    Tu pourrais envoyer tes donn�es sous la forme: <ip>192.168.0.3</ip><host>localhost</host>

    Ou sinon tu s�pares chaque item avec un caract�re ou une s�rie de caract�re quelconque: 192.168.0.3|localhost

    EDIT:
    Aussi la trame envoy� pourrait avoir une grandeur fixe et tu connais la position de chaque item � l'int�rieur. Tu mets des espaces comme buffer comme �a tu peux faire un trim.

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    c'est vrai que je n'y pas du tout penser
    d�couper la trame pour la traiter je pense que c'est une bonne id�e sur ce , je test..

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    voila j'ai d�couper ma trame avec des caract�res de cette fa�on :
    cot� client :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    AnsiString info =ClientSocket1->Socket->RemoteHost;
    AnsiString adresse=ClientSocket1->Address;
    ClientSocket1->Socket->SendText(info+"|") ;
    ClientSocket1->Socket->SendText("<"+adresse+">");
    mais j'ai beaucoup de mal a r�ceptionner cot� serveur, comment r�cup�rer les caract�res qui coupe ma trame :

    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
    AnsiString MsgComplet = Socket->ReceiveText() ;
     
    //ajoute le texte
    TListItem *Item =ListView1->Items->Add();
     
    for(int i =1 ; i<MsgComplet.Length();i++)
    {
     
              if(MsgComplet[i]=='|')//test si le caractère est présent dans la chaine
              {
              Item->Caption= MsgComplet;
              }
              else
              {
               Item->Caption="foiré";
              }
    }

  7. #7
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    Si tu veux savoir si le caract�re est dans la chaine fais ceci:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    if(MsgComplet.Pos("|"))
    {	// Le caractère | est dans MsgComplet
     
    }
    else
    {  	// Le caractère | est absent de MsgComplet
     
    }

  8. #8
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    j'arrive pas � visualiser comment s�parer la trame quand je tombe sur mon cart�re, recup�rer tout le texte avant le caract�re et ensuite l'afficher.

    ceci donne la position du caract�re dans la chaine enint

  9. #9
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    En combinant les propri�t�s Pos, SubString et Length je suis s�r que tu peux y arriver.

    Utilise ton imagination

  10. #10
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    voila j'ai r�ussi � peu pr�s ce que je voulais faire:

    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
     //reception Host
              if(MsgComplet.Pos("*")&& MsgComplet.Pos("|"))
              {
               // Le caractère *et | est dans MsgComplet
    Item->Caption=MsgComplet.SubString(MsgComplet.Pos("*"),MsgComplet.Pos("|"));
              //MsgComplet="";
     
              }
              else
              {
               Item->SubItems->Add("Erreur trame !");
              }
     
                   //reception ip
               if(MsgComplet.Pos("<")&&MsgComplet.Pos(">"))
              {
                // Le caractère < et >est dans MsgComplet
     
                        Item->SubItems->Add(MsgComplet.SubString(MsgComplet.Pos("<")+1,MsgComplet.Length()));
              //MsgComplet="";
     
              }
     
                  else
                  {
                     Item->SubItems->Add("Erreur trame !");
                  }

    Il me reste plus qu'� effacer les caract�res qui d�coupent ma trame et j'aurais obtenu ce que je voulais, merci beaucoup pour les r�ponses !

  11. #11
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    Salut, juste pour bien comprendre c'est quoi la string que tu re�ois? Je ne comprend l'utilisation du caract�re '*'.

    Tu devrais mettre le r�sultat en m�moire dans une variable plut�t que d'appeler MsgComplet.Pos("|") deux fois.

  12. #12
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    Voila la trame du client que je receptionne :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    AnsiString info =ClientSocket1->Socket->RemoteHost;
    AnsiString adresse=ClientSocket1->Address;
    ClientSocket1->Socket->SendText("*"+info+"|") ;
    ClientSocket1->Socket->SendText("<"+adresse+">");
    je simplifie en ce moment mon code

  13. #13
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    Je peux savoir pourquoi tu n'utilises pas un seul s�parateur. Ici tu as une combinaison de |, <, > et *.

    C'est un peu complexe pour rien. Tu n'as jamais regarder les fichiers CSV ou [ame="http://fr.wikipedia.org/wiki/Format_TSV"]TSV[/ame]. C'est un bon exemple de donn�es qui sont s�par�es.

  14. #14
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    Ba en fait pour d�couper ma trame j'ai trouv� plus simple de rajout� un caract�re .
    Avant j'ai essayer des test mais je n'y arrivais pas.
    exemple:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if( MsgComplet.Pos("|"))
              {
              Item->Caption=MsgComplet.SubString(MsgComplet.Length(),MsgComplet.Pos("|"));
              //MsgComplet="";
     
              }
              else
              {
               Item->SubItems->Add("remplir");
              }

  15. #15
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    Tiens voici un bout de code fait rapidement qui fonctionne avec un seul s�parateur de n'importe quel grandeur:

    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
        AnsiString TempString, Sep = "|"; // Le séparateur peut être n'importe quoi
        if(!MsgComplet.IsEmpty())
        {
            unsigned int Sepos;
            AnsiString Copy = MsgComplet; // On fait une copie au cas ou MsgComplet est une constante
            if(Copy.SubString(Copy.Length() - Sep.Length() + 1, Sep.Length()) != Sep)
            	Copy += Sep;
            while((Sepos = Copy.Pos(Sep)) > 0)
            {
                TempString = Copy.SubString(1, Sepos - 1);
                /*
                ICI tu fais ce que tu veux avec TempString
                */
                Copy = Copy.SubString(Sepos + Sep.Length(), Copy.Length());
            }
        }
    Je l'ai tester avec:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
        AnsiString MsgComplet = "192.168.0.3|localhost";

  16. #16
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    Merci beaucoup pour ce bout de code sa va m'aider � comprendre beaucoup de chose ! il est temps pour moi d'aller dormir

  17. #17
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    Bonne nuit, voici une autre version du code. Ici je rempli une liste que j'utilise par la suite, c'est peut-�tre plus facile comme �a:

    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
        TStringList *ListeDeCommande = new TStringList;
        AnsiString Sep = "|"; // Le séparateur peut être n'importe quoi
        if(!MsgComplet.IsEmpty())
        {
            unsigned int Sepos;
            AnsiString Copy = MsgComplet; // On fait une copie au cas ou MsgComplet est une constante
            if(Copy.SubString(Copy.Length() - Sep.Length() + 1, Sep.Length()) != Sep)
            	Copy += Sep;
            while((Sepos = Copy.Pos(Sep)) > 0)
            {
                ListeDeCommande->Add(Copy.SubString(1, Sepos - 1));
                Copy = Copy.SubString(Sepos + Sep.Length(), Copy.Length());
            }
        }
     
        Item->Caption = ListeDeCommande->Strings[0];
        Item->SubItems->Add(ListeDeCommande->Strings[1]);
     
        // Quand tu as finis avec la liste, tu l'efface
        delete ListeDeCommande;

  18. #18
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    162
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Par d�faut
    Bonne nuit ! merci por tout ! je vois sa au clair demain !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [AC-2003] Probl�me Listview Access
    Par usac49 dans le forum VBA Access
    R�ponses: 4
    Dernier message: 22/09/2009, 14h36
  2. probl�me listviews vba
    Par Beralienne dans le forum Macros et VBA Excel
    R�ponses: 12
    Dernier message: 21/06/2008, 00h49
  3. Probl�me ListView (grille)
    Par Nuxiz dans le forum VB 6 et ant�rieur
    R�ponses: 0
    Dernier message: 28/12/2007, 20h21
  4. Probl�me listview VB6
    Par hdmak dans le forum VB 6 et ant�rieur
    R�ponses: 2
    Dernier message: 02/04/2007, 13h58
  5. [VB.NET] Probl�me ListView avec checkbox
    Par elkidos dans le forum Windows Forms
    R�ponses: 1
    Dernier message: 15/02/2007, 15h27

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