如何自定义VCL TListBox排序?

时间:2018-05-09 23:19:11

标签: c++ c++builder vcl

我试图找出如何为TListBox中的项目和字符串提供自己的自定义排序方法。

我的列表框在其Object属性中存储了一个自定义对象,我需要在自定义排序中使用它。

我基于以下代码(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;
}

键值是字符串。目前,他们可以是&#34; - &#34;,&#34;是&#34;,&#34;否&#34;和#34;通过&#34;。

调用它的代码是这样的:

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);
}

以上代码确实是&#34;某事&#34;到列表,但它没有排序。

结果列表以&#34; - &#34;开头。物品,以及所有&#34;是&#34;物品是连续的。 &#34;否&#34;和#34;通过&#34;和&#34; - &#34;然后对物品进行加扰。

任何线索?

1 个答案:

答案 0 :(得分:2)

您的sort函数应返回< 00> 0的值,具体取决于两个输入参数的所需顺序。但你没有正确地做到这一点。您将返回01,但永远不会返回< 0,因为您返回的布尔表达式(隐式转换)结果只能是false或{ {1}}。

您需要更改此行:

true

改为:

return k1->mValue < k2->mValue;

或者,请改用RTL的AnsiCompareStr()CompareStr()功能:

if (k1->mValue < k2->mValue) return -1;
else if (k1->mValue > k2->mValue) return 1;
else return 0;

return AnsiCompareStr(k1->mValue, k2->mValue);