Delphi:以某种结构存储数据

2023-12-01

对于模拟程序,我正在 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(使用前将#替换为@)

Delphi:以某种结构存储数据 的相关文章

  • VirtualStringTree 正确/推荐使用

    我已经使用 virtualstringtree 一段时间了 我将它用于两个不同的用途 第一个是用于选择 显示数据的普通树 第二个是作为网格来显示 SQL 语句的输出 我加载到树中的所有数据都来自数据库 对于树示例 我有一个 ParentId
  • 新编译的应用程序需要 UAC/elevation?

    我有一个系统 我将其设置为普通的 UAC 并在我的 delphi 环境中编译名为 ka exe 的项目 并为其创建一个 installshield 项目 设置完毕 一切顺利 但每当我开始我的程序时 它都需要提升 而我不知道为什么 为了确保
  • Soap Delphi 客户端因 1MB 调用超时而结束

    我们正在开发 SOAP Web 服务 Apache PHP 所有小规模调用都运行良好 但对于 1Mb 的 Soap 调用 HTTPS 调用大小为 1MB 我们的 Delphi Soap 客户端在除一台 PC 之外的所有 PC 上都因超时而停
  • 在 XMLDocument 中使用 DocumentElement 时发生访问冲突

    当我尝试使用时 我总是遇到访问冲突DocumentElement of the XMLDocument 我创造XMLDocument基于某些文件的存在 错误信息 项目project1 exe引发异常类EAccessViolation 消息
  • 在该对象调用的事件期间销毁该对象

    我有一个按钮 它的 OnClick 事件调用一个销毁按钮的过程 但随后 线程 想要返回到 OnClick 事件 并且我遇到了访问冲突 我完全被难住了 您需要在按钮的所有代码执行完毕后销毁该按钮 执行此操作的标准方法是将用户定义的消息发布到表
  • Delphi:如何计算大文件的 SHA 哈希值

    您好 我需要生成 5 Gig 文件的 SHA 您知道有一个非基于字符串的 Delphi 库可以做到这一点吗 你应该使用DCPcrypt v2 http www cityinthesky co uk cryptography html读取缓冲
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • 如何将 SQL 结果存入 STRING 变量?

    我正在尝试获取 C 字符串变量或字符串数 组中的 SQL 结果 是否可以 我需要以某种方式使用 SqlDataReader 吗 我对 C 函数和所有功能非常陌生 曾经在 PHP 中工作 所以如果可以的话请给出一个工作示例 如果相关 我已经可
  • Delphi中AsInteger和Value有什么区别?

    我想知道以下两个与delphi中的数据集相关的语句之间的区别 dsMyDataSet ParamByName ID AsInteger 1122 If ID is integer dsMyDataSet ParamByName ID AsS
  • 为什么不提高EInvalidPointer?

    德尔福文档状态 http docwiki embarcadero com Libraries en System SysUtils EInvalidPointer 切勿提出E无效指针直接异常 E无效指针由内存管理器内部引发 我正在编写一个自
  • delphi专家中的第三方依赖

    我正在编写一个delphi ide Expert 带有一些第三方依赖项 视觉控件 我的问题是当这个专家将安装在目标机器上时 这台电脑是否也需要安装这些第三方组件 或者组件是embeded在生成的 bpl 内部 它们将依赖于您放置在包的 re
  • 为什么使用过程来创建对象比使用函数更受欢迎?

    这类似于这个问题 https stackoverflow com questions 1894217 is it memory safe to provide an object as a function result 我问 为什么 到最
  • 有没有办法在 TRttiField 中 FieldType 为零的结构中获取 real48 和短字符串变量的 RTTI 提示?

    我发现 Delphi 中的扩展 RTTI 功能有一个奇怪的疏忽 可能是故意的 我想转储包含大约 1500 个不同字段的记录类型中的所有字段 是的 认真的 其中一些是 real48 类型 一些是短字符串 对于这两种类型 在运行时这些类型的 F
  • 为什么变量被声明为 TStrings 并被创建为 TStringList?

    为什么变量声明为TStrings并创建为TStringList 例如 varsl被声明为TStrings但创建为TStringList var sl TStrings begin sl TStringList Create add stri
  • 以高效的方式将字符串转换为十六进制

    我开发了以下函数将字符串转换为十六进制值 function StrToHex const S String String const HexDigits array 0 15 of Char 0123456789ABCDEF var I I
  • delphi检查ini文件是否存在

    如何检查 INI 文件是否存在 在特定路径和特定名称下 比如这样 if FileExists c yourinifile ini then ShowMessage c yourinifile ini exists
  • 如果鼠标不在 VirtualTreeView (TVirtualStringTree) 上,如何禁用 MouseWheel

    如果 TVirtualStringTree 获得焦点 则默认情况下它会在鼠标滚轮上滚动 即使鼠标未超出控制范围 除非它位于另一个 TVirtualStringTree 上方 有没有一种快速而优雅的方法来禁用这种行为 我已经这样做了OnMou
  • Delphi 如何与 Active Directory 集成?

    我们需要使用 Delphi 7 验证 Microsoft Active Directory 上的用户 最好的方法是什么 我们可以有两种情况 用户输入其网络用户名和密码 其中用户名可能包括域 然后我们检查活动目录是否是有效的活动用户 或者我们
  • 有什么办法可以将2个数组添加到一个数组中吗?

    有没有一种简单通用的方法可以将两个数组添加到一个数组中 在下面的情况下 不可能简单地使用C A B陈述 我想避免每次都为它制定算法 TPerson record Birthday Tdate Name Surname string end
  • 创建FileStream时如何处理异常

    我有一个这样的函数 我想重构它 function Myfunction sUrl sFile String Boolean var GetData TFileStream begin Result False if the line bel

随机推荐

  • C# 检查文本框中的空格

    如何在 C 中检查文本框中是否仅存在空格并在之后执行某些操作 这可以确保您的支票中包含多个空格 bool hasAllWhitespace txtBox1 Text Length gt 0 txtBox1 Text Trim Length
  • 提示并阻止用户离开/关闭页面

    根据 StackOverflow 在添加问题或回复问题时的做法 我想提示用户 Are you sure you want to navigate away from this page Press OK to continue or Can
  • Google 活动识别可以在旧版本的 Android 上运行吗?

    我想开发一个在Android 4 1上实现活动识别的测试应用程序 但我在文档上看到只支持4 2 2 我还看到像 AutomateIt 包括识别功能 这样的应用程序可以在我的 Jellybean 4 1 上运行 怎样才能做到这一点呢 谷歌自己
  • 如何统计数组中每个值的出现次数?

    我在MongoDB中有一个ISSUES数据库 有些问题有注释 这是一个数组 每个评论都有一个作者 如何统计每个作者发表的评论数量 我试过了 db test issues group key comments username true in
  • 如何使用java从.nsf(lotus Notes)文件中获取所有附件

    步骤如下 拿了我的莲花笔记背面作为样本 nsf 然后尝试从sample nsf中读取附件 代码片段 Database db session getDatabase C Projects NotesToJava sample nsf Docu
  • Java日历设置不正确

    我在使用 Java 日历时遇到了一些问题 我正在解析 txt 文件中的一些数据 并且需要创建一个日期 完成以下代码后 tmpYear Double parseDouble row yearIndex tmpMonth Double pars
  • 如何使用自定义策略防止基于扩展声明类型登录 AD B2C

    我有一个扩展声明类型Extension isEmailVerified 我想根据此声明类型的值阻止用户登录 如果是true那么用户可以登录 如果false然后需要在登录页面显示一条错误消息 表明您的电子邮件未经过验证
  • getchar() 不会传递 EOF 并且 Ctrl+Z 不会终止 Cygwin 上的程序

    这是一个简单的程序 计算字符串 符号和单词 使用 Cygwin 进行计算一切正常 但是在启动时 输入值后 程序不会打印nc nw nl并等待输入更多值 改变EOF到 13 Enter 无论如何都没有帮助 ctrl Z is useful t
  • 无法启动appium会话

    我无法开始会话 你能帮忙吗 我已完成以下步骤 从 Appium for windows 包启动 Appium 服务器 运行 appium exe 文件 启动了android模拟器 启动硒服务器 通过 TestNG 运行脚本 当我在浏览器中输
  • ES6 模板文字:如何在解释之前传递作用域?

    我开始使用模板文字来制作错误生成器 我有工作代码 但我被迫声明内部可能错误的列表constructor范围 我对此并不满意 有没有办法复制模板文字而不评估它 以便我可以在正确的范围内评估它 或者将范围传递给模板文字 Working erro
  • 将存储过程结果转换为模型对象

    我在使用实体框架的 asp net mvc3 应用程序中有一个存储过程 CREATE PROCEDURE dbo MinMax AS DECLARE T1 TABLE MinColorsId int MAXColorsId int INSE
  • SparkContext.addJar 在本地模式下不起作用

    当spark作业中需要有jar文件时 需要通过2种方式添加到spark作业中 1 jar path命令中的选项 2 SparkContext addJar path 谁能告诉我这两种方式之间的区别 From 这个问题 答案是它们是相同的 只
  • 如何在 Odoo POS 收据中添加二维码图像

    我正在尝试将 QR 图像添加到 POS 收据中 我在正常发票中使用的有效代码如下 img 对于收据 我将字符串导出为receipt qr string 并将以下行添加到收据的继承 XML 文件中 img 但图像看起来像是一个断开的链接 我
  • 在 Chrome 打包应用程序中保存而不提示

    我已经开始在 Chrome 中查看 Google 的打包应用程序 http developer chrome com apps这似乎是一项伟大的技术 但还处于早期阶段 我的问题是 是否可以使用应用程序中的文件系统 API 在没有提示的情况下
  • 角度轨道模板:找不到模板

    我有一个 Rails 应用程序 使用 AngularJS 进行客户端开发 我尝试加载位于 app assets javascripts templates 中的模板 myApp config routeProvider function r
  • 获取一个列表中不存在于另一个列表中的项目列表[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有关您编写的代码的问题必须描述具体问题 and 包含有效代码重现它 在问题本身中 看SSCCE org以获得指导 询问代码的问题必须对所解决的问题表现出最低限度的了解 包括尝试的解决
  • 错误:TABLE_QUERY 表达式无法查询 BigQuery 表

    这是关于乔丹在这里回答的后续问题 BigQuery 中的奇怪错误 我曾经在 Table Query 中查询参考表以退出一段时间 现在 根据乔拉丹提到的最近的变化 我们的许多查询都被破坏了 我想向社区征求我们正在做的事情的替代解决方案的建议
  • HtmlUnit 抛出内存不足并且可能泄漏内存

    我将 Selenium 与 HtmlUnitDriver 结合使用并启用了 javascript 但出现内存不足错误 我使用 Java 我只是浏览同一个页面 我只使用一个 GET 命令 克服这种情况的解决方案是什么 我也有类似的问题 它最终
  • 无法在 OSX 上安装 pyenchant

    我正在尝试为 enchant 库 pyenchant 安装 python 绑定 根据自述文件 它应该像运行一样简单python setup py install但是当我尝试这样做时 我收到此错误 OSError Errno 2 No suc
  • Delphi:以某种结构存储数据

    对于模拟程序 我正在 Delphi 2010 中工作 模拟不是问题 但我需要使用大量数据 这会产生问题 数据在 Excel 工作表中可用 因此无需在 Delphi 中编辑此数据 但从 Excel 工作表收集此数据大约需要 10 分钟 只要您