2012-04-05 2 views
0

ich meine benutzerdefinierte visuelle Komponente schreibe und finden es praktisch, einige seiner Eigenschaften als Array zu veröffentlichen:C++ Builder XE - publishing Array-Eigenschaft

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); 
... 
}; 

Komponenten aufgebaut ist und ohne Probleme installiert. Aber nachdem ich versuche, eine Komponente in das Formular einzufügen, wird das Meldungsfeld für die Zugriffsverletzung angezeigt. Beim Debuggen der Fehlerquelle, die ich gefunden habe, wird diese Methode GetArrowStyle mit Index Wert von -1 aufgerufen, die das Auslesen von Array-Grenzen verursacht. Ich verstehe, dass Benutzer von TVctDiag2 Klasse (= integrierte Entwicklungsumgebung) kann nicht wissen, was die Array-Größe ist. Die Größe des Arrays ist konstant und es ist eine recht kleine Anzahl (6), so alternative Lösung wäre:

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); 
... 
}; 

Aber ich ziehe allgemeine Lösung. Wie kann dies erreicht werden, wenn möglich mit der Möglichkeit, Eigenschaftswerte über den Objektinspektor zu ändern.

Antwort

2

Deklarieren Sie die Array-Eigenschaften stattdessen als public. __published wird für Entwurfszeit-Bearbeitung und RTTI Generation verwendet, die Array-Eigenschaften nicht unterstützen:

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); 
... 
}; 

Ihr zweites Beispiel Buggy ist. Sie müssen die index Parameter aus den Getter/Setter-Methoden entfernen, da die Eigenschaften nicht Indizes verwenden (von Nicht-Array-Eigenschaften verwenden, können Sie sie als __published erklären):

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(); 
... 
}; 

Wenn Sie separate Eigenschaften verwenden möchten Für die einzelnen Array-Werte würde ich vorschlagen, zur Verwendung von Indizes mit einem einzigen Satz von Getter-/Setter-Methoden zurückzukehren, indem der Spezifizierer index für die Eigenschaftsdeklarationen verwendet wird (ich würde sogar so weit gehen, eine Array-Eigenschaft public erneut zu deklarieren), für den Fall, dass Sie die Werte im Code durchlaufen müssen:

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); 
... 
}; 

Wenn Sie ein Array zeitgesteuert bearbeiten möchten, müssen Sie entweder einen benutzerdefinierten Komponenteneditor schreiben und ihn bei der IDE registrieren oder die Array-Eigenschaft in eine TCollection (die in RTTI vollständig unterstützt wird) neu schreiben. Zeitbearbeitung).