在设计时存储“记录数组”的最佳方式

时间:2010-03-20 00:18:40

标签: delphi

我有一组数据需要在设计时存储,以便在运行时构建一组组件的内容。

这样的事情:

type
  TVulnerabilityData = record
    Vulnerability: TVulnerability;
    Name: string;
    Description: string;
    ErrorMessage: string;
  end;

在设计时存储此数据以便以后在运行时检索的最佳方法是什么?我将有大约20条记录,我知道每条“记录”的所有内容,但我坚持认为存储数据的最佳方式。

我提出的唯一半优雅的想法是“构建”单位初始化的每条记录,如下所示:

var
  VulnerabilityData: array[Low(TVulnerability)..High(TVulnerability)] of TVulnerabilityData;

....

initialization
  VulnerabilityData[0].Vulnerability := vVulnerability1;
  VulnerabilityData[0].Name := 'Name of Vulnerability1';
  VulnerabilityData[0].Description := 'Description of Vulnerability1';
  VulnerabilityData[0].ErrorMessage := 'Error Message of Vulnerability1';

  VulnerabilityData[1]......
  .....
  VulnerabilityData[20]......

是否有比这更好和/或更优雅的解决方案?

感谢您阅读以及您可能提供的任何见解。

3 个答案:

答案 0 :(得分:8)

您也可以将数组声明为consts并初始化它......

const
  VulnerabilityData: array[Low(TVulnerability)..High(TVulnerability)] of TVulnerabilityData =
( 
    (Vulnerability : vVulnerability1; Name : Name1; Description : Description1;  ErrorMessage : ErrorMessage1),
    (Vulnerability : vVulnerability2; Name : Name2; Description : Description2;  ErrorMessage : ErrorMessage2),
[...]
    (Vulnerability : vVulnerabilityX; Name : NameX; Description : DescriptionX;  ErrorMessage : ErrorMessageX)
    )
);

我在这台计算机上没有IDE来仔细检查语法...可能是逗号或两个缺失。但是我想你应该这样做。

答案 1 :(得分:1)

不是答案,但可能是一个线索:设计时控件可以包含与之关联的图像和其他二进制数据,为什么不将数据写入资源文件并从那里读取?迭代当然,使其更简单,可扩展,更优雅

答案 2 :(得分:0)

典型的方式是文件,无论是属性样式(每行a = b \ n)cdf,xml,yaml(如果你有解析器,则首选)或数据库。

如果你必须像在你的例子中那样在代码中指定它,你应该首先把它放在一个你可以解析成简单格式的东西然后迭代它。例如,在Java中我实例化一个数组:

String[] vals=new String[]{
    "Name of Vulnerability1", "Description of Vulnerability1", "Error Message of Vulnerability1",
    "Name of Vulnerability2", ...
}

这会将您的所有数据放在一个位置,并且可以轻松更改读取它的循环以从文件中读取它。

我一直使用这种模式来创建菜单和其他字符串密集型初始化。

不要忘记你也可以在那里抛出一些逻辑!例如,对于菜单,我有时会使用以下数据创建它们:

"^File", "Open", "Close", "^Edit", "Copy", "Paste"

当我正在阅读这个时,我会扫描^,它告诉代码使这个条目成为顶级项目。我还使用“+ Item”创建一个子组,使用“-Item”返回上一组。

由于您完全指定了格式,因此可以稍后添加电量。例如,如果您使用上述系统编码菜单,您可能首先可以决定使用每个项目的第一个字母作为加速键。稍后您会发现File / Close与另一个“C”项冲突,您只需更改协议以允许“Close * e”指定E应该是加速器。您甚至可以包含具有不同字符的ctrl-x。 (如果你做这样的速记数据输入技巧,请用注释记录它!)

不要害怕写这样的小工具,从长远来看它们会帮助你很大,我可以生成这样的解析器并将值复制/粘贴到我的代码中,而不是模拟文本文件以适合您的示例。