📄 datamodule.pas
字号:
unit Datamodule;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBTables, Db,DBCtrls, dbgrids;
type
TdtmDynamicDatamod = class(TDataModule)
private
{ Private declarations }
public
datMain: tDatabase;
qryCustomer: tQuery;
qryFinancial: tQuery;
qryAddress: tQuery;
qryOrder: tQuery;
dtsCustomer: tDatasource;
dtsFinancial: tDatasource;
dtsAddress: tDatasource;
dtsOrder: tDatasource;
procedure SetUpDatamodule(const vfrmForm: Tform;
var vdtmDynamicDatamod: TdtmDynamicDatamod;
const vintCustomer: integer);
end;
var
dtmDynamicDatamod: TdtmDynamicDatamod;
implementation
{$R *.DFM}
var vintDatamoduleCount: integer;
procedure TdtmDynamicDatamod.SetUpDatamodule(const vfrmForm: Tform;
var vdtmDynamicDatamod: TdtmDynamicDatamod;
const vintCustomer: integer);
var vintLoop2: integer;
procedure CreateDataSetPair(vqryCreate: tquery;
vdtsCreate: tdatasource;
vstrSQL: string;
vintTag: integer);
var vintLoop: integer;
begin
{创建query组件}
vqryCreate.databasename := vdtmDynamicDatamod.datMain.databasename;
vqryCreate.SQL.text := vstrSQL;
vqryCreate.active := true;
{创建连接query组件的datasource组件}
vdtsCreate.dataset := vqryCreate;
{循环检查form上数据库组件的TAG fields,以便动态关联动态数据模块的datasource}
For vintLoop := 0 to vfrmForm.ComponentCount - 1 do
{检查数据库感知组件的tag属性值是否匹配当前datasource的tag属性值}
If vfrmForm.Components[vintLoop].tag = vintTag then
{检查Dbedit组件,为Dbedit组件的datasource属性动态赋值}
If vfrmForm.Components[vintLoop] is TDBEdit then
TDBedit(vfrmForm.Components[vintLoop]).datasource := vdtsCreate
else
{检查dbGrid组件,为dbGrid组件的datasource属性动态赋值}
If vfrmForm.Components[vintLoop] is tdbGrid then
tdbgrid(vfrmForm.Components[vintLoop]).datasource := vdtsCreate;
end;
{---------------SetUpDatamodule方法主程序----------------}
begin
{所有datamodules都有TDatabase实例}
vdtmDynamicDatamod.datMain:= TDatabase.create(vdtmDynamicDatamod);
{ .... database属性设置...}
vdtmDynamicDatamod.datMain.aliasname := 'DD_Test';
vdtmDynamicDatamod.datMain.name := 'datDatabase';
inc(vintDatamoduleCount);
{动态创建的多个数据模块中,要解决TDatabase命名重复的问题,以免在程序中产生冲突}
vdtmDynamicDatamod.datMain.databasename := 'Database'
+ inttostr(vintDatamoduleCount);
{所有的query组件和他们的datasource组件是根据数据库控件中的TAG属性值来创建的。
TAG值通过编码暗藏了数据库表和字段的信息}
For vintLoop2 := 0 to vfrmForm.ComponentCount - 1 do
{如果tag值为101, 创建客户查询}
If (vfrmForm.Components[vintLoop2].tag = 101) and
(vdtmDynamicDatamod.qryCustomer = nil) then
begin
vdtmDynamicDatamod.qryCustomer:= Tquery.Create(vdtmDynamicDatamod);
vdtmDynamicDatamod.dtsCustomer:= Tdatasource.Create(vdtmDynamicDatamod);
CreateDataSetPair(vdtmDynamicDatamod.qryCustomer,
vdtmDynamicDatamod.dtsCustomer,
'Select * from DD_Customer where CustomerNumber = '
+ inttostr(vintCustomer), 101);
end
else
{如果tag值为102, 创建地址查询}
If (vfrmForm.Components[vintLoop2].tag = 102) and
(vdtmDynamicDatamod.qryAddress = nil) then
begin
vdtmDynamicDatamod.qryAddress:= Tquery.Create(vdtmDynamicDatamod);
vdtmDynamicDatamod.dtsAddress:= Tdatasource.Create(vdtmDynamicDatamod);
CreateDataSetPair(vdtmDynamicDatamod.qryAddress,
vdtmDynamicDatamod.dtsAddress,
'Select * from DD_Address where CustomerNumber = '
+ inttostr(vintCustomer),102);
end
else
{如果tag值为103, 创建账户查询}
If (vfrmForm.Components[vintLoop2].tag = 103) and
(vdtmDynamicDatamod.qryFinancial = nil) then
begin
vdtmDynamicDatamod.qryFinancial:=Tquery.Create(vdtmDynamicDatamod);
vdtmDynamicDatamod.dtsFinancial:=Tdatasource.Create(vdtmDynamicDatamod);
CreateDataSetPair(vdtmDynamicDatamod.qryFinancial,
vdtmDynamicDatamod.dtsFinancial,
'Select * from DD_Financial where CustomerNumber = '
+ inttostr(vintCustomer),103);
end
else
{如果tag值为104, 创建订单查询}
If (vfrmForm.Components[vintLoop2].tag = 104) and
(vdtmDynamicDatamod.qryOrder = nil) then
begin
vdtmDynamicDatamod.qryOrder:= Tquery.Create(vdtmDynamicDatamod);
vdtmDynamicDatamod.dtsOrder:= Tdatasource.Create(vdtmDynamicDatamod);
CreateDataSetPair(vdtmDynamicDatamod.qryOrder,
vdtmDynamicDatamod.dtsOrder,
'Select * from DD_Order where CustomerNumber = '
+ inttostr(vintCustomer),104);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -