【问题标题】:Delphi -> Delphi prism, how to use array of records?Delphi -> Delphi prism,如何使用记录数组?
【发布时间】:2009-10-04 07:27:13
【问题描述】:

我正在学习 Delphi Prism,但我不知道如何用它编写以下代码:

type
  TRapportItem = record
   Label : String;
   Value : Int16;
   AnomalieComment : String;
  end;

type 
  TRapportCategorie = record
    Label : String;
    CategoriesItems : Array of TRapportItem;
  end;

type 
  TRapportContent = record
    Categories : array of TRapportCategorie;
  end;

然后,在某个地方,我尝试将项目放入数组中:

rapport.Categories[i].Label:=l.Item(i).InnerText;

但它不起作用..有人可以启发我吗?

谢谢!

【问题讨论】:

  • 你能展示你声明和初始化变量'rapport'的代码吗?
  • 我只添加了 'rapport : TRapportContent;'到接口的受保护部分。我错过了什么?我还尝试将 CategoriesItems 声明为 TRapportItem 的 Array [0..64];但我有同样的问题。感谢您这么快回复!
  • 我发现了我昨天做的另一个测试:使用 'regular' delphi 我可以编写 setlength(rapport.Categories,10);将我的数组声明为动态数组时,但我找不到如何使用 prism 编写相同的数组。

标签: arrays delphi record delphi-prism oxygene


【解决方案1】:
  • 您没有具体说明什么“不起作用”。您应该在此类问题中包含错误。
  • 数组是引用类型,它们以值nil 开头。需要先对它们进行初始化,然后才能访问元素。

您可以使用new 运算符来做到这一点:

rapport.Categories = new TRapportCategorie[10]; // 0..9
  • 数组是相当低级的类型。通常最好改用List<T>

所以你要声明:

Categories: List<TRapportCategorie>;
  • 但是列表也需要初始化,使用new 操作符。此外,在包含值类型的列表上修改索引器的返回值将修改副本,而不是原始值,这会导致下一点。
  • 记录通常不是表示数据的最佳数据类型,因为它们不是引用类型;很容易最终修改数据的副本,而不是原始数据。通常最好使用类来代替,您可以将所有初始化代码(例如分配数组或列表)放在构造函数中。

【讨论】:

  • 谢谢!我切换到使用列表,它现在可以工作了! rapport.Categories:= 新列表;计划使用某种类,因为此代码必须由两个不同的应用程序使用,但我希望在这里进行某种快速原型设计。谢谢!
  • +1 使用 List 或 Dictionary 并将键作为类别名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多