c++ - 如何自定义排序 VCL TListBox?

标签 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;
}

键值是字符串。目前它们可以是“-”、"is"、“否”和“通过”。

调用它的代码是这样的:

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

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

结果列表以“-”项开头,所有"is"项都是连续的。然后打乱“No”和“Pass”和“-”项目。

有什么线索吗?

最佳答案

您的排序函数应返回一个值为 < 0 的值, 0 , 或 > 0 ,取决于两个输入参数的所需顺序。但是你没有正确地做到这一点。您正在返回 01 , 但从来没有 < 0 ,因为您要返回 bool 表达式的(隐式转换的)结果,它只能是 falsetrue .

你需要改变这一行:

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() CompareStr() 代替函数:

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

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

关于c++ - 如何自定义排序 VCL TListBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50263365/

相关文章:

delphi - 如何排列 TPopupMenu 以使其准确地将自己定位在按钮上方?

c++ - Qt - invokeMethod 由于返回值而失败

c++ 取消引用迭代器时 x++ 和 x = x + 1 之间的区别

c++ - 使用 floorf() 函数时无法链接 Embarcadero XE4 项目

c++ - 在 C++Builder 中重载 MainForm 构造函数

delphi - 管理员权限请求

c++ - 在这种情况下 sizeof(int) 返回什么?

c - HDC 句柄对另一个进程有效吗?

delphi - Windows 7 上的 IHTMLDocument2 和 Internet Explorer 11 更改

delphi - GDI+ 在 TBitmap 上绘图