2012-10-13 6 views
9

ho costruito sistema di classeCome posso dichiarare una proprietà di matrice?

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; 

Così in proprietà TableSpec campi sarà la lista dei campi (io ho usato matrice TFieldSpec). Come organizzare l'elenco dei campi (che utilizzano o senza l'utilizzo di un array) come a seguito della compilazione ricevo un errore

[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

A meno che non si è sicuri che avrete bisogno di esattamente 100 campi, mi piacerebbe creare un tipo come 'tipo tfields = array di TFieldSpec' e quindi specificare l'attributo campi come' FFields: TFields'. –

+0

Rinominato il titolo e rimosso il codice irrilevante. Non abbiamo bisogno di vedere l'intera unità per individuare il problema qui. –

+0

Sei sicuro di voler una proprietà con un tipo di array, o piuttosto un indicizzatore? – CodesInChaos

risposta

21

La linea

property Fields : array read FFields; 

è sintassi non valida. Dovrebbe essere

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

dove GetField è una funzione (privata) che accetta un numero intero (la Index) e restituisce il corrispondente TFieldSpec, ad esempio,

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

Vedi the documentation on array properties.

11

Sono d'accordo che la risposta riguardante le proprietà INDEXED, data da Andreas, è la soluzione che il poster sta cercando.

Per completezza, per i visitatori futuri, vorrei sottolineare che una proprietà può avere un tipo di matrice, purché il tipo sia denominato. Lo stesso vale per record, puntatori e altri tipi derivati.

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

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