我们有一些旧类使用Contnrs.TObjectList
,在某些情况下,自定义比较函数用于对这些列表进行排序,使用如下所示:
procedure TMyClass.SortItems;
function CompareFunction(Item1, Item2: Pointer): Integer;
begin
Result := TSomeItem(Item1).Value - TSomeItem(Item2).Value;
end;
begin
Sort(@CompareFunction);
end;
Run Code Online (Sandbox Code Playgroud)
在为Win32编译时,此代码没有问题,但是当我们为Win64编译它时,我们发现排序不再起作用.
我已经修改了一些,Generics.Collections.TObjectList<T>
而是修改了CompareFunction
它以及如何调用它.所以我的猜测是它与CompareFunction
被调用的方式有关,方法是在@
运算符前加上运算符,据我所知,它指的是函数的地址.
为什么上面的代码不适用于Win64,以及解决它的正确方法是什么?
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;
Run Code Online (Sandbox Code Playgroud)
这将适用于32位和64位.
归档时间: |
|
查看次数: |
113 次 |
最近记录: |