2009-02-27 22 views
5
type 
    TStaticArray = array[1..10] of integer; 
    TDynamicArray = array of integer; 

    TMyClass = class(TObject) 
    private 
     FStaticArray: TStaticArray; 
     FDynamicArray: TDynamicArray; 
    published 
     property staticArray: TStaticArray read FStaticArray write FStaticArray; //compiler chokes on this 
     property dynamicArray: TDynamicArray read FDynamicArray write FDynamicArray; //compiler accepts this one just fine 
    end; 

¿Qué está pasando aquí? Una matriz estática da el error, "propiedad publicada 'staticArray' no puede ser del tipo ARRAY" pero las matrices dinámicas están bien? Estoy confundido. ¿Alguien sabe el razonamiento detrás de esto, y cómo puedo evitarlo? (Y no, no quiero redeclarar todas mis matrices estáticas como dinámicas. Son del tamaño que son por algún motivo)¿Por qué se pueden publicar algunas matrices pero no otras?

Respuesta

6

declaración Publicado le dice al compilador para almacenar la información en la tabla de métodos virtuales. Solo se pueden almacenar ciertos tipos de información.
El tipo de una propiedad publicada no puede ser un puntero, registro o matriz. Si es un tipo establecido, debe ser lo suficientemente pequeño para almacenarse en un entero.
(O'REILLY, DELPHİ EN UN NUTSHELL)

+3

Solo una precisión: un registro no se puede utilizar como una propiedad publicada. O, de hecho, está permitido, pero no hay ningún RTTI conectado a este campo. Por lo tanto, será inútil agregar un registro en una sección publicada de propiedades. Mientras que una matriz dinámica está permitida y manejada dentro del RTTI. –

-3

Las propiedades de matriz no se pueden publicar. Así que el siguiente código no funciona. El trabajo probablemente sea para hacerlo public.

TMyClass = class(TObject) 
    private 
    FStaticArray: TStaticArray; 

    function GetFoo(Index: Integer): Integer; 
    procedure SetFoo(Index: Integer; Value: Integer); 
    public 
    property Foo[Index: Integer] : Integer read GetFoo write SetFoo; 
    end; 
+0

Nope. Eso tampoco funciona. Mismo error. –

+0

¿Cómo puede obtener el mismo error sin usar TStaticArray como propiedad? –

+0

Vota el voto en baja. –

0

La razón por la que puede publicar una propiedad de matriz dinámica, es que las matrices dinámicas se implementan como referencias, o 'implícitamente puntero'. Funcionan más como cuerdas, de verdad.

La razón por la que no se puede publicar una matriz estática, no lo sé. Es sólo la forma en que se hizo, supongo ..

Para más detalles sobre cómo trabajar matrices dinámicas, echar un vistazo a DrBobs site

0

Tienes que tener getters y setters. Debajo de D2009 (no revisó otras versiones), los parámetros para los getters/setters no pueden ser, por alguna razón, const. ?

Esto funciona bien bajo D2009:

type 
    TMyArray = array[0..20] of string; 

type 
    TMyClass=class(TObject) 
    private 
    FMyArray: TMyArray; 
    function GetItem(Index: Integer): String; 
    procedure SetItem(Index: Integer; Value: string); 
    public 
    property Items[Index: Integer]: string read GetItem write SetItem; 
    end; 

implementation 

function TMyClass.GetItem(Index: Integer): string; 
begin 
    Result := ''; 
    if (Index > -1) and (Index < Length(FMyArray)) then 
    Result := FMyArray[Index]; 
end; 

procedure TMyClass.SetItem(Index: Integer; Value: string); 
begin 
    if (Index > -1) and (Index < Length(FMyArray)) then 
    FMyArray[Index] := Value; 
end; 

NOTA: No me suelen ignorar los valores del índice fuera de rango, obviamente. Este fue un ejemplo rápido de cómo hacer propiedades de matriz estática en una definición de clase; IOW, es solo un ejemplo compilable.

1
TMyClass = class(TObject) 
    private 
    FStaticArray: TStaticArray; 
    FIdx: Integer; 
    function GetFoo(Index: Integer): Integer; 
    procedure SetFoo(Index: Integer; Value: Integer); 
    public 
    property Foo[Index: Integer] : Integer read GetFoo write SetFoo; 
    published 
    property Idx: Integer read fidx write fidx; 
    property AFoo: Integer read GetAFoo writte SetAFoo; 
    end; 
implementation 
function TMyClass.GetAFoo: Integer; 
begin 
    result := FStaticArray[FIdx]; 
end; 
procedure TMyClass.SetAFoo(Value: Integer); 
begin 
    FStaticArray[FIdx] := Value; 
end; 
+1

Esto no nos dice exactamente nada sobre * WHY *. –

Cuestiones relacionadas