2011-08-19 36 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