如何:通过 "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 方法来访问数组中的项目。
很遗憾,我现在无法为您编写代码示例,因为我不在我的开发计算机上。
我有一个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 方法来访问数组中的项目。
很遗憾,我现在无法为您编写代码示例,因为我不在我的开发计算机上。