【问题标题】:How To: Assigning a value to a sub property of an indexed default property via "setter"如何:通过“setter”为索引默认属性的子属性赋值
【发布时间】:2019-07-23 13:05:17
【问题描述】:

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

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

问题:如何构造属性/过程/函数以运行以下代码

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

Since more is more 这里是我使用的记录结构。如果有更好的方法我也愿意改变一般结构,所以我愿意提出建议。

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;

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

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

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

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

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

【问题讨论】:

  • 将记录更改为类 因为记录是值类型,所以这永远不会起作用。
  • 再解释一下:当您编写 MyProfile[i] 时,您将获得该 TChannelList 记录的副本。后面的一切都是在那个副本上完成的,所以它不会进入原始数据结构。
  • 好的!我会记下这些笔记然后去上课!非常感谢你!嵌套记录似乎有效(在第一次试用中阅读下面的内容)但我会仔细检查!
  • 好的,所以我尝试将记录更改为类,但总体概念仍不清楚。由于我想在需要使用属性的级别之间进行一些操作。但是我找不到告诉子项的解决方案,例如ChannelParameter.name要更改,因为我无法获取setter函数setchannelparamter,对。任何具体的想法如何解决这个问题?

标签: delphi delphi-10.2-tokyo


【解决方案1】:

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

如果您将TChannelParameter 声明为类,您的Channal_GlobalNumber 属性将返回一个对该对象的引用(指针),这样您就可以访问它的任何字段/属性,就像您有引用此类对象的变量一样.

这意味着您可以通过以下方式更改单个频道的名称属性/字段:

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

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

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

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

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

【讨论】:

  • hm....老实说我试过了...也许我在其他地方还有问题。我仔细检查了我的构造函数和东西,也许我忘记了一些东西......谢谢你的回复!欣赏它
  • 感谢 SilverWarrior....我终于启动并运行了....我(可能)第一次尝试时忘记更改一条记录...现在问题解决了!我只需要编写正确的例程,但这很好:) 非常感谢!
  • 我猜在您的第一次尝试中,您可能只是将 TChannelList 更改为类,而实际上它可以保留为记录类型,但您确实需要更改 TChannelParameter 以便您的索引属性正在返回对您的对象的引用,而不是它的副本。
  • 好的。所以我明白了。当然,原版要复杂一些。在第一次试验中,我忘记将另一个相关记录更改为一个类,因为我认为这不会影响任何事情(在调试完我所知道的一切之后知道)在你回答之后,我只是将所有记录更改为类......它起作用了:)知道我需要再次对此有所不同,但这会解决的,我确信 :) 非常感谢您的帮助,我不知何故对此感到不知所措
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
相关资源
最近更新 更多