De l'aide sur le type de fonction TStringListSortCompare
:
Index1 et Index2 sont des indices des éléments dans la liste à comparer. Les retours de rappel:
- une valeur inférieure à 0 si la chaîne identifiée par Index1 vient avant la chaîne identifiée par Index2
- 0 si les deux chaînes sont équivalentes
- une valeur supérieure à 0 si la chaîne avec Index1 vient après la chaîne identifiée par Index2.
Donc, si vous soustrayez votre commande personnalisée du deuxième élément de l'ordre personnalisé du premier, puis les articles seront classés comme vous voulez.
const
Order: array[0..6] of String = ('B', 'C', 'A', 'D', 'G', 'F', 'E');
function GetStringOrder(const S: String; CaseSensitive: Boolean): Integer;
begin
for Result := 0 to Length(Order) - 1 do
if (CaseSensitive and (CompareStr(Order[Result], S) = 0)) or
(not CaseSensitive and (CompareText(Order[Result], S) = 0)) then
Exit;
Result := Length(Order);
end;
function MyCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := GetStringOrder(List[Index1], List.CaseSensitive) -
GetStringOrder(List[Index2], List.CaseSensitive);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
List: TStringList;
begin
List := TStringList.Create;
try
List.CommaText := 'A,G,a,C,B,b,F,a,B,C,c,D,d,E,D,F,G,C,A,G,d,e,f,g';
List.CaseSensitive := True;
List.CustomSort(MyCompareStrings);
ListBox1.Items.Assign(List);
finally
List.Free;
end;
end;
Thak vous! Tu me donnes la lumière dont j'ai besoin! – Dirtycoder