首页 > 解决方案 > 如何自定义排序 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);
}

上面的代码对列表做了“一些事情”,但它没有排序。

结果列表以“-”项开头,所有“是”项都是连续的。然后将“否”和“通过”和“-”项目打乱。

有什么线索吗?

标签: c++c++buildervcl

解决方案


您的排序函数应返回一个值,即< 00> 0,具体取决于两个输入参数的所需顺序。但是你没有正确地做到这一点。您正在返回0or 1,但从不< 0返回 ,因为您正在返回布尔表达式的(隐式转换)结果,该结果只能是falseor 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);

推荐阅读