加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数组 – 如何将数组转换为指针并返回到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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读