高分送出,如何制作通用窗体,给点指导意见也行,急!!!! ( 积分: 200 )

  • 主题发起人 主题发起人 zzbird
  • 开始时间 开始时间
Z

zzbird

Unregistered / Unconfirmed
GUEST, unregistred user!
通用窗体制作,例如有一个通用资料录入窗体(TForm_TongYong)这个窗体负责(员工资料,部门资料,客户资料录入),当我点击主菜单上的:员工资料时,主窗体传入一个员工表(Worker),然后
//调用资料录入通用模块

Application.CreateForm(TForm_TongYong,Form_TongYong) ;
Table_Name:='worker' // 员工表变量
//查询员工表
Adoquery.sql.add('select * from '+Table_Name);
datasource1.dataset:=Adoquery;
DBGridEh1.datasouce:=datasource1;

同理如果点击主菜单的部门资料菜单时:
Application.CreateForm(TForm_TongYong,Form_TongYong) ;
Table_Name:='bumen' // 部门表名称
//查询部门表
Adoquery.sql.add('select * from '+Table_Name);
datasource1.dataset:=Adoquery;
DBGridEh1.datasouce:=datasource1;
如果同时打开 员工资料 部门资料,等于打开TForm_TongYong 子窗体两次,只是传入了不不同变量
这样造成多次调用 TForm_TongYong 子窗体,里面的数组,adoquery,值只保存了第二次打开时的值,第一次打开的员工资料,在去录入的时候就出错了,没法通用。
我想问的是有没有什么办法 虽然TForm_TongYong 子窗体打开两次,同时打开时,员工资料和部门资料里面的值不互相干扰,类似窗体复用!希望大家多多指教!
 
说明白点,最好是贴出关键部分的代码看一下。
 
每个窗口显示的数据源,应该使用不同的.你也可以动态建立tablename
 
var f:TForm_TongYong

f := TForm_TongYong.Create(Self);
f.Table_Name:='bumen' // 部门表名称
f.Adoquery.sql.add('select * from '+Table_Name);
f.datasource1.dataset:=Adoquery;
f.DBGridEh1.datasouce:=datasource1;
f.Show;

f := TForm_TongYong.Create(Self);
f.Table_Name:='worker';
f.Adoquery.sql.add('select * from '+Table_Name);
f.datasource1.dataset:=Adoquery;
f.DBGridEh1.datasouce:=datasource1;
f.Show
 
做成模板,然后用继承的方式
 
能不能封装成窗体类呢?请大虾赐教
 
窗体继承
 
一个窗体就是一个类吧
TForm1 = class(TForm)
 
能不能提供点代码说明一下,实际上我要求的就是,一个窗体多次打开,但每次打开都不互相冲突
 
要打开一个窗体就要创建一个窗体的实例
TForm1.Create(nil)
多创建几次就有多个窗体了,互不干扰

要用一个窗体实例多次打开,好象不行的吧

这样就打开了三个一模一样的窗体
var
Form1, Form2, Form3: TForm1
begin
Form1 := TForm1.Create(Application);
Form1.Show;
Form2 := TForm1.Create(Application);
Form2.Show;
Form3 := TForm1.Create(Application);
Form3.Show;
end;
 
将共性部分做成基类,然后从其继承新窗体类。
 
直接CREATE出来就可以了 同ANiDelphi
 
继承父类窗体:
TNewForm = Class(TYourForm);
.....
 
to ANiDelphi,
这样就打开了三个一模一样的窗体
var
Form1, Form2, Form3: TForm1
begin
Form1 := TForm1.Create(Application);
Form1.Show;
Form2 := TForm1.Create(Application);
Form2.Show;
Form3 := TForm1.Create(Application);
Form3.Show;
end;

但是如果传入的表名子不一样的话,在 adoquery1.sql.add('select * from '+TableName) 这样,打开多个看到的数据不就不一样了吗,里面全是私有变量,但是我有一个变量如‘单据类型;是需要公用怎么传到别的窗体离去,如果‘单据类型’是私有的却传不出去,如何做呢
 
将表名字变成窗体的属性
property TableName: string read FTablebane write SetTableName;

procedure TfrmMorePar.SetTableName(const Value: string);
begin
FTablebane := Value;
adoquery1.sql.add('select * from '+FTablebane)
end;
/////////////
var
Form1, Form2, Form3: TForm1
begin
Form1 := TForm1.Create(nil);//不需要一定加到applition中的
try
form1.Table := '****' ;
form1.show ;
finally
form1.free;
end;
 
“听说好象把窗体封装成类或变量”?
RE: 好好理解一下什么叫类,什么是对象!TForm是类,TFrom1 = class(TForm) 他不是类?
TForm是对Windows窗体的进行封装的类,而TForm1是TForm的子类!

要实现你的需求很简单,只需在增加一个初始化函数就行了:
TTheForm = class(TForm)
private
fTableName: string;
...
public
...
procedure init(const TableName: string; ....); // 或者用属性也可以
end;

procedure TTheForm.init(const TableName: string; ....);
begin
fTableName := TableName;
// 其他一些初始化工作...
end;


在不同的地方调用:

procedure CallFunc();
var
theForm: TTheForm;
begin
Application.CreateForm(TTheForm, theForm);
theForm.init(...); // 不同的地方传入不同的初始化参数!
theForm.ShowModel();
...
theForm.Release();
end;
 
“一个窗体多次打开,但每次打开都不互相冲突”

类只是对象实例的模型,对象实例可以是多个,只要类里面没有用到其他的全局变量,不会有冲突,实例都有各自的数据内存空间。

还是建议将“类与对象”理解清楚,看清本质在写代码吧!
 
to ztf86781163,starsite 非常感谢两位的知道,并让我看到了具体实现的方法,发现自己的不足,马上送分,
能否问一下,在

将表名字变成窗体的属性
property TableName: string read FTablebane write SetTableName;
如果是数组 为什么定义时出错呢,是不是数组不能用方法定义
 
*但是如果传入的表名子不一样的话,在 adoquery1.sql.add('select * from '+TableName) 这样,打开多个看到的数据不就不一样了吗,

这不正是你想要的结果吗?(在生成窗体时,根据传入的表名字不同,看见不同的数据)

*里面全是私有变量,但是我有一个变量如‘单据类型;是需要公用怎么传到别的窗体离去,如果‘单据类型’是私有的却传不出去,如何做呢

要传出去,定义在public段里就行了
 
*但是如果传入的表名子不一样的话,在 adoquery1.sql.add('select * from '+TableName) 这样,打开多个看到的数据不就不一样了吗,

这不正是你想要的结果吗?(在生成窗体时,根据传入的表名字不同,看见不同的数据)

*里面全是私有变量,但是我有一个变量如‘单据类型;是需要公用怎么传到别的窗体离去,如果‘单据类型’是私有的却传不出去,如何做呢

要传出去,定义在public段里就行了
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部