【问题标题】:Getting error with generic sort in Delphi Xe2Delphi Xe2 中的泛型排序出错
【发布时间】:2014-03-25 00:50:58
【问题描述】:

我希望有人能看到这里可能出了什么问题。在 Xe2 中,我有一个要排序的通用 TObjectList。我有一个在不同位置排序的 TObjectList,所以我在旧代码上建模了新代码。一切看起来都是正确的:ComparePosControl 是一个非 OOPS 函数; Rpt 是表单的嵌套方法,TPosCtrl 是一个简单的类。

function ComparePosControl(L, R: TPosCtrl): integer;
begin
  result := L.SortNum - R.SortNum;
end;


procedure Rpt(RParent: TWinControl);
begin
  PosCtrls := TObjectList<TPosCtrl>.Create;
  try
    AddPosCtrls(RParent);
    PosCtrls.Sort(TComparer<TPosCtrl>.Construct(ComparePosControl));

但我不断收到此错误:

[DCC 错误] Rputils.pas(1552):E2010 不兼容类型:“System.Generics.Defaults.TComparison”和“Procedure”

有什么想法吗?

TIA

标记

【问题讨论】:

  • 如果您总是以相同的方式排序,那么将比较器传递给列表的构造函数可能会感觉更简洁。另外,您确定要让列表拥有并销毁其成员吗?鉴于它们是窗口控件,似乎不太可能。 TList&lt;T&gt; 可能更合适。
  • 在这种情况下,在列表的整个生命周期中只有一种排序,但了解这一点很有帮助。
  • 没错。由于只有一种排序顺序,因此可以在构造函数中应用。
  • 保持原样有一个好处:如果在排序点指定函数,任何维护程序员都可以更快地完成排序。如果从多个地方调用相同的排序,我肯定会将函数传递给构造函数,因为我讨厌重复代码。

标签: delphi sorting generics


【解决方案1】:

稍微改变函数以匹配原型(添加 const 修饰符):

function ComparePosControl(const L, R: TPosCtrl): integer;

你也可以使用匿名函数:

PosCtrls.Sort(TComparer<TPosCtrl>.Construct(
  function (const L, R: TPosCtrl): integer;
  begin
    result := L.SortNum - R.SortNum;
  end;
  ));

【讨论】:

  • 谢谢!国内失明再次袭来。一个无害的词,一切都很好。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 2012-07-12
  • 2016-12-15
  • 2011-11-20
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多