2009-02-27 6 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

게시 선언을 살펴 가상 메소드 테이블에 정보를 저장하도록 컴파일러에 지시하는 방법을 동적 배열에. 특정 종류의 정보 만 저장할 수 있습니다.
게시 된 속성의 유형은 포인터, 레코드 또는 배열 일 수 없습니다. 집합 타입이라면 정수로 저장할 수있을만큼 작아야합니다.
(오렐리, 델피에있는 너트 힐)

+3

단지 하나의 정밀도 : 레코드는 게시 된 속성으로 사용할 수 없습니다. 사실, 허용되지만이 필드에는 RTTI가 붙어 있지 않습니다. 따라서 게시 된 속성 섹션에 레코드를 추가하는 것은 쓸모가 없습니다. 동적 배열은 RTTI 내에서 허용되고 처리됩니다. –

-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

Upvoted downvote. –

0

동적 배열 속성을 게시 할 수있는 이유는 동적 배열이 참조 또는 '암시 적으로 포인터'로 구현된다는 것입니다. 그들은 문자열처럼 더 많은 일을합니다.

정적 배열을 게시 할 수없는 이유는 잘 모르겠습니다. 그것은이 만들어졌다 단지 방법 같아요 .. 자세한 내용은

작업, DrBobs site

0

게터와 세터가 있어야합니다. D2009 (다른 버전을 확인하지 않음)에서 getters/setter에 대한 매개 변수는 어떤 이유로 든 const가 될 수 없습니다. ?

이 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

이것은 * WHY *에 대해 우리에게 정확히 알려주지 않습니다. –

관련 문제