对于模拟程序,我正在 Delphi 2010 中工作。模拟不是问题,但我需要使用大量数据,这会产生问题。数据在 Excel 工作表中可用,因此无需在 Delphi 中编辑此数据,但从 Excel 工作表收集此数据大约需要 10 分钟。只要您不需要每次程序运行时收集数据,这就不成问题。所以我制作了一个程序,收集所有数据使其可见,而不是这里的问题,然后存储它。但是我无法将其存储为“Delphi 格式”而不丢失结构,因此可以在几秒钟内加载它。
我在德尔福方面没有那么丰富的经验,我花了很长时间寻找解决方案,但不明白什么是最好的。我认为我构建数据的方式是错误的,但它很简单并且有效。但是,如果有更好的存储数据的方法,请这么说,但请记住,我需要更多的解释,而不仅仅是使用“xml 文件”、“generict”或“Ttreeview”。 (已阅读但无法使用)。
数据是:我制作了这个产品,我制作的下一个产品是这个,所以我需要清洁吗?对或错。
数据存储为一个带有产品编号(整数)的类(TObject)和一个包含接下来可以制作的所有产品的列表。该列表包含另一个带有产品编号(整数)的类(TObject)以及我是否需要清理(布尔值)。我想将此结构保存在文件中,而不丢失数据并将其读回相同的结构。
我希望有人能帮忙。先感谢您。
更新:提供更多信息的代码(修改为英文)
Clean_from = class(TObject)
public
myfromNumber : Integer;
mylist : TList;
published
constructor Create;
End
Clean_To = class(TObject)
public
myToNumber : Integer;
Clean : Boolean;
End;
constructor Clean_from.Create;
begin
inherited Create;
myList := Tlist.Create;
end;
For i = 0 to 100 do
begin
From:= Clean_from.create;
for j := 0 to 10 do
begin
To := Clean_To.create;
To.clean := true or false;
From.myList.add(To);
end;
GlobalList.add(from);
end;
现在我想保存包含所有内容的全局列表,以便我可以使用相同的结构加载它。
你需要的是所谓的“序列化”机制。
1. 标准方式
1.1 保存到流
在Delphi中,我们通常实现一个SaveToStream
方法,它将每个对象的内容保存在目标中TStream
(无论是TFileStream
or a TMemoryStream
).
您必须手动编写序列化。
1.2 类DFM流式传输
See TWriter / TReader类。
如果您在已发布的属性中定义数据,则可以使用这些标准 Delphi 类对它们进行序列化。
对于某些能够序列化任何TCollection
向和从JSON内容,参见这篇博客文章.
2.RTTI
参见例如这个问题.
特别是,新的增强型 RTTI(自 Delphi 2010 年起可用)为序列化开辟了新的机会。
3. 使用记录代替类
如果每个项目不存储大量内容(一些整数/布尔值),则使用记录而不是对象可能更有意义。对于速度和内存消耗/碎片来说,这可能是值得的。
Here is 一些包装器能够序列化任何动态数组,甚至包含嵌套记录或动态数组。
4.使用数据库引擎
也许更好的方法是不要让数据停留在应用程序专有的非进化二进制形式中。如果您想添加属性,则必须手动管理它。或者,如果您想从其他应用程序访问您的数据,可能会很困难。
有很多数据库解决方案 - 与其使用外部数据库(如 MS SQL、FireBird 或 Oracle),不如将数据库嵌入到应用程序中(更容易安装)。值得一提SQLite其中有很多包装纸, 包括我们的版本(如果您想使用 MS SQL 或 Oracle,您可以更改为任何其他数据库)。
您还有其他解决方案 - 请参阅这个问题- 如果您需要性能,请查看我们的大表库.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)