使用数据模块,把所有的数据控件都放在数据模块里面,是否就等于创建了一些全局变量?如果不同的form同时使用这些数据控件,那岂不是会相互影响?也违背了模块化的原则。小弟是初学者,请各位高手指点迷津,谢谢。

解决方案 »

  1.   

    数据模块实际上也是一个窗体类,你可以这样考虑:
    对于静态数据控件(也就是在程序中只能用到一个实例的对象),放在数据模块内,而对于需要多个实例的控件则最好不要放在数据模块内。
    另外,因为一旦数据模块类实例建立,那么他所包含的所有Component都要实例化,所以会比较占用系统资源。
    最后一点,也是前提,要看你做的程序是多层的应用服务器,还是简单的C/S结构程序。
      

  2.   

    如果你的程序有可能并行运行,最好不要这样用,如果不是并行,如所有FORM都SHOWMODAL,可以考虑
      

  3.   

    使用数据模块,把所有的数据控件都放在数据模块里面,是否就等于创建了一些全局变量?
    >>>>数据模块也是一个单元,不是全局的,你需要在使用他的每个单元中use。如果不同的form同时使用这些数据控件,那岂不是会相互影响?也违背了模块化的原则。
    >>>>你可以用一些可以公用的东西,互相影响有时候我们也需要这样做,不过用的时候确实要注意。
      

  4.   

    在我问这个问题之前,我也看过有关数据模块的帖子,感觉似乎数据模块的使用似乎是没有什么限制,而且对编程有莫大的好处。现在才明白,实际上数据模块的使用还是有条件的。
         1。在程序有可能并行的情况下,如果数据模块的创建是静态创建,则使用数据模块要比较小心,因为,各窗体之间可能共用了一个数据集,有可能会造成各窗体相互影响。在这种情况下,最好是使用动态创建数据模块,这样才不会相互影响。
         2。如果是动态创建数据模块,创建一个数据模块实例,则它所包含的components都会实例化,即使可能很多components都没有用到。
         不知道我的理解是否正确?
      

  5.   

    我刚才试过,即使我注释了datamodule的自动生成,然后在每个form都动态生成datamodule,如果同时打开两个form,他们之间的数据都会互相影响,这是为什么?我觉得不应该这样的啊,虽然每个form用同一个datamodule,但它们用的是不同的实例,为什么会相互影响呢?
      

  6.   

    我的意思是这样的:
    我有两个form和一个datamodule///////////////////////form1////////////////////////////////////
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids,Unit2,unit3;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        tdm1:TDataModule2 ;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
          tdm1:=TDataModule2.create(forms.application);
          with tdm1.ADOQuery1 do
          begin
                    sql.Clear;
                    sql.Text:='select * from table1';
                    open;
          end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
            form3:=TForm3.Create(forms.Application );
            form3.Show;
    end;end.
    ///////////////////////////////////////////////////////////////
    //////////////////////////form2/////////////////////////////////unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids,unit2;type
      TForm3 = class(TForm)
        DBGrid1: TDBGrid;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        tdm2:TDataModule2;
      public
        { Public declarations }
      end;var
      Form3: TForm3;implementation{$R *.dfm}procedure TForm3.FormCreate(Sender: TObject);
    begin
            tdm2:=TDataModule2.Create(forms.Application );
            with tdm2.ADOQuery1 do
            begin
                    sql.Clear;
                    sql.Text:='select * from table2';
                    open;
            end;
    end;end.
    ///////////////////////////////////////////////////////
    ///////////////datamodule///////////////////////////////unit Unit2;interfaceuses
      SysUtils, Classes, DB, ADODB;type
      TDataModule2 = class(TDataModule)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DataModule2: TDataModule2;implementation{$R *.dfm}end.
    /////////////////////////////////////////////////////
    当我点击form1的button1的时候,弹出form2,按照我的理解,form1和form2分别生成了各自的datamodule实例,应该是互不影响的,即,form1的dbgrid显示table1的数据,form2的dbgrid显示table2的数据,但实际上,form1和form2的dbgrid所显示出来的数据都是表table1的数据,不知道这种情况是合理的还是我什么地方做错了?
      

  7.   

    我的意思是这样的:
    我有两个form和一个datamodule///////////////////////form1////////////////////////////////////
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids,Unit2,unit3;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        tdm1:TDataModule2 ;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
          tdm1:=TDataModule2.create(forms.application);
          with tdm1.ADOQuery1 do
          begin
                    sql.Clear;
                    sql.Text:='select * from table1';
                    open;
          end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
            form3:=TForm3.Create(forms.Application );
            form3.Show;
    end;end.
    ///////////////////////////////////////////////////////////////
    //////////////////////////form2/////////////////////////////////unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids,unit2;type
      TForm3 = class(TForm)
        DBGrid1: TDBGrid;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        tdm2:TDataModule2;
      public
        { Public declarations }
      end;var
      Form3: TForm3;implementation{$R *.dfm}procedure TForm3.FormCreate(Sender: TObject);
    begin
            tdm2:=TDataModule2.Create(forms.Application );
            with tdm2.ADOQuery1 do
            begin
                    sql.Clear;
                    sql.Text:='select * from table2';
                    open;
            end;
    end;end.
    ///////////////////////////////////////////////////////
    ///////////////datamodule///////////////////////////////unit Unit2;interfaceuses
      SysUtils, Classes, DB, ADODB;type
      TDataModule2 = class(TDataModule)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DataModule2: TDataModule2;implementation{$R *.dfm}end.
    /////////////////////////////////////////////////////
    当我点击form1的button1的时候,弹出form2,按照我的理解,form1和form2分别生成了各自的datamodule实例,应该是互不影响的,即,form1的dbgrid显示table1的数据,form2的dbgrid显示table2的数据,但实际上,form1和form2的dbgrid所显示出来的数据都是表table1的数据,不知道这种情况是合理的还是我什么地方做错了?
      

  8.   

    使用有问题!
    每个窗体的 DBGrid 控件的 DataSource 属性也要动态设置。procedure TForm1.FormCreate(Sender: TObject);
    begin
          tdm1:=TDataModule2.create(forms.application);
          with tdm1.ADOQuery1 do
          begin
                    sql.Clear;
                    sql.Text:='select * from table1';
                    open;
          end;
        DBGrid1.DataSource:=tdm1.DataSource1;
    end;procedure TForm3.FormCreate(Sender: TObject);
    begin
            tdm2:=TDataModule2.Create(forms.Application );
            with tdm2.ADOQuery1 do
            begin
                    sql.Clear;
                    sql.Text:='select * from table2';
                    open;
            end;
    DBGrid1.DataSource:=tdm2.DataSource1;
    end;