2012-10-13 14 views
9

Ich konstruierte KlassensystemWie kann ich eine Array-Eigenschaft deklarieren?

TTableSpec=class(Tobject) 
    private 
    FName : string; 
    FDescription : string; 
    FCan_add : Boolean; 
    FCan_edit : Boolean; 
    FCan_delete : Boolean; 
    FFields : array[1..100] of TFieldSpec; 
    public 
    property Name: String read FName; 
    property Description: String read FDescription; 
    property Can_add : Boolean read FCan_add; 
    property Can_edit : Boolean read FCan_edit; 
    property Can_delete : Boolean read FCan_delete; 
    property Fields : array read FFields; 
    end; 

So in TableSpec Eigenschaft Fields wird die Liste der Felder sein (I TFieldSpec Array verwendet). Wie die Liste der Felder organisieren (mit oder ohne einen Array) wie als Folge der Zusammenstellung erhalte ich einen Fehler

[Error] Objects.pas(97): Identifier expected but 'ARRAY' found 
[Error] Objects.pas(97): READ or WRITE clause expected, but identifier 'FFields' found 
[Error] Objects.pas(98): Type expected but 'END' found 
[Hint] Objects.pas(90): Private symbol 'FFields' declared but never used 
[Fatal Error] FirstTask.dpr(5): Could not compile used unit 'Objects.pas' 
+0

Wenn Sie sicher sind, dass Sie genau 100 Felder benötigen, würde ich einen Typ wie 'Typ TFields = Array von TFieldSpec' erstellen und geben Sie dann die Felder Attribut als' FFields: TFields'. –

+0

Benannte den Titel um und entfernte irrelevanten Code. Wir müssen nicht die gesamte Einheit sehen, um das Problem hier zu lokalisieren. –

+0

Sind Sie sicher, dass Sie eine Eigenschaft mit einem Array-Typ oder eher einem Indexer möchten? – CodesInChaos

Antwort

21

Ihre Linie

property Fields : array read FFields; 

ungültige Syntax ist. Es sollte

property Fields[Index: Integer]: TFieldSpec read GetField; 

sein, wo GetField a (privat) Funktion ist, die eine ganze Zahl (die Index) und gibt die entsprechenden TFieldSpec, z.B. nimmt,

function TTableSpec.GetField(Index: Integer): TFieldSpec; 
begin 
    result := FFields[Index]; 
end; 

the documentation on array properties anzeigen.

11

Ich stimme zu, dass die Antwort in Bezug auf INDEXED-Eigenschaften, die von Andreas gegeben wurde, die Lösung ist, nach der das Poster sucht.

Der Vollständigkeit halber möchte ich für zukünftige Besucher darauf hinweisen, dass eine Eigenschaft einen Array-Typ haben kann, solange der Typ benannt ist. Dasselbe gilt für Datensätze, Zeiger und andere abgeleitete Typen.

type 
    tMyColorIndex = (Red, Blue, Green); 
    tMyColor = array [ tMyColorIndex ] of byte; 

    tMyThing = class 
    private 
     fColor : tMyColor; 
    public 
     property Color : tMyColor read fColor; 
    end; 
Verwandte Themen