为什么某些阵列可以发布但不能发布?

时间:2009-02-27 01:57:50

标签: delphi arrays properties delphi-2009

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类型”但动态数组就好了吗?我糊涂了。任何人都知道这背后的原因,以及我如何解决它? (不,我不想重新声明我的所有静态数组都是动态的。它们的大小是有原因的。)

5 个答案:

答案 0 :(得分:6)

已发布的声明告诉编译器将信息存储在虚方法表中。只能存储某些类型的信息 已发布属性的类型不能是指针,记录或数组。如果它是一个集合类型,它必须足够小,以便存储在一个整数中 (O'REILLY,DELPHİ在坚果中)

答案 1 :(得分: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;

答案 2 :(得分:0)

您可以发布动态数组属性的原因是动态数组是作为引用实现的,还是“隐式指针”。他们的工作更像是字符串,真的。

你不能发布静态数组的原因,我不知道。这就是它的制作方式,我猜......

有关动态数组如何工作的更多详细信息,请查看DrBobs site

答案 3 :(得分:0)

你必须有吸气剂和二传手。在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;

注意:显然,我通常不会忽略超出范围的索引值。这是如何在类定义中创建静态数组属性的快速示例; IOW,这只是一个可编辑的例子。

答案 4 :(得分:-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;