Tri d'une listbox [Résolu]

Signaler
Messages postés
76
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
13 novembre 2008
-
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
Bonjour! C'est encore moi!

Je reviens sur une question que j'avais déjà posé.. j'ai été redirigé vers une source d'une autre personne mais bon.. ça ne m'as pas plus aidé

En fait, je suis entrain de faire un client IRC et je doit faire face à un problème que je ne sais résoudre:

Je dois trier la liste des "nicknames" dans un certain ordre, c'est-a-dire, les @ en premier, ensuite les + et pour finir les utilisateurs "réguliers" et ce, tout en étant en ordre alphabetique. Je sais qu'il y a la fonction CustomSort.. mais j'ai tout essayé mais je ne suis pas capable.

J'utilise une ListBox, je peux utiliser aussi une ListView mais pour la multiselection ce n'est pas le bon composant qu'il me faut.
La nicklist est celle qui est a droite de la capture d'écran: http://img80.imageshack.us/img80/1531/82297837mt1.png (Elle n'est pas du tout trié et dsl du gros screenshot)
Elle est supposé ressembler à celle-ci: http://img205.imageshack.us/img205/5708/86485637ji2.png

4 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
si tu as juste des prefixes (eventuels) de 1 caractere, tu peu faire comme ca

var
    slArobase, slPlus, ..., slRien: TStringList;
    s: string;
    i: integer;
begin
    slArobase := TStringList.Create;
    slPlus := TStringList.Create;
    ...
    slRien := TStringList.Create;

   
    //affectation des listes en fonction des prefixes
    for i := 0 to ListBox1.Items.Count-1 do
    begin
       s := ListBox1.Items[i];
       if s[0] = '@' then
          slArobase.add(rightStr(s, Length(s)-1)
       else if s[0] = '+' then
          slPlus.add(rightStr(s, Length(s)-1)
       ...
       else
          slRien.Add(s);
    end;

    //TRI
       slRien.Sort;
       ...
       slArobase.Sort;
       slPlus.Sort;

      
    //ajout du prefixe
    for i := 0 to slArbobase.Count-1 do
       slArobase[i] := '@' + slArobase[i];
    ...
   
    //ajout au resultat (dans l'ordre choisi)
    ListBox1.Items.AddStrings(slArobase);
    ListBox1.Items.AddStrings(slPlus);
    ...
    ListBox1.Items.AddStrings(slRien);

  
2eme solution, faire le traitement dans le custom sort



function MonTri(List: TStringList; i1, i2: integer): integer;
var
    s1, s2: string;
begin
    s1 := list[i1];
    s2 := list[i2];
    if s1[0] = '@' then
    begin
       if s2[0] = '@' then
          Result := CompareStr(s1, s2)
       else
          Result := GreaterThanValue;
    end
    else if s1[0] = '+' then

    begin

       if s2[0] = '@' then
          Result := LessThanValue
       else if s2[0] = '+' then
          Result := CompareStr(s1, s2)

       else

          Result := GreaterThanValue;

    end
    else

    begin

       if (s2[0] = '@') or (s2[0] = '+') then

          Result := LessThanValue

       else

          Result := CompareStr(s1, s2);

    end;
end;
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
function MonTri(List: TStringList; i1, i2: integer): integer;
begin
  Result := CompareStr(list[i1], list[i2]); //remplace ca par ta comparaison si necessaire
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Assign(ListBox1.Items);
  sl.CustomSort(MonTri);
  ListBox1.Items.Assign(sl);
  sl.free;
end;
Messages postés
76
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
13 novembre 2008
1
Oui ça je le sais, mais c'est la comparaison que je ne suis pas capable
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Salut,

Si j'ai bien compris, il n'y a que le '+' qui te pose problème...

Dans ce cas, tu peux aussi faire:

procedure Trier;
var i, N : Integer;
  begin
  Form1.ListBox1.Sorted := true;
  N := -1;
  for i := 0 to Form1.ListBox1.Count-1 do begin
   if Form1.ListBox1.Items.Strings[i][1] =
[mailto:'@'
'@'
]
then N := i;
   if Form1.ListBox1.Items.Strings[i][1] = '+' then begin
    Form1.ListBox1.Items.Insert (N+1,Form1.ListBox1.Items.Strings[i]);
    Form1.ListBox1.Items.Delete(i+1);
    Inc(N);
   end;
  end;
end;