l0sth34d2
Messages postés76Date d'inscriptionmercredi 21 mars 2007StatutMembreDernière intervention13 novembre 2008
-
31 oct. 2007 à 01:51
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 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.
//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;
//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)
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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;
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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;