是否可以使用名称/值对中的名称在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);
有没有办法修改它,以便根据名称值对的名称进行排序?
或者,还有另一种方式吗?
答案 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;