数组 – 如何将数组转换为指针并返回到Delphi?
发布时间:2020-12-15 04:25:50 所属栏目:大数据 来源:网络整理
导读:我有一个所有者绘制的组合框,显示列中的字符串.如果我可以以某种方式将列规格传递给OnDrawItem事件,则可以在组合中共享绘图例程.一个自然的方式,可以将ComboBox.Tag属性中的列宽数组传递给数组. 当我将列数组定义为: const arrWidth :array[1..4] of intege
我有一个所有者绘制的组合框,显示列中的字符串.如果我可以以某种方式将列规格传递给OnDrawItem事件,则可以在组合中共享绘图例程.一个自然的方式,可以将ComboBox.Tag属性中的列宽数组传递给数组.
当我将列数组定义为: const arrWidth :array[1..4] of integer = (100,100,70); 并将Tag属性设置为: ComboBox.Tag := integer(@arrWidth); 然后在OnDrawItem事件中,将其转换回数组: Widths :array of integer; Widths := pointer(ComboBox.Tag); 我可以看到数组元素很好,但数组不知道它的长度.它看起来比各种随机值更长. 我已经尝试使用动态数组,但是我甚至没有得到正确的列值. 解决方法
铸造是危险的,因为你走出类型检查系统.这已经把你赶到了这里.问题是整数和整数数组的数组[1..4]不是相同的类型.
你需要将这个数组声明为一个独特的类型 TWidthArray = array [1..4] of Integer; PWidthArray = ^TWidthArray; 然后这样做你的常数: const arrWidth: TWidthArray = (100,70); 当您需要从组合框中提取数组时,可以这样做: Widths: TWidthArray; ... Widths := PWidthArray(ComboBox.Tag)^; 如果您需要支持使用动态数组长度,那么您需要更改常用类型以反映这一点.但是,请注意,转换为Integer以放入Tag将绕过动态数组的引用计数.所以你需要真正理解你在做什么,如果你走下去的路线. 最后一点.如果您希望编译64位代码,则会由于以下原因而失败: ComboBox.Tag := integer(@arrWidth); 因为整数是32位数据类型.相反,您应该使用NativeInt,它是一个与指针相同宽度的整数. ComboBox.Tag := NativeInt(@arrWidth); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |