如何自定义排序 VCL TListBox?
How to custom sort a VCL TListBox?
我正在尝试弄清楚如何为 TListBox
中的项目和字符串提供我自己的自定义排序方法。
我的列表框在其 Object
属性 中存储了一个自定义对象,我需要在自定义排序中使用它。
我将下面的代码基于 post (Delphi): Is it possible to sort a TListBox using a custom sort comparator?
我的自定义排序函数如下所示
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;
}
键值为字符串。目前它们可以是“-”、"Yes"、"No" 和 "Pass".
而调用的代码是这样的:
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);
}
以上代码对列表进行了 "something",但未排序。
结果列表以“-”项开头,所有"Yes"项都是连续的。 "No" 和 "Pass" 以及“-”项然后被打乱。
有什么线索吗?
您的排序函数应 return 一个值为 < 0
、0
或 > 0
的值,具体取决于两个输入参数的所需顺序。但是你没有正确地做到这一点。您正在 returning 0
或 1
,但永远不会 < 0
,因为您正在 returning 布尔表达式的(隐式转换的)结果,它只能是 false
或 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()
or CompareStr()
函数:
return AnsiCompareStr(k1->mValue, k2->mValue);
return CompareStr(k1->mValue, k2->mValue);
我正在尝试弄清楚如何为 TListBox
中的项目和字符串提供我自己的自定义排序方法。
我的列表框在其 Object
属性 中存储了一个自定义对象,我需要在自定义排序中使用它。
我将下面的代码基于 post (Delphi): Is it possible to sort a TListBox using a custom sort comparator?
我的自定义排序函数如下所示
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;
}
键值为字符串。目前它们可以是“-”、"Yes"、"No" 和 "Pass".
而调用的代码是这样的:
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);
}
以上代码对列表进行了 "something",但未排序。
结果列表以“-”项开头,所有"Yes"项都是连续的。 "No" 和 "Pass" 以及“-”项然后被打乱。
有什么线索吗?
您的排序函数应 return 一个值为 < 0
、0
或 > 0
的值,具体取决于两个输入参数的所需顺序。但是你没有正确地做到这一点。您正在 returning 0
或 1
,但永远不会 < 0
,因为您正在 returning 布尔表达式的(隐式转换的)结果,它只能是 false
或 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()
or CompareStr()
函数:
return AnsiCompareStr(k1->mValue, k2->mValue);
return CompareStr(k1->mValue, k2->mValue);