使用数据模块,把所有的数据控件都放在数据模块里面,是否就等于创建了一些全局变量?如果不同的form同时使用这些数据控件,那岂不是会相互影响?也违背了模块化的原则。小弟是初学者,请各位高手指点迷津,谢谢。
解决方案 »
- 回调函数执行6次以后,结尾的时候报访问越界错误?求解了
- 透明MEMO和readonly冲突解决请教
- 怎么编程实现打开QQ的个人设置菜单?
- 请教一个调用的问题
- dbgrid怎样显示货币类型:如 12 变成12.00, 10.5 变成10.50//谢谢好心人
- 在paradox数据库里,怎样用SQL语句限制返回的记录数(前10条记录)?
- 我想做一个远程关机的软件,大家进来帮帮我了,多谢了
- 请问在DELPHI中如何调用扫描仪
- sql server 2000 的数据库应用服务器打包的问题
- 如何使下拉式列表中的成员是一个数据库的字段的内容(保证给分)!!!
- 如何让程序等待?
- Interface高手进来讨论
对于静态数据控件(也就是在程序中只能用到一个实例的对象),放在数据模块内,而对于需要多个实例的控件则最好不要放在数据模块内。
另外,因为一旦数据模块类实例建立,那么他所包含的所有Component都要实例化,所以会比较占用系统资源。
最后一点,也是前提,要看你做的程序是多层的应用服务器,还是简单的C/S结构程序。
>>>>数据模块也是一个单元,不是全局的,你需要在使用他的每个单元中use。如果不同的form同时使用这些数据控件,那岂不是会相互影响?也违背了模块化的原则。
>>>>你可以用一些可以公用的东西,互相影响有时候我们也需要这样做,不过用的时候确实要注意。
1。在程序有可能并行的情况下,如果数据模块的创建是静态创建,则使用数据模块要比较小心,因为,各窗体之间可能共用了一个数据集,有可能会造成各窗体相互影响。在这种情况下,最好是使用动态创建数据模块,这样才不会相互影响。
2。如果是动态创建数据模块,创建一个数据模块实例,则它所包含的components都会实例化,即使可能很多components都没有用到。
不知道我的理解是否正确?
我有两个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的数据,不知道这种情况是合理的还是我什么地方做错了?
我有两个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的数据,不知道这种情况是合理的还是我什么地方做错了?
每个窗体的 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;