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

  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.

  7. #7
    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
    J'ai repris et modifier � ma sauce le code de Sunchaser sur ce lien afin de trier mes doublons : http://www.developpez.net/forums/d17...er-tlistitems/ cependant j'obtiens une ligne non d�sirable � la fin ( cf : image ). De plus lorsque le traitement devrait normalement �tre fini, certaines op�rations continuent � tourner provoquant des exceptions.

    [EDIT :] Pour faire plus simple comment comparer Item->SubItems->Strings[1] avec l'ensemble des �l�ments d'un tableau ?[/EDIT]


    Voici le code :

    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
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TListItem *item;
    TStringList *sl = new TStringList();
    sl->LoadFromFile( "text.txt" );
    char *date;
    char *ip;
    char *mac;
     
    for( int i=0; i < sl->Count; i++ )
    {
    	item = ListView1->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 ;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender, TListItem *Item,
    		  TCustomDrawState State, bool &DefaultDraw)
    {
    TListItem *item;
    ShowMessage(Item->SubItems->Strings[1]);
    if (Item->SubItems->Strings[1].operator ==("20:A9:05:B2:C6:5D") )
    {
    doublons = doublons++;
    ListView1->Items->Delete(Item->Index);
    }
    }
    Le contenu de mon fichier text.txt :

    05/11/2010 11:50:28;192.168.2.10;20:A9:05:B2:C6:4D
    05/11/2010 11:50:28;192.168.2.10;20:A9:05:B2:C6:5D
    05/11/2010 11:50:28;192.168.2.10;20:A9:05:B2:C6:6D
    05/11/2010 11:50:28;192.168.2.10;20:A9:05:B2:C6:7D
    05/11/2010 11:50:28;192.168.2.10;20:A9:05:B2:C6:5D
    Le r�sultat :


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