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 :

Trier une TListview


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut Trier une TListview
    Bonjour à tous,

    J'aimerai pouvoir filtrer une TlistView composée de 4 colonnes. Mais je ne comprends pas comment marche l'événement OnCompare même après avoir lu certains topics appropriés et l'aide de BCB. Si quelqu'un pouvait m'expliquer le fonctionnement je lui serait très reconnaissant.

    PS : le filtre se fait à partir de ma colonne 3.

  2. #2
    Membre éclairé Avatar de getz85
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 423
    Par défaut
    Bonjour,

    C'est vrai que l'évènement OnCompare est un peu "spécial" à utiliser.
    L'aide de C++ builder aurait pu t'aider cependant, surtout ceci :

    Le gestionnaire d'événement OnCompare compare les éléments de la liste transmis dans les paramètres Item1 et Item2. Si Item1 est identique à Item2 dans l'ordre de tri, affectez la valeur 0 au paramètre Compare. Si Item1 est inférieur à Item2, affectez une valeur négative au paramètre Compare. Si Item1 est supérieur à Item2, affectez une valeur supérieure à zéro au paramètre Compare.
    Les Item1 et Item2 contiennent deux lignes de ton listView. Il faut comparer ceux-ci selon leur type de données, et affecter la valeur de Compare par un entier selon celui qui est supérieur à l'autre.

    Un exemple de comparaison en utilisant la fonction CompareText de SysUtils :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void __fastcall TForm1::LVCompare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare)
    {
    //Si la colonne n'a pas été cliqué, tri descendant, sinon tri ascendant
           if (tri)
           {
                Compare = CompareText(Item1->Caption, Item2->Caption);
           }
           else
           {
                Compare = CompareText(Item2->Caption, Item1->Caption);
           }
     
    }
    Dans cet exemple, on trie de façon alphanumériques ces données (sous forme de UnicodeString) selon le tri choisi (le booléen tri est modifié lors du clic sur l'entête de colonne, pour avoir le tri dans les deux sens).

    Indiquer au ListView comment comparer deux items de la liste va lui permettre de trier tout la liste.

    J'espère t'avoir un peu éclairé...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    D'accord je voie un peut le concept cependant si je veut pouvoir filtrer des doublons je doit donc Indiquer au ListView comment faire afin de trier la liste ?

    Ou existe t-il une fonction ou un événement pour générer cela ?

    Merci.

  4. #4
    Membre éclairé Avatar de getz85
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2008
    Messages : 423
    Par défaut
    Je n'ai jamais fait de détection de doublons dans une listView, mais je pense que tu peux gérer ça dans le OnCompare en testant la valeur Compare une fois celle-ci attribuée.

    Si elle est égale à 0, je pense que tu peux supprimer l'un des items de la liste.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    Actuellement je procède de cette façon mais le résultat n'y es pas.
    j'ai un problème avec mon adresse mac qui ne prends pas une valeur correcte ( manque un caractère => 18:A9:05:B2:C6 au lieu de 18:A9:05:B2:C6:4D).

    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
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    test->Clear();
    TListItem *item;
    TStringList *sl = new TStringList();
    sl->LoadFromFile( "test.txt" );
    char *date;
    char *ip;
    char *mac;
    int nb = test->Items->Count;
    int nbdoublons = 0;
    
    
    for( int i=0; i < sl->Count; i++ )   
    {
    	if (test->Items->Count ==0) {   
    		item = test->Items->Add();
    		AnsiString l= sl->Strings[i];
    		date = strtok(l.c_str(), ";");
    		item->Caption = date;
    		ip = strtok(NULL, ";");
    		item->SubItems->Add(ip);
    		mac = strtok(NULL, ";");
    		item->SubItems->Add(mac);
    		nb++;
    
    	}
    	else 
    	{
    		for(int k=0; k < nb ; k++)
    		{
    			TListItem *Item = test->Items->Item[k] ;
    			ShowMessage(mac); // => 18:A9:05:B2:C6:D au lieu de 18:A9:05:B2:C6:4D
    			AnsiString  NumListe =Item->SubItems->Strings[1];  // adresse mac : 18:A9:05:B2:C6:4D
    			if (mac == NumListe)
    			{
    				int nbdoublons = nbdoublons++;
    			}
    			else
    			{
    				item = test->Items->Add();
    				AnsiString l= sl->Strings[i];
    				date = strtok(l.c_str(), ";");
    				item->Caption = date;
    				ip = strtok(NULL, ";");
    				item->SubItems->Add(ip);
    				mac = strtok(NULL, ";");
    				item->SubItems->Add(mac);
    			}
    		}
    	}
    }
    delete sl ;
    }
    Alors soit j'essaie de perfectionner mon code soit j'essaye de me pencher sur le OnCompare.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    Je pense avoir trouvé une solution. Je test.

Discussions similaires

  1. [VB.NET] Trier une table de mon DataSet
    Par San Soussy dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/03/2005, 17h30
  2. Comment trier une DBGRID en cliquant sur une colonne
    Par sessime dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/10/2004, 16h18
  3. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44
  4. [langage] Trier une hastable
    Par Gogoye dans le forum Langage
    Réponses: 11
    Dernier message: 03/08/2004, 16h43
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

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