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