2011-08-19 30 views
5

我想按特定的順序對TStringList進行排序。Delphi中的非字母排序

而不是A,B,C ..我試圖命令它在B,C,A。

我已經用我需要的順序聲明瞭一個const數組。

我試過用CustomSorte,但我不明白如何編寫函數。

我正在嘗試for循環現在,但它會變得非常困難和混亂!

我不是德爾菲專家...

謝謝你們提前!

回答

11

大約從TStringListSortCompare函數類型的幫助:

指數1和索引2在列表中的項目進行比較的指標。 回調回報:

  • 的值小於0,如果通過索引1標識字符串來通過索引2
  • 標識爲0如果兩個字符串是相等
  • 值大於0,如果該字符串的字符串之前Index1跟在由Index2標識的字符串後面。

所以,如果你減去從第一個自定義的順序中的第二項的自定義命令,那麼項目就會像你想要的排序。

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 you!你給我光線,我需要! – Dirtycoder