2013-03-19 84 views
1

是的TStringList CustomSort方法是posssible使用的名称从名称/值对的名称/值对

目前我使用的是的TStringList排序在每个POS一个值来使用customSort在TStringList中。我现在需要用这个值添加额外的数据,并为此我现在使用的TStringList作为名称/值

我现在CompareSort是:

function StrCmpLogicalW(sz1, sz2: PWideChar): Integer; stdcall; 
    external 'shlwapi.dll' name 'StrCmpLogicalW'; 


function MyCompare(List: TStringList; Index1, Index2: Integer): Integer; 
begin 
    Result := StrCmpLogicalW(PWideChar(List[Index1]), PWideChar(List[Index2])); 
end; 
Usage: 
    StringList.CustomSort(MyCompare); 

有没有修改这个,以便它,并据此排序方式在名称值对的名称?

或者,有没有另一种方法?

回答

7
function MyCompare(List: TStringList; Index1, Index2: Integer): Integer; 
begin 
    Result := StrCmpLogicalW(PWideChar(List.Names[Index1]), PWideChar(List.Names[Index2])); 
end; 

但实际上,我认为你应该工作为好,因为字符串本身以名称无论如何,由整个字符串,因此排序按名称排序隐含它。

3

为了解决这个问题,你使用它的文件中是这样描述的Names索引属性:

表示是名称 - 值对字符串的名称部分。

当TStrings对象的字符串列表包含 是名称 - 值对的字符串时,请读取名称以访问字符串的名称部分。 名称是Index中字符串的名称部分,其中0是第一个 字符串,1是第二个字符串,依此类推。如果该字符串不是 名称 - 值对,则Names包含一个空字符串。

因此,而不是List[Index1]你只需要使用List.Names[Index1]。因此,你的比较函数变为:

function MyCompare(List: TStringList; Index1, Index2: Integer): Integer; 
begin 
    Result := StrCmpLogicalW(
    PChar(List.Names[Index1]), 
    PChar(List.Names[Index2]) 
); 
end;