delphi – 在Win64上对旧的Contnrs.TObjectList进行排序[复制]
发布时间:2020-12-15 09:32:56 所属栏目:大数据 来源:网络整理
导读:参见英文答案 Why cannot take address to a nested local function in 64 bit Delphi?????????????????????????????????????1个 我们有一些使用Contnrs.TObjectList的旧类,在某些情况下,自定义比较函数用于对这些列表进行排序,使用如下所示: procedure TMy
参见英文答案 >
Why cannot take address to a nested local function in 64 bit Delphi?????????????????????????????????????1个
我们有一些使用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,以及解决它的正确方法是什么? 解决方法
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位. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |