打开类元素数组

时间:2018-07-18 12:10:54

标签: delphi

我有一个内部将另一个类定义为数组的类,如下所示:

[value]="statename.valuename"

我的问题是我找不到将元素添加到属性TaggedValues的方法。 所以我在这里问哪种是初始化,重新设置元素和创建元素的正确方法?


谢谢您的答复。 Guillot

可能我忽略了太多有关我的问题的信息,所以我将尝试更好地说明自己。

涉及的类来自WSDL,它们以这种方式彼此继承:

class1 = class
private
    fTag : string
    .
    .
published
    property Tag : read fTag write fTag;
end;

arrayOfClass1 = array of class1;

class2 =class
private
    FTvalue1 : string;
    FTaggedValues: arrayOfClass1;
    procedure SetTaggedValues (.....);
        do something;

published
    property value1 : read FTvalue1 write FTValue1;
    property  TaggedValues : arrayOfClass1 Index read FTaggedValues write SetTaggedValues;

end;

这是感兴趣的类的摘录代码:

StdOrderDto2 = class(TRemotable)
PrtOrderDto2 = class(StdOrderDto2)
PrtOrderColorDecksDto2 = class(PrtOrderDto2)

其中:

  StdOrderDto2 = class(TRemotable)
  private
    .
    .
    FTaggedValues: ArrayOfStdTagValueDto;
    procedure SetTaggedValues(Index: Integer; const AArrayOfStdTagValueDto: ArrayOfStdTagValueDto);
    .
    . 
  public
    destructor Destroy; override;
  published
    .
    property TaggedValues:        ArrayOfStdTagValueDto  Index (IS_OPTN or IS_NLBL) read FTaggedValues write SetTaggedValues stored TaggedValues_Specified;
    .
  end;

和:

  ArrayOfStdTagValueDto = array of StdTagValueDto2;  

所以我的第一个问题是: 如果该类不是TRemotable类的直接后代,是否也可以使用该类(PrtOrderColorDecksDto2)进行服务器调用? 我想是的,因为祖先(StdOrderDto2)是可伸缩的...但是我对此不太确定。

第二个问题: 对于“填充” TaggedValues,我使用以下代码段:

  StdTagValueDto2 = class(TRemotable)
  private
  .
  .
  (simple datatype are involved)    
  published
  .
  (etc)
  .
  end;

所以我的问题是:为什么会出现E2197编译器错误? 并且一旦有人可以向我解释我做错了什么,可以为我提供解决方法吗?

1 个答案:

答案 0 :(得分:1)

如ViRuSTriNiTy所说,用TList 代替数组将为您管理它们。

但是,如果您仍然喜欢使用数组,则只需在Class2中添加AddTag方法以添加新的TagValue,并在释放对象时添加Destroy方法以释放其所有标签。无需初始化。

class2 = class
private
  ...
  FTaggedValues = array of class1;
published
  ..
  procedure AddTagValue(TagValue: class1);
  destructor Destroy; override;
end;

implementation

procedure class2.AddTagValue(TagValue: class1);
begin
  SetLength(FTaggedValues, Length(FTaggedValues) + 1);
  FTaggedValues[Length(FTaggedValues) - 1] := TagValue;
end;

destructor class2.Destroy;
var TagValue: class1;
begin
  for TagValue in FTaggedValues do TagValue.Free;
  inherited Destroy;
end;