首页 > 解决方案 > 跨同一表单的多个实例管理同一数据集类的多个实例的最佳方法是什么?

问题描述

为冗长的问题道歉 - 我对基础知识有经验,但这是第一次使用数据集和数据库(以前的应用程序涉及记录、数组和文本文件)。我的问题是最佳实践之一,实现这一点的最佳方法是什么,但要回答你需要知道我想要实现的目标......

我正在构建一个应用程序,它允许电话接线员接收消息,将它们写入表单并将它们保存到数据库中。主表单包含一个网格,显示已经在数据库中的消息,我有一个“消息表单”,它是一个 VCL 表单,其中包含操作员必须记录的所有相应字段的编辑、组合和复选框,有些是强制性的,有些是可选的. 有很多小助手和自动化运行取决于用户输入,但我的问题与底层数据捕获和存储有关。

用户可以执行两种操作:

这两个操作都会导致创建和初始化表单的一个实例,在 EDIT 的情况下,然后用数据库中的相应数据填充字段。在 NEW 的情况下,加载一个空白数据集/记录 - 请继续阅读...

消息表单捕获了四组不同的信息,因此对于每组,我都在一个单独的单元中定义了一个特定的记录结构(我们称之为 Group1、Group2、Group3 和 Group4),每个单元包含不同数量/类型的元素。然后我定义了带有四个元素的第五个记录结构——每个元素都是前面定义的四个记录结构之一——这称为 TMessageDetails。

可能与其他应用程序不同,我允许用户在任何时候最多打开 6 个消息表单实例 - 每个实例都可以处于 NEW 或 EDIT 模式。唯一的限制是 EDIT 模式下的两个表单不能编辑相同的消息 - 主表单阻止了这一点。

为了管理这些表单,我有另一个记录 (TFormDetails),其中包含诸如 FormName(每个表单在创建时都被赋予一个唯一名称)、TMessageDetails 实例、FormTag 和其他一些位等元素。然后我有一个长度为 6 的 TFormDetails 数组。每次打开表单时,都会在该数组中找到一个备用“插槽”,创建一个新表单,初始化 TMessageDetails 记录(或从数据库加载到其中的数据)和一个指针给这个记录的表格。然后打开表单并将 TMessageDetails 记录中的所有数据加载到相应的控件中。指针在那里,因此当表单上的控件对记录元素进行更改时,原始记录被编辑,我不会在表单后面得到一个“本地”副本并且与原始记录不同步。

对于数据库交互,我在消息表单上有四个 FDQuery 组件(每组一个),每个都指向 SQLite DB 中的相应表(每组一个)。

加载消息时,我有一个使用 FDQuery1 从 Table1 获取一行数据的过程,然后将数据复制到该表单的相应 TMessageDetails 记录(存储在 TFormDetails 数组中)中的 Group1 记录(逐个字段) . FDQuery2、3、4 等也会发生同样的情况......

储蓄基本相同,但显然相反。

四个 FDQuery 的原因是我可以在加载后保持每个数据集打开,然后在保存时为我提供一个打开的数据集以更新并发布到数据库。复制到记录的原因主要是这样我可以在代码中的其他地方用较短的名称引用相应的字段,而且当 VCL 控件尝试更改数据集中的字段时,更改不会“粘住”(数据我尝试保存回数据库与我加载的内容相同),而在记录中它们会这样做。将记录分成组的原因是在某些地方,其中组中的数据可能需要复制到其他地方,而不是整个消息。对我来说,使用记录比使用数据集更自然。

所以我的问题是...

是我使用的;记录结构、全局 TFormsDetails 数组、指针、每个表单 4 个 FDQuery(因此打开 6 个表单意味着最多打开 24 个数据集),以及在保存/加载时在记录和数据集之间复制;实现我想要实现的目标的好方法?

或者

有没有办法可以用数据集替换记录(使从 FDQuery 复制更容易/更短?)但仍将它们存储在全局“消息表单”数组中,以便我可以跟踪它们。我是否还应该通过说一个 FDQuery 组件并重新使用它将表加载到其他全局数据集等来尝试减少 FDQuery 的实例和潜在的打开数据集的数量?

我当前的实现工作得很好,保存/加载时没有明显的滞后/挂起,我只是找不到关于什么被认为是满足我需求的最佳实践的太多信息(即打开相同表单的多个实例 - 其他示例参考到 ShowModal 并且只有一个数据集要担心)所以我不确定我是否会让自己面临内存泄漏(我理解使用指针的“危险”)、性能问题或一般的不良做法等问题。

目前使用的是 RAD 10.3 和最新版本的 SQLite。

标签: databaseformsdelphirecord

解决方案


我不知道我要说的是否是“最佳”做法,但这就是我的做法。

该表单将使用全局 FDConnection 拥有自己的 TFDQuery。当创建了多个表单实例时,每个实例都有一个 FDQuery。

您在表单中添加一个“执行”方法。该方法将创建 FDQuery,使用一个或多个查询从数据集中获取所有数据,填充表单并显示表单。Execute 方法接收参数(或表单的属性),例如主键,以便能够获取数据。如果参数为空,则表示新记录。

如果表单必须即时更新网格,则将使用一个事件。主窗体(包含网格)将安装一个事件处理程序并根据窗体给出的数据相应地更新网格。

表单完成后,它将使用主键将数据存储回数据库。


推荐阅读