如何:通过 "setter" 将值分配给索引默认值 属性 的子 属性

How To: Assigning a value to a sub property of an indexed default property via "setter"

我有一个class,其中包含我的一个项目的概要信息,其中包含大量信息,称为PROFILE。为了轻松访问此配置文件的所有不同属性,我有一个索引默认值 属性。这个默认 属性(TCHANNELLIST) 是一个包含一些属性的记录以及另一个记录 (TCHANNELPARAMETER)。 属性 CHANNEL 是默认 属性 TCHANNELLIST 的默认 属性(索引)。

现在我在构建这些属性的 setter 时遇到了问题。 (要澄清:读取功能不是问题!请不要打扰,除非可以在其中找到解决方案)。

问题:如何构造 Property/procedure/function 以获得以下代码 运行

MyProfile[i][j].Name := 'Thanks_for_the_help';

因为多就是多这里是我使用的记录结构。如果有更好的方法,我也愿意改变总体结构,所以我愿意提供建议。

TChannelParameter = record                                                        
  // each channel gets one record for itself
  public
    channelType                     : TKanalTyp;
    display_number                  : Integer;    
    Name                            : string;
    // and a few other but you will get the idea...
  end;

TChannelList = record
  private
    FChannelparameter_List           : array of TChannelParameter ; 
    function GetChannelParameter(Index: Integer): TChannelParameter ;
    procedure SetChannelParameter(Index: Integer); //Here I need some help
  public
    property Channal_GlobalNumber[index: Integer]: TChannelParameter read GetChannelParameter write SetChannelParameter; //Here I need some help
  end;

老实说,我只是不知道(而且我在网上找不到任何帮助)来获取那行代码 运行。阅读所有内容不是问题,但将内容写入索引默认 属性 的 "subitem" 对我来说是一个谜。这里用这个没关系

A_Channel_list[i].name := 'aName';

MyProfile[i][j].name := 'aName';

两个setter目前都没有建造!因为我缺乏这样做的基本知识! (此外我没有包括 class 因为处理应该是相同的)

如果我得到一个 运行 另一个应该不再是问题了。也许有人知道这种操作是不可能的,也请告诉我这一点!然后我将重建我的 class 和记录。

对于您想要实现的目标,您甚至不需要 Channal_GlobalNumber 属性 可写。只要您的 TChannelParameter 对象是 class 类型而不是您现在拥有的记录类型,让它可读就足够了。

你看看你是否将你的 TChannelParameter 声明为 class 你的 Channal_GlobalNumber 属性 将 return 你是那个对象的引用(指针)所以你然后可以访问它的任何 fields/properties 就像你有引用此类对象的变量一样。

这意味着您可以更改个别频道的名称 property/field,只需使用:

A_Channel_list[i].name := 'aName';

那么为什么当您的 TChannelParameter 是记录类型时这不起作用。正如 Uwe Raabe 在他的评论中所写,您的索引 属性 记录类型不会 return 您是数组中的原始记录,而是它的副本。因此,对其进行任何修改都不会更改数组中的原始记录,而是复制。

编辑: 不要忘记,如果您将 TChannelParameter 对象更改为 class 类型,您将不得不编写特殊的例程来创建此类对象当您更改 FChannelparameter_List 数组的大小时,在这种情况下,此数组是指向 TChannelParameter classes.

的指针数组

现在,如果您想真正避免这种情况并仅使用记录,您可以在 TChannelList 对象中为 TChannelParameter 记录的每个字段编写多个索引属性。因此,您可以使用这些属性 getter 或 setter 方法来访问数组中的项目。

很遗憾,我现在无法为您编写代码示例,因为我不在我的开发计算机上。