数组 – 如何将数组转换为指针并返回到Delphi?

前端之家收集整理的这篇文章主要介绍了数组 – 如何将数组转换为指针并返回到Delphi?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个所有者绘制的组合框,显示列中的字符串.如果我可以以某种方式将列规格传递给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);
原文链接:https://www.f2er.com/delphi/101517.html

猜你在找的Delphi相关文章