【发布时间】:2015-06-24 21:58:58
【问题描述】:
我在一个单独的数据模块中卸载了所有 ADO 引擎,因此一个模块可以被多个应用程序引用。我所有的应用程序基本上只需要两个 worker 方法来访问数据:
AdoQuery 以TADODataSet 的形式提供结果集。AdoExecute 执行简单的更新/删除查询,但不获取任何结果。
这是类结构:
type
TMyDataModule = class(TDataModule)
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
procedure pvtAdoConnect;
procedure pvtAdoExecute(const sql: string);
function pvtAdoQuery(const sql: string): TADODataSet;
public
AdoConnection: TADOConnection;
end;
然后我向类方法添加了两个公开的包装器。我用它来避免调用中的长类引用:
function AdoQuery(const sql: string): TADODataSet;
procedure AdoExecute(const sql: string);
implementation
function AdoQuery(const sql: string): TADODataSet;
begin
Result := MyDataModule.pvtAdoQuery(sql);
end;
上面是我在所有表单中调用的 worker 函数。
AdoConnect 在DataModuleCreate 事件中只运行一次。 TDatModule 派生自 TPersistent,它允许在整个运行时保持单个连接实例。
到目前为止,唯一让我烦恼的是一个无用的 .DFM,我根本不需要它。
有什么办法可以摆脱它吗?
【问题讨论】:
-
停止使用数据模块,只使用一个普通的类,在运行时创建所有组件(或者更好的是,一个实现接口的类,该接口将被注入到您的应用程序类中)。数据模块的主要(也是唯一?)目的是在设计时分离(非可视)组件。如果你连这个都不用,就没有理由拥有数据模块。
-
没有设计时间元素,数据模块的意义何在?
-
关于祖先,可以只是
class。不要被TPersistent类的名称所迷惑。这不是它听起来的样子。它的祖先,class(TObject)(或简称为class)实例保持持久(存在直到你销毁它们)。 -
@Sertac,您将丢失一个数据模块。这就是我觉得OP即将做的事情。我将很快从我的最后几个应用程序中停止使用它们(我可以没有实时绑定,而不是谈论丑陋的数据感知控件)。
-
@InterfaceUnknown 您应该使用单例模式。您可以按需创建类,也可以在使用初始化部分创建单元时创建类,然后使用终结部分将其销毁。可能最简单的方法是查看
Vcl.Printers。有一个TPrinter类和一个方法function Printer: TPrinter;返回单个 TPrinter 实例。该对象在完成部分的单元末尾被释放。任何想要获得打印机的人只需调用Printer函数。如果你在线程中使用这个类,那么你需要做更多的工作。
标签: delphi datamodule dfm