我有一个所有者绘制的组合框,显示列中的字符串.如果我可以以某种方式将列规格传递给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);