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

Neler oluyor burda? Statik bir dizi, "staticArray" özelliği ARRAY türünde olamaz "hata verir, ancak dinamik diziler iyi durumda mı? Kafam karıştı. Bunun arkasındaki akıl yürütmeyi bilen var mı, onun etrafında nasıl çalışabilirim? (Ve hayır, tüm statik dizilerimi dinamik olarak yeniden belirtmek istemiyorum. Bir nedenden dolayı boyutu onlardır.)Bazı diziler neden başkaları tarafından yayınlanamaz?

cevap

6

Yayın beyanı bakmak sanal yöntem tablodaki bilgileri depolamak için derleyici söyler ne kadar dinamik diziler üzerinde. Sadece belirli türden bilgi saklanabilir.
Yayımlanan özellik türü işaretçi, kayıt veya dizi olamaz. Eğer bir set tipi ise, bir tam sayı içinde saklanacak kadar küçük olmalıdır.
(O'REILLY, DELPHİ A NUTSHELL'DE)

+3

Sadece tek bir hassasiyet: bir kayıt yayınlanmış bir özellik olarak kullanılamaz. Ya da aslında, izin verilir, ancak bu alana bağlı bir RTTI yoktur. Bu nedenle, özelliklerin yayınlanmış bir bölümüne kayıt eklemek işe yaramaz. Oysa dinamik bir diziye izin verilir ve RTTI içinde ele alınır. –

-3

Dizi özellikleri yayımlanamıyor. Yani aşağıdaki kod çalışmıyor. Muhtemelen çalışma, public'u yapmaktır.

+0

Nope. Bu da işe yaramıyor. Aynı hata. –

+0

Aynı hatayı TStaticArray özelliğini özellik olarak kullanmadan nasıl alabilirsiniz? –

+0

İndirme işleminin reddedildi. –

0

Bir dinamik dizi özelliğini yayımlayabilmenizin nedeni, dinamik dizilerin başvuru kaynağı olarak veya 'örtülü olarak gösterici' olarak uygulanmasıdır. Gerçekten daha çok dizgiler gibi çalışırlar.

Statik bir dizi yayınlayamamanın nedeni, bilmiyorum. O yapılmış sadece yol, sanırım .. Daha fazla detay için

çalışmak, DrBobs site

0

Alıcılar ve ayarlayıcılarınız olmalıdır. D2009 altında (diğer sürümleri kontrol etmediyse), herhangi bir nedenden dolayı, getters/setters parametrelerinin yapılamaması mümkün değildir. ?

Bu D2009 altında çalışıyor:

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; 

NOT: Genellikle sadece açıkçası, menzil dışında Endeksi değerlerini görmezden olmaz. Bu, bir sınıf tanımında statik dizi özelliklerinin nasıl oluşturulacağının hızlı bir örneğidir; IOW, sadece karşılaştırılabilir bir örnek.

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

Bu tam olarak bize * WHY * hakkında bir şey söylemiyor. –

İlgili konular