1

可以使用名称/值对中的名称在 TStringList 上使用 customSort

我目前正在使用 TStringList 对每个 pos 中的一个值进行排序。我现在需要使用此值添加其他数据,因此我现在使用 TStringList 作为名称/值

我目前的比较排序是:

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);

有没有办法修改它,以便它根据名称值对的名称进行排序?

或者,还有其他方法吗?

4

2 回答 2

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

但实际上,我认为你的也应该工作,因为字符串本身无论如何都以名称开头,所以按整个字符串排序隐含地按名称排序。

于 2013-03-19T17:08:52.373 回答
3

要解决此问题,您可以使用Names文档中描述的索引属性,如下所示:

指示作为名称-值对的字符串的名称部分。

当 TStrings 对象的字符串列表包含名称-值对的字符串时,请读取 Names 以访问字符串的名称部分。Names 是 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;
于 2013-03-19T17:08:24.173 回答