6
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 型にすることはできません」というエラーが表示されますが、動的配列は問題ありませんか? よくわかりません。この背後にある理由を知っている人はいますか?どうすれば回避できますか? (いいえ、すべての静的配列を動的として再宣言したくありません。理由により、それらはサイズです。)

4

5 に答える 5

6

パブリッシュされた宣言は、仮想メソッド テーブルに情報を格納するようにコンパイラに指示します。特定の種類の情報のみを格納できます。
パブリッシュされたプロパティの型は、ポインター、レコード、または配列にすることはできません。セット型の場合は、整数に格納できるほど小さくする必要があります。
(オライリー、一言で言えばデルフィー)

于 2009-02-27T08:25:05.090 に答える
1

ゲッターとセッターが必要です。D2009 (他のバージョンはチェックしていません) では、getter/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;

注: 通常、範囲外の Index 値を単に無視するわけではありません。これは、クラス定義で静的配列プロパティを作成する方法の簡単な例です。IOW、これはコンパイル可能な例にすぎません。

于 2009-02-28T23:00:02.560 に答える
0
 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;
于 2011-04-18T15:39:32.040 に答える
0

動的配列プロパティを公開できる理由は、動的配列が参照として実装されているか、「暗黙的なポインター」であるためです。実際には、文字列のように機能します。

静的配列を公開できない理由はわかりません。あくまでも作り方ですけどね。。

動的配列の仕組みの詳細については、DrBobs サイトをご覧ください。

于 2009-02-27T06:59:41.160 に答える
-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;
于 2009-02-27T02:17:26.907 に答える