2012-10-13 80 views
9

I construidos sistema de clases¿Cómo puedo declarar una propiedad de matriz?

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; 

Así, en propiedad TableSpec campos será la lista de campos (utilicé array TFieldSpec). ¿Cómo organizar la lista de campos (con o sin el uso de una matriz) que como resultado de la compilación recibo un error

[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 menos que esté seguro de que usted necesita exactamente 100 campos, que crearía un tipo como 'tfields type = Matriz de TFieldSpec' y especifique los campos de atributos como' FFields: TFields'. –

+0

Se cambió el nombre del título y se eliminó el código irrelevante. No necesitamos ver toda la unidad para identificar el problema aquí. –

+0

¿Está seguro de que quiere una propiedad con un tipo de matriz, o más bien un indexador? – CodesInChaos

Respuesta

21

Su línea

property Fields : array read FFields; 

es una sintaxis no válida. Debería ser

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

donde GetField es una función (privado) que toma un número entero (el Index) y devuelve el correspondiente TFieldSpec, por ejemplo,

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

Ver the documentation on array properties.

11

Acepto que la respuesta con respecto a las propiedades INDEXED, otorgadas por Andreas, es la solución que busca el afiche.

Para completar, para futuros visitantes, me gustaría señalar que una propiedad puede tener un tipo de matriz, siempre que el tipo sea nombrado. Lo mismo se aplica a los registros, punteros y otros tipos derivados.

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

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