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

Composants FMX Delphi Discussion :

Tri dans un TListBox


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut Tri dans un TListBox
    Bonjour,

    j'ai dans un TListBox une combinaison de chiffres de 1-90 tirés au hazard.
    J'aimerais la trier, bien sûr,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TMainUnit.btnSortClick(Sender: TObject);
    begin
     ListeduTirage.Sorted:=False;
     ListeduTirage.Sorted:=True;
    end;
    fonctionne, sauf qu'il s'agit du tri "caractère" donc 1,11,15,2,23,4,40 ...
    Alors que je veux bien l'ordre numérique 1,2,4,11,15,23,40

    j'ai donc tenté ceci mais sans succès (sinon je n'aurai pas ouvert la discussion )
    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
     
    procedure TMainUnit.btnSortClick(Sender: TObject);
    var Compare: TFMXObjectSortCompare;
    begin
    Compare:=function(item1, item2: TFmxObject): Integer
      var n1,n2 : integer;
      begin
        n1:=StrToint(TListBoxItem(item1).ItemData.Text);
        n2:=StrToint(TListBoxItem(item2).ItemData.Text);
        if n2=n1 then result:=0
        else begin
          if n2>n1 then Result := 1
                   else Result := -1;
        end;
      end;
      ListeDuTirage.Sort(Compare);
    end;
    Je suis sûr que c'est un truc tout bête mais il faut que je me mette au travail. Je laisse reposer ça en attendant mes pauses.

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Je pense qu'il y a confusion entre TList et TListBox
    Items dans TListBox est un TSringLIst et le classement est alphabétique
    Donc remplace 1 par 01, 2 par 02 et ainsi de suite.
    Normalement la fonction btnSortClick ne sert à rien
    01,02,04,11,15,23,40

  3. #3
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut
    Salut Sergio,

    Effectivement en passant par un TStringlist comme ceci:

    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
     
    function compare(List: TStringList; Index1, Index2: Integer): Integer;
    var
      n1, n2: integer;
    begin
      n1 := StrToInt(List[Index1]);
      n2 := StrToInt(List[Index2]);
      result := n1 - n2;
    end;
    //----------------------------------------------------------------------------------
    procedure TForm1.BtnChangeCellClick(Sender: TObject);
    Var
     SL:TStringList;
    begin
      SL := TStringList.create;
      SL.Assign(Listbox1.Items);
      SL.CustomSort(Compare);
      ListBox1.items.Assign(SL);
      SL.Free;
    end;

  4. #4
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 513
    Par défaut
    Bonjour,

    sinon en passant par un tableau ?
    comme ceci

    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
    Procedure TriABulles(Var Tab:Array Of Integer);
    Var i,j,t:Integer;
    Begin
      For i:=Low(Tab) To High(Tab)-1 Do For j:=i+1 To High(Tab) Do If Tab[i]>Tab[j] Then
      Begin
        t:=Tab[i];
        Tab[i]:=Tab[j];
        Tab[j]:=t;
      End;
    End;
     
    // Ou
     
    Procedure QuickSort(Var Tab:Array Of Integer);
    Var i,j,t:Integer;
      Function Partition(m,n:Integer):Integer;
      Var i,j,v:Integer;
      Begin
        v:=Tab[m];
        i:=m-1;
        j:=n+1;
        While True Do
        Begin
          Repeat Dec(j) Until Tab[j]<=v;
          Repeat Inc(i) Until Tab[i]>=v;
          If (i<j)
          Then Begin
            t:=Tab[i];
            Tab[i]:=Tab[j];
            Tab[j]:=t;
          End
          Else Begin
            Result:=j;
            Exit;
          End;
        End;
      End;
    Mais tu y as surement déjà pensé !!

    @+
    Charly

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Merci de vos réponses mais

    @ALWEBER
    non, il n'y a pas confusion, c'est normalement une des possibilités d'un FMX.TListBox

    oui, bien sûr je pourrais faire un formatage pour obtenir 01..09 (en ce cas j'aurais juste à mettre la propriété Sorted de la TListBox à true) mais je voudrai éviter d'en passer par là.

    @FranckL
    un peu idem que pour Alweber, il s'agit d'un TListBox et non d'une TStringList

    @Charly
    Ce n'est pas tant la méthode de tri qui m'intéresse que la technique permettant de ne pas utiliser le tri par défaut dans un FMX.TListBox (j'insiste)

    @tous
    J'ai vu des cas où l'on pouvait ainsi trier non pas sur le texte mais sur le détail d'un TListBox ou d'un TListView "simple" (cad juste texte et détail avant de me pencher sur des tris sur des listview dynamiques)

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Du moins en partie.

    Je vais continuer à regarder du côté TListbox.Sort(Compare) mais l'autre moyen qui résout mon problème est de procéder en surchargeant le tri par l'évènement OnCompare

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TMainUnit.ListeduTirageCompare(Item1, Item2: TListBoxItem;
      var Result: Integer);
    var n1,n2 : integer;
    begin
     n1:=StrToIntDef(Item1.ItemData.Text,0);
     n2:=StrToIntDef(Item2.ItemData.Text,0);
     if n1=n2 then result:=0  // en principe n'y passe pas
     else begin
       if n1<n2 then result:=-1
                else result:=1;
     end;
     if btnSort.RotationAngle=180 then result:=-1*result; // tri descendant
    end;
    Il suffit ensuite de l'utiliser ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMainUnit.btnSortClick(Sender: TObject);
    var Compare: TFMXObjectSortCompare;
        SL : TStringList;
    begin
    ListeduTirage.Sorted:=False;
    ListeduTirage.Sorted:=True;
    btnSort.RotationAngle:=btnSort.RotationAngle+180;  // pour le fun tri ascendant/descendant
    end;
    pour information en pj, un tri sur une liste de type listboxitemrightdetail donc sur les données text (string) et detail (numérique) avec ordre ascendat descendant pour faire bonne mesure
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Tri dans une DBGrid sur un champ date au format jj/mm
    Par Jeankiki dans le forum Bases de données
    Réponses: 10
    Dernier message: 31/10/2004, 12h32
  2. Ouvrir un fichier sur un double-clic dans une TListBox
    Par SegmentationFault dans le forum Composants VCL
    Réponses: 4
    Dernier message: 09/08/2004, 17h22
  3. Comment griser une ligne dans une TListBox ?
    Par SegmentationFault dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/06/2004, 09h15
  4. [langage] tri dans tableau de hachage
    Par mimilou dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2004, 16h10
  5. Alignement dans un TListBox
    Par Griswold dans le forum Composants VCL
    Réponses: 6
    Dernier message: 05/12/2003, 21h57

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