2011-08-19 47 views
5

Tôi đang cố sắp xếp một TStringList theo thứ tự đặc biệt.Không phân loại chữ cái trong Delphi

Thay vì A, B, C .. Tôi đang cố gắng đặt hàng trong B, C, A.

Tôi đã khai báo một mảng const với thứ tự mà tôi cần.

Tôi đã thử với CustomSorte, nhưng tôi không thể hiểu cách viết hàm.

Tôi đang thử với các vòng bây giờ, nhưng nó sẽ thực sự khó khăn và khó hiểu!

Tôi không phải là chuyên gia Delphi ...

Xin cảm ơn các bạn trước!

Trả lời

11

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; 
+0

Thak bạn! Bạn cho tôi ánh sáng mà tôi cần! – Dirtycoder

Các vấn đề liên quan