c++ - 如何自定义排序 VCL TListBox?
问题描述
我试图弄清楚如何为TListBox
.
我的列表框在其Object
属性中存储了一个自定义对象,我需要在自定义排序中使用它。
我将以下代码基于这篇文章(Delphi):是否可以使用自定义排序比较器对 TListBox 进行排序?
我的自定义排序功能如下所示
int __fastcall SortListByValue (TStringList* sl, int item1, int item2)
{
IniKey* k1 = (IniKey*) sl->Objects[item1];
IniKey* k2 = (IniKey*) sl->Objects[item2];
return k1->mValue < k2->mValue;
}
键值是字符串。目前它们可以是“-”、“是”、“否”和“通过”。
调用它的代码是这样的:
void __fastcall TMainForm::sortByValueAExecute(TObject *Sender)
{
Log(lInfo) << "Sorting list based on Values";
TStringList* sl = new TStringList();
sl->Assign(imagesLB->Items);
sl->CustomSort(SortListByValue);
imagesLB->Items->Assign(sl);
}
上面的代码对列表做了“一些事情”,但它没有排序。
结果列表以“-”项开头,所有“是”项都是连续的。然后将“否”和“通过”和“-”项目打乱。
有什么线索吗?
解决方案
您的排序函数应返回一个值,即< 0
、0
或> 0
,具体取决于两个输入参数的所需顺序。但是你没有正确地做到这一点。您正在返回0
or 1
,但从不< 0
返回 ,因为您正在返回布尔表达式的(隐式转换)结果,该结果只能是false
or true
。
您需要更改此行:
return k1->mValue < k2->mValue;
为此:
if (k1->mValue < k2->mValue) return -1;
else if (k1->mValue > k2->mValue) return 1;
else return 0;
或者,使用 RTL 的AnsiCompareStr()
orCompareStr()
函数代替:
return AnsiCompareStr(k1->mValue, k2->mValue);
return CompareStr(k1->mValue, k2->mValue);
推荐阅读
- javascript - 有没有办法在 JavaScript 中将 html div 推送到动态数组中?
- python - ValueError:未知激活函数:swish_activation
- powershell - 使用 Powershell 下载和保存文件时,有没有办法使用通配符?
- android - Android如何在隐藏后显示工具栏(通过在RecyclerView中向下滚动)
- postgresql - Google Cloud SQL:部分“连接”编辑实例(PostgreSQL)是否会导致数据库停机?
- hyperledger-fabric - 无法连接到 Postgres 数据库 Postgres 需要连接到特定数据库,尝试了以下数据库:
- python - Matplotlib - 如何使用文档找到特定需求?
- c++ - 使用 HLSL 进行帧旋转
- mysql - Mysql Foreach 从一个表到另一个表第 2 部分
- spring-boot - JPA 的 deleteAll 在表中留下一个条目。我怎样才能清楚地删除所有条目?