2009-02-27 16 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; 

Co tu się dzieje? Statyczna tablica podaje błąd, "opublikowana właściwość" staticArray "nie może być typu ARRAY", ale dynamiczne tablice są w porządku? Jestem zmieszany. Ktoś wie, jakie są tego powody i jak mogę je obejść? (Nie, nie chcę redeclare wszystkie moje statyczne tablice jako dynamiczne.Jest to rozmiar, który są z jakiegoś powodu.)Dlaczego niektóre tablice mogą być publikowane, ale inne nie?

Odpowiedz

6

Wydano oświadczenie informuje kompilator do przechowywania informacji w wirtualnej tablicy metod. Można przechowywać tylko niektóre rodzaje informacji.
Typ opublikowanej właściwości nie może być wskaźnikiem, rekordem ani tablicą. Jeśli jest to ustawiony typ, musi być na tyle mały, aby był przechowywany w liczbie całkowitej.
(O'REILLY, DELPHI W PIGUŁCE)

+3

Tylko jedna dokładność: rekordu nie można wykorzystać jako opublikowanej nieruchomości. Lub w rzeczywistości jest to dozwolone, ale nie ma powiązanego z nim RTTI. Dlatego dodanie rekordu do opublikowanej sekcji właściwości będzie bezużyteczne. Podczas gdy tablica dynamiczna jest dozwolona i obsługiwana w ramach RTTI. –

-3

Właściwości tablicy nie można opublikować. Poniższy kod nie działa. Prawdopodobnie chodzi o to, aby było to 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

Nie. To też nie działa. Ten sam błąd. –

+0

W jaki sposób można uzyskać ten sam błąd bez użycia właściwości TStaticArray jako właściwości? –

+0

Wznowiono awans. –

0

Powodem, dla którego można opublikować dynamiczną właściwość tablicy, jest to, że dynamiczne tablice są zaimplementowane jako odwołania lub "domyślnie wskaźnik". Działają bardziej jak struny, naprawdę.

Powód, dlaczego nie można opublikować statycznej tablicy, nie wiem. To jest po prostu tak to jest zrobione, myślę ..

więcej szczegółów na temat jak dynamiczne tablice działa, spójrz na DrBobs site

0

Musisz mieć zdobywców i seterów. Pod D2009 (nie sprawdzono innych wersji), parametry do getters/setters nie mogą z jakiegoś powodu być stałe. ?

To działa prawidłowo pod 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; 

UWAGA: Nie będzie zazwyczaj po prostu zignorować wartości indeksu poza zakresem, oczywiście. Był to szybki przykład, jak tworzyć statyczne właściwości tablicy w definicji klasy; IOW, to tylko przykład kompilacji.

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

To nam nie mówi nic o * DLACZEGO *. –

Powiązane problemy