gpt4 book ai didi

arrays - 如何在 Delphi 中将数组转换为指针并返回?

转载 作者:行者123 更新时间:2023-12-03 14:41:04 24 4
gpt4 key购买 nike

我有一个所有者绘制的组合框,它在列中显示字符串。如果我能以某种方式将列规范传递给 OnDrawItem 事件,则可以在组合之间共享绘图例程。一种自然的方法是在 ComboBox.Tag 属性中传递列宽数组,然后将其转换回数组。

当我将列数组定义为:

const arrWidth :array[1..4] of integer = (100,100,100,70);

并将 Tag 属性设置为:

ComboBox.Tag := integer(@arrWidth);

然后在 OnDrawItem 事件中,将其转换回数组:

Widths :array of integer;
Widths := pointer(ComboBox.Tag);

我可以很好地看到数组元素,但数组不知道它的长度。对于各种随机值来说,它似乎要长得多。

我尝试过使用动态数组,但后来我什至没有获得正确的列值。

最佳答案

强制转换是危险的,因为你超出了类型检查系统的范围。这让你被困在这里。问题是 array[1..4] of integerarray of integer 不是同一类型。

您需要将数组声明为这样的不同类型

TWidthArray = array [1..4] of Integer;
PWidthArray = ^TWidthArray;

然后像这样做你的常量:

const 
arrWidth: TWidthArray = (100,100,100,70);

当您需要从组合框中提取数组时,请执行以下操作:

Widths: TWidthArray;
...
Widths := PWidthArray(ComboBox.Tag)^;

如果您需要支持使用动态数组长度,那么您需要更改通用类型以反射(reflect)这一点。但是,请注意,转换为 Integer 并放入 Tag 将绕过动态数组的引用计数。因此,如果您走这条路,您需要真正了解自己在做什么。

最后一点。如果您希望将此代码编译为 64 位,它将因以下行而失败:

ComboBox.Tag := integer(@arrWidth);

因为integer是32位数据类型。相反,您应该使用 NativeInt,它是一个与指针宽度相同的整数。

ComboBox.Tag := NativeInt(@arrWidth);

关于arrays - 如何在 Delphi 中将数组转换为指针并返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8508783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com