在Win64上对旧的Contnrs.TObjectList进行排序

时间:2017-11-23 04:56:47

标签: delphi 64-bit

我们有一些使用Contnrs.TObjectList的旧类,在某些情况下,自定义比较函数用于对这些列表进行排序,使用如下内容:

procedure TMyClass.SortItems;

  function CompareFunction(Item1, Item2: Pointer): Integer;
  begin
    Result := TSomeItem(Item1).Value - TSomeItem(Item2).Value;
  end;

begin
  Sort(@CompareFunction);
end;

这个代码在为Win32编译时没有问题,但是当我们为Win64编译它时,我们发现排序不再有效。

我已经使用Generics.Collections.TObjectList<T>修改了一些,修改了CompareFunction以及如何调用它。所以我的猜测是它与调用CompareFunction的方式有关,方法是在它前面添加@运算符,据我所知,它指的是函数的地址。

为什么上面的代码不能在Win64上运行,以及解决它的正确方法是什么?

1 个答案:

答案 0 :(得分:7)

TObjectList.Sort()需要一个独立的回调功能。

内部函数共享其父函数的堆栈帧(因此它可以访问父项的局部变量和参数)。所以你不能使用内部函数作为回调。由于功能如何在32位工作,你在32位中侥幸成功。但这不再适用于64位。

您需要自行移动CompareFunction(),例如:

function CompareFunction(Item1, Item2: Pointer): Integer;
begin
  Result := TSomeItem(Item1).Value - TSomeItem(Item2).Value;
end; 

procedure TMyClass.SortItems;
begin
  Sort(@CompareFunction);
end;

这适用于32位和64位。