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

यहां क्या हो रहा है? एक स्थिर सरणी त्रुटि देता है, "प्रकाशित संपत्ति 'staticArray' ARRAY प्रकार का नहीं हो सकता है" लेकिन गतिशील सरणी ठीक है? मैं उलझन में हूं। किसी को इसके पीछे तर्क पता है, और मैं इसके आसपास कैसे काम कर सकता हूं? (और नहीं, मैं अपने सभी स्थैतिक सरणी को गतिशील के रूप में पुन: प्राप्त नहीं करना चाहता हूं। वे आकार हैं जो वे किसी कारण से हैं।)कुछ सरणी क्यों प्रकाशित की जा सकती हैं लेकिन दूसरों को नहीं?

उत्तर

6

प्रकाशित घोषणा पर एक नज़र डालें संकलक बताता आभासी विधि तालिका में जानकारी स्टोर करने के लिए पर लगता है ..

अधिक जानकारी के लिए। केवल कुछ प्रकार की जानकारी संग्रहीत की जा सकती है।
प्रकाशित संपत्ति का प्रकार एक सूचक, रिकॉर्ड, या सरणी नहीं हो सकता है। यदि यह एक सेट प्रकार है, तो यह एक पूर्णांक में संग्रहीत करने के लिए पर्याप्त छोटा होना चाहिए।
(O'REILLY, एक NUTSHELL में DELPHİ)

+3

बस एक परिशुद्धता: एक रिकॉर्ड प्रकाशित संपत्ति के रूप में उपयोग नहीं किया जा सकता है। या वास्तव में, इसकी अनुमति है, लेकिन इस क्षेत्र से कोई आरटीटीआई संलग्न नहीं है। तो गुणों के एक प्रकाशित खंड में एक रिकॉर्ड जोड़ने के लिए बेकार होगा। जबकि आरटीटीआई के भीतर एक गतिशील सरणी की अनुमति है और संभाला जाता है। –

-3

ऐरे गुण प्रकाशित नहीं किए जा सकते हैं। तो निम्न कोड काम नहीं करता है। संभवतः लगभग 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

नहीं। यह या तो काम नहीं करता है। वही त्रुटि –

+0

TStaticArray को संपत्ति के रूप में उपयोग किए बिना आप एक ही त्रुटि कैसे प्राप्त कर सकते हैं? –

+0

डाउनवोट ऊपर उठाया गया। –

0

कारण आप एक गतिशील सरणी संपत्ति प्रकाशित कर सकते हैं, यह है कि गतिशील सरणी संदर्भ, या 'निहित सूचक' के रूप में लागू की जाती है। वे वास्तव में तारों की तरह काम करते हैं।

कारण आप एक स्थिर सरणी प्रकाशित नहीं कर सकते हैं, मुझे नहीं पता। यह अभी जिस तरह इसे बनाया है, मैं कैसे गतिशील सरणियों काम करते हैं, DrBobs site

0

आपको गेटर्स और सेटर्स रखना होगा। डी 200 9 के तहत (अन्य संस्करणों की जांच नहीं की गई), गेटर्स/सेटर्स के पैरामीटर कुछ कारणों से नहीं हो सकते हैं। ?

यह 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; 

नोट: मैं आम तौर पर सिर्फ सीमा से बाहर सूचकांक मूल्य को नजरअंदाज नहीं होता है, जाहिर है। क्लास परिभाषा में स्थैतिक सरणी गुण बनाने के लिए यह एक त्वरित उदाहरण था; IOW, यह केवल एक संकलित उदाहरण है।

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

यह हमें * क्यों * के बारे में कुछ नहीं बताता है। –

संबंधित मुद्दे

 संबंधित मुद्दे