Tri d'une listbox

Résolu
l0sth34d2 Messages postés 76 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 13 novembre 2008 - 31 oct. 2007 à 01:51
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 31 oct. 2007 à 23:38
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

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
31 oct. 2007 à 22:18
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;
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
31 oct. 2007 à 13:42
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;
0
l0sth34d2 Messages postés 76 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 13 novembre 2008 1
31 oct. 2007 à 15:53
Oui ça je le sais, mais c'est la comparaison que je ne suis pas capable
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
31 oct. 2007 à 23:38
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;
0
Rejoignez-nous