Delphi:TByteDynArray的问题设置长度

时间:2010-07-01 03:17:03

标签: delphi

问题已关闭(已接受答案)替换为Delphi 7: Access violation - TByteDynArray problem


我给了我以下的礼物

MyPhoto = class(TRemotable)
private
  FhasPhoto: Boolean;
  FphotoData: TByteDynArray;
published
  property hasPhoto: Boolean read FhasPhoto write FhasPhoto;
  property photoData: TByteDynArray read FphotoData write FphotoData;
end;

我想要

var photo : MyPhoto;
photo := MyPhoto.Create();
SetLength(photo.photoData, 4);

但我得到

[Error] mainForm.pas(340): Constant object cannot be passed as var parameter

1)我如何正确编码,因为我无法改变类Photo的定义? 2)我可以通过分配给TByteDynArray有效地“转换”任何结构吗?

(你可能已经猜到了,我是一个试图进入Ddlphi的BCB人: - )


p.s我将满足于能够单独分配照片数据的每个字节......

2 个答案:

答案 0 :(得分:2)

这是Delphi实现属性的一个缺陷。即使可以读取和写入属性,即使读取和写入都指向底层对象中的同一字段,也不能将属性传递给 var 参数,例如到SetLength。这没有充分的理由,但这至少是它的工作方式。

但是,对于这个问题,有一个相当简单的解决方法。你需要一个带有整数的对象的方法,并在内部设置FPhotoData的长度。

答案 1 :(得分:1)

这是一种方式:

MyPhoto = class(TRemotable)
  ...
public
  procedure SetSize( aSize : Integer );
end;

procedure MyPhoto.SetSize( aSize : Integer );
begin
  SetLength( FphotoData, aSize );
end; 


var photo : MyPhoto;
photo := MyPhoto.Create();
MyPhoto.SetSize(4);