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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if(MsgComplet.Pos("|"))
    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