使用代码替换非可视化组件

6
在Delphi 7中,"用代码替换非可视组件"是否是一种经过验证的优化技术,主要是针对数据库访问方面的。

1
你能提供任何推荐它的博客或其他参考资料吗?我以前从未听说过它(当然这并不意味着什么 :))。 - Blorgbeard
请查看http://delphi.about.com/od/objectpascalide/a/speedsize.htm中的第8点。 - Vinayak Mahadevan
4
顺便提一下,gexperts 是一个很棒的插件,可以将组件转换为代码。 - user219760
1
是的,在带有8MB的P-I机器上会有问题。在普通机器上我不会担心。 - Marco van de Voort
4个回答

9
你提到的网站谈论了用代码替换对话框组件,以便在不使用任何组件的情况下显示对话框。另一种选择是编写几行代码来设置和显示对话框,完全跳过组件。但这并不是速度或大小上的优化。这不是速度优化,因为你的代码实际上会像组件一样执行,而且这也不是大小优化,因为程序中一个组件占用的空间微不足道。
数据库组件不像对话框组件那样容易替换。在Delphi中,几乎所有东西都设计为使用标准数据库组件的后代。如果你不使用这些组件,则根本无法使用Delphi的数据库功能。如果你的目标真正是优化,并且没有确定组件是程序非最佳行为的源头,那我认为使用数据库库的原生API将是愚蠢的。请考虑要花多少时间和精力来在没有数据库组件的情况下重写程序。

对话框组件只是举例。如果创建的对象与组件的类相同,则 Delphi 的所有数据库功能都将可用。如果我在上述假设中有误,请纠正我。 - Vinayak Mahadevan
2
你刚才是正确的,但是有些困惑。你认为建议是手动实例化组件而不是将它们放在表单或数据模块上。对于数据库组件,这并没有什么好处。事实上,建议是根本不使用这些组件。对于数据库组件来说,这真的是一个很糟糕的想法。 - Rob Kennedy

4
我不认为基于表单的数据集/查询/表格等会比在代码中创建的更快或更慢。然而,我喜欢将它们放在代码中,因为这样更容易维护。我曾经看到过屏幕上嵌入了SQL组件的情况,然后在代码中被覆盖。那么我就必须停下来调查确定哪个SQL实际上生效。有时候表单中的SQL很好,有时候它被用了一段时间,然后被代码所取代,有时候它从未生效,SQL被在表单创建时被取代。因此,我必须确定这是按设计还是随意留下的。此外,如果SQL在.DFM而不是.PAS中,很容易在代码审查中错过SQL更改。例如,我并不总是看.DFM,因为我不关心标签标题是否更改或按钮是否移动。

因此,虽然对于原型设计来说很好,但当涉及到生产代码时,最好将所有数据库逻辑(SQL、表和字段定义)都放在.pas文件中。

更新:我最终尝试了CnPack。在众多好处中,有一款名为“将选定组件转换为代码”的杰出工具。表单设计向导| 更多... |将选定组件转换为代码。它可以为您完成所有操作。


这是我计划要做的事情。我现在正在处理的代码库是继承而来的,不是我创建的。因此,我认为将所有的 SQL 逻辑从 .dfm 文件移动到 .pas 文件中需要一些时间。 - Vinayak Mahadevan
@Vinayek - 你不会后悔的。同时,仔细检查所有表格、数据库连接器、会话等是否已设置为非活动状态。如果发现有任何一个处于活动状态,则在代码中要特别小心,确保自己打开连接。例如,您可能有一些表单因为数据库实际上位于原始作者认为的位置而“幸运”。 - Chris Thornton
谢谢你的建议。我刚开始重写代码中的数据访问部分。 - Vinayak Mahadevan

1
这不是一个组件或非组件的问题。如果涉及到数据库访问,BDE是非常慢的,所以换成其他的东西是一个很好的选择。
顺便说一下,优化不是关于“经过验证的技术”,而是关于识别问题并解决它。如果问题恰好是慢的数据库访问,那么这就是你需要改变的地方。

关于数据库访问,我使用ado对象而不是bde,因为我更熟悉ado。 - Vinayak Mahadevan

0
通常情况下不需要。使用非可视化组件并不会增加额外开销。它可以非常快速地创建,并在运行时与“在代码中创建”的组件完全以同样的速度工作。

如果非可视组件被代码替换,那么某些仅在单个过程中使用的非可视组件将在过程执行完成后从内存中删除。我主要是在谈论数据访问组件。 - Vinayak Mahadevan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接