Từ sự giúp đỡ về loại TStringListSortCompare
chức năng:
index1 và Index2 là chỉ số các mục trong Danh sách để so sánh. Lợi nhuận callback:
- một giá trị nhỏ hơn 0 nếu chuỗi xác định bởi index1 đứng trước chuỗi xác định bởi Index2
- 0 nếu hai chuỗi là tương đương
- một giá trị lớn hơn 0 nếu chuỗi với Index1 xuất hiện sau chuỗi được xác định bởi Index2.
Vì vậy, nếu bạn trừ thứ tự tùy chỉnh của mục thứ hai theo thứ tự tùy chỉnh đầu tiên, thì các mục sẽ được sắp xếp như bạn muốn.
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 bạn! Bạn cho tôi ánh sáng mà tôi cần! – Dirtycoder