0

我正在编写我的自定义可视化组件,发现将它的一些属性发布为数组很方便:

class PACKAGE TVctDiag2 : public TCustomControl
{
__published:
    __property int ArrowStyle[int index] = {read=GetArrowStyle,write=SetArrowStyle};
protected:
    void __fastcall SetArrowStyle(int index, int value);
    int __fastcall GetArrowStyle(int index);
...
};

组件的构建和安装没有问题。但是在我尝试在表单上插入组件后,会显示访问冲突消息框。在调试我发现的错误源时,该方法GetArrowStyle被调用,索引值为 -1,这会导致读取数组边界。我知道TVctDiag2类(=集成开发环境)的用户不知道数组大小是多少。数组的大小是恒定的,并且是一个很小的数字(6),因此替代解决方案是:

class PACKAGE TVctDiag2 : public TCustomControl
{
__published:
    __property int ArrowStyle1 = {read=GetArrowStyle1,write=SetArrowStyle1};
    __property int ArrowStyle2 = {read=GetArrowStyle2,write=SetArrowStyle2};
    __property int ArrowStyle3 = {read=GetArrowStyle3,write=SetArrowStyle3};
    __property int ArrowStyle4 = {read=GetArrowStyle4,write=SetArrowStyle4};
    __property int ArrowStyle5 = {read=GetArrowStyle5,write=SetArrowStyle5};
    __property int ArrowStyle6 = {read=GetArrowStyle6,write=SetArrowStyle6};
protected:
    void __fastcall SetArrowStyle1(int index, int value);
    int __fastcall GetArrowStyle1(int index);
    void __fastcall SetArrowStyle2(int index, int value);
    int __fastcall GetArrowStyle2(int index);
    void __fastcall SetArrowStyle3(int index, int value);
    int __fastcall GetArrowStyle3(int index);
    void __fastcall SetArrowStyle4(int index, int value);
    int __fastcall GetArrowStyle4(int index);
    void __fastcall SetArrowStyle5(int index, int value);
    int __fastcall GetArrowStyle5(int index);
    void __fastcall SetArrowStyle6(int index, int value);
    int __fastcall GetArrowStyle6(int index);
...
};

但我更喜欢更通用的解决方案。如果可能的话,如何通过对象检查器更改属性值来实现这一点。

4

1 回答 1

2

将数组属性声明为public__published用于设计时编辑和 RTTI 生成,不支持数组属性:

class PACKAGE TVctDiag2 : public TCustomControl
{
public:
    __property int ArrowStyle[int index] = {read=GetArrowStyle,write=SetArrowStyle};
protected:
    void __fastcall SetArrowStyle(int index, int value);
    int __fastcall GetArrowStyle(int index);
...
};

你的第二个例子是错误的。您需要index从 getter/setter 方法中删除参数,因为属性不使用索引(通过使用非数组属性,您可以将它们声明为__published):

class PACKAGE TVctDiag2 : public TCustomControl
{
__published:
    __property int ArrowStyle1 = {read=GetArrowStyle1,write=SetArrowStyle1};
    __property int ArrowStyle2 = {read=GetArrowStyle2,write=SetArrowStyle2};
    __property int ArrowStyle3 = {read=GetArrowStyle3,write=SetArrowStyle3};
    __property int ArrowStyle4 = {read=GetArrowStyle4,write=SetArrowStyle4};
    __property int ArrowStyle5 = {read=GetArrowStyle5,write=SetArrowStyle5};
    __property int ArrowStyle6 = {read=GetArrowStyle6,write=SetArrowStyle6};
protected:
    void __fastcall SetArrowStyle1(int value);
    int __fastcall GetArrowStyle1();
    void __fastcall SetArrowStyle2(int value);
    int __fastcall GetArrowStyle2();
    void __fastcall SetArrowStyle3(int value);
    int __fastcall GetArrowStyle3();
    void __fastcall SetArrowStyle4(int value);
    int __fastcall GetArrowStyle4();
    void __fastcall SetArrowStyle5(int value);
    int __fastcall GetArrowStyle5();
    void __fastcall SetArrowStyle6(int value);
    int __fastcall GetArrowStyle6();
...
};

如果您想为单个数组值使用单独的属性,我建议通过index在属性声明上使用说明符,回到使用带有一组 getter/setter 方法的索引(我什至会声明一个public数组属性再次为好的衡量标准,以防您需要遍历代码中的值):

class PACKAGE TVctDiag2 : public TCustomControl
{
__published:
    __property int ArrowStyle1 = {read=GetArrowStyle,write=SetArrowStyle,index=0};
    __property int ArrowStyle2 = {read=GetArrowStyle,write=SetArrowStyle,index=1};
    __property int ArrowStyle3 = {read=GetArrowStyle,write=SetArrowStyle,index=2};
    __property int ArrowStyle4 = {read=GetArrowStyle,write=SetArrowStyle,index=3};
    __property int ArrowStyle5 = {read=GetArrowStyle,write=SetArrowStyle,index=4};
    __property int ArrowStyle6 = {read=GetArrowStyle,write=SetArrowStyle,index=5};
public:
    __property int ArrowStyle[int index] = {read=GetArrowStyle,write=SetArrowStyle};
protected:
    void __fastcall SetArrowStyle(int index, int value);
    int __fastcall GetArrowStyle(int index);
...
};

如果要对数组进行设计时编辑,则需要编写自定义组件编辑器并将其注册到 IDE,或者将数组属性重新写入 a TCollection(RTTI 和设计时编辑完全支持此功能)。

于 2012-04-06T02:26:30.440 回答