⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datamodule.pas

📁 Delphi面向对象编程思想附书源码 好用哦!
💻 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 + -