【发布时间】: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<T>可能更合适。 -
在这种情况下,在列表的整个生命周期中只有一种排序,但了解这一点很有帮助。
-
没错。由于只有一种排序顺序,因此可以在构造函数中应用。
-
保持原样有一个好处:如果在排序点指定函数,任何维护程序员都可以更快地完成排序。如果从多个地方调用相同的排序,我肯定会将函数传递给构造函数,因为我讨厌重复代码。