Delphi 11 FMX中TList<>.Sort()方法无法正常使用求助
Delphi 11 FMX 泛型列表排序编译错误解决
错误原因
你在调用Sort方法时错误地给变量aSpcList添加了<TSpecies>类型参数——aSpcList本身已经是TList<TSpecies>类型的实例,不需要额外指定类型。编译器会把<>解析为比较运算符,导致语法错误。
修正方案
方案1:修正函数指针调用方式
直接调用Sort方法并传入比较函数的地址即可,不需要额外的类型参数:
procedure GenReorderSpeciesList(var aSpcList : TList<TSpecies>); begin aSpcList.Sort(@CompareMyObjects); end;
同时可以优化比较函数,用AnsiCompareText返回值取反实现降序,代码更简洁:
function CompareMyObjects(Item1, Item2: TSpecies): Integer; begin // 按SPGroup升序(不区分大小写) Result := AnsiCompareText(Item1.SPGroup, Item2.SPGroup); if Result <> 0 then Exit; // SPGroup相同则按Family升序(不区分大小写) Result := AnsiCompareText(Item1.Family, Item2.Family); if Result <> 0 then Exit; // 前两个字段相同则按Subfamily降序(不区分大小写) Result := -AnsiCompareText(Item1.Subfamily, Item2.Subfamily); end;
方案2:使用匿名函数(更现代的写法)
无需单独定义比较函数,直接在Sort方法中传入匿名委托,代码更紧凑:
procedure GenReorderSpeciesList(var aSpcList : TList<TSpecies>); begin aSpcList.Sort( function(Item1, Item2: TSpecies): Integer begin Result := AnsiCompareText(Item1.SPGroup, Item2.SPGroup); if Result <> 0 then Exit; Result := AnsiCompareText(Item1.Family, Item2.Family); if Result <> 0 then Exit; Result := -AnsiCompareText(Item1.Subfamily, Item2.Subfamily); end ); end;
验证说明
两种方案都能解决编译错误,且实现你需要的排序逻辑:
- 优先按
SPGroup不区分大小写升序 - 再按
Family不区分大小写升序 - 最后按
Subfamily不区分大小写降序
内容的提问来源于stack exchange,提问作者Bennie Coetzer
相关产品推荐
相关产品推荐

