名称/值对上的TStringList CustomSort方法

时间:2013-03-19 17:06:17

标签: delphi delphi-2010

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

我当前正在使用TStringList对每个pos中的一个值进行排序。我现在需要使用此值添加其他数据,因此我现在使用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);

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

或者,还有另一种方式吗?

2 个答案:

答案 0 :(得分:7)

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

但实际上,我认为你的应该也可以工作,因为字符串本身始于名称,所以按整个字符串排序会隐式按名称排序。

答案 1 :(得分:3)

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

  

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

     

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

因此,您只需使用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;