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 :

une comparaison qui marche pas.


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut une comparaison qui marche pas.
    Bonjour à tous.

    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
    bool Present;
    for (int I = 0; I < Table1->RecordCount; I++)
        {
        Present = false;
        if (Table1->FieldByName("Machin")->Value.VString != "") // Aévite d'ajouter une ligne vide dans le ComboBox
           {Form4->ComboBox2->ItemIndex = 0;
           for (int C = 0; C < ComboBox2->Items->Count; C++)
               {
               ComboBox2->ItemIndex = ComboBox2->ItemIndex + 1;
               if (ComboBox2->Items->Text == Table1->FieldByName("Machin")->AsString) // C'est la ligne qui pose problème
                  {
                  Present = true;
                  }
               }
           if (Present == false)
              {
              Form4->ComboBox2->Items->Add(Table1->FieldByName("Machin")->Value);
              }
           }
        Table1->Next();
        }
    Donc, je charge dans un ComboBox des valeurs. Ces valeurs peuvent être identique et je veux donc quelles n'apparaissent pas plusieurs fois.
    Seulement, même si les valeurs sont identiques, ca marche pas.
    En faisant un pas à pas, elles sont toujours différentes.
    Pourquoi et comment faire pour contourner ce problème?
    J'utilise une kbmMemTable.

    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Salutations,

    == est déclaré comme surchargé dans la doc mais l'est pas du tout, j'ai deja eut le meme probleme...
    utilise AnsiCompare() a la place

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (!ComboBox2->Items->Text.AnsiCompare(Table1->FieldByName("Machin")->AsString))
    - yotasse -

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Merci bien mais ca fonctionne pas. Il n'exécute jamais ce qu'il y a entre les {} de if.
    J'ai pris 2 labels et j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Label1->Caption = Label1->Caption + ComboBox2->Items->Text;
    Label2->Caption = Label2->Caption + Table1->FieldByName("Machin")->AsString
    J'obtiens pour label2 :
    Machin1Machin2Machin2Machin3
    Pour le Label1 :
    Machin1
    Machin2
    Machin2
    Machin3
    Donc pourquoi le ComboBox2 possède une sorte de retour à la ligne.

  4. #4
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Votre programme est faux parce que vous faites vos comparaisons avec la propriété Text. Or Text représente ce qui est visible en haut du ComboBox alors que vous, vous voudriez visitez les chaînes successives présentes dans le ComboBox, donc il faut utiliser ComboBox1->Items->Strings[i] où i est l'index compris entre 0 et ComboBox1->Items->Count. Voici une petite routine d'insertion qui reçoit en argument un AnsiString A et qui ajoute la chaîne A au ComboBox si A est différent des autres chaînes présentes dans ce même ComboBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm1::Insere(AnsiString A)
    {
    int i;
    for(i=0;i<ComboBox1->Items->Count;i++)
    if(ComboBox1->Items->Strings[i]==A) return;
    ComboBox1->AddItem(A,ComboBox1);
    }
    On compare A avec les chaînes existantes. Dès que A est perçu comme égal à une chaîne on sort. Sinon, si on ne sort jamais, la boucle se termine, on sait alors que A n'est égal à aucune des chaînes du ComboBox, on insère alors A dans le ComboBox.

    À bientôt
    Gilles

  5. #5
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Bonjour,

    Je me permet de proposer également une solution basée sur l'utilisation de la propriété Duplicates des TStringList :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      TStringList* Liste;
      Liste = new TStringList;
      Liste->Duplicates = dupIgnore;
      Liste->Sorted = true;
      Liste->Add("Test");
      Liste->Add("Test2");
      Liste->Add("Test3");
      Liste->Add("Test");
      Liste->Add("Test3");
     
      ComboBox1->Items = Liste;
     
      delete Liste;
    Le problème est que l'utilisation de Duplicates implique que la liste soit triée, et cela peut donc être un problème.

    Cordialement,

    Arnaud

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    MERCI!

    Ca fonctionne avec la methode de Gilles Louïse.

    Mais je comprend pas pourquoi en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComboBox2->ItemIndex = ComboBox2->ItemIndex + 1;
    ca fonctionne pas en utilisant ComboBox2->Items->Text

    Votre programme est faux parce que vous faites vos comparaisons avec la propriété Text. Or Text représente ce qui est visible en haut du ComboBox alors que vous, vous voudriez visitez les chaînes successives présentes dans le ComboBox
    Je croyais que je le faisait puisque j'avais fait un test avec des label pour savoir ce qui était comparé.

    Merci bien.

  7. #7
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    N'oubli pas de marquer le sujet comme Résolu, s'il te plait...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Désolé pour ma fausse piste ,
    Dans mon code j'avais besoin d'une comparaison casse indépendante, d'ou l'utilisation de AnsiCompareIC() et pas de == .... j'ai lu la question un peu rapidement : si cela ne marche pas, toi meme le dit : il y a un retour chariot dans l'une des string retournée.

    Enfin, pour répondre a ta derniere question, c'est ce n'est pas que ton iteration soit "fausse" a proprement parler, mais elle n'est pas correcte d'un point de vue programmation : les proprietes "text" et "ItemIndex" sont a reserver exclusivement pour l'IHM, et non pour utiliser les données internes, d'ou la très bonne reponse de Gilles Louïse.
    - yotasse -

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

Discussions similaires

  1. condition avec une boucle qui marche pas
    Par lumycaan dans le forum Langage
    Réponses: 5
    Dernier message: 23/10/2009, 20h02
  2. Iterator d'une liste - get qui marche pas
    Par docky dans le forum C++
    Réponses: 4
    Dernier message: 25/05/2008, 17h04
  3. Une touche du clavier qui marche pas.
    Par Ubiquité dans le forum Linux
    Réponses: 2
    Dernier message: 25/12/2007, 11h24
  4. [Surnaturel] Une fonction qui marche en débug, pas en release
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 6
    Dernier message: 04/07/2006, 14h22
  5. Pb sur une fct qui marche sous mozilla mais pas ie
    Par chpog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/09/2005, 11h26

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