请高手再出招,在榨尽Create Form的最后一滴血! ( 积分: 30 )

  • 主题发起人 主题发起人 www.ynxbs.com
  • 开始时间 开始时间
W

www.ynxbs.com

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TMainFrm.N1Click(Sender: TObject);
var Frm:TForm;
begin
Frm := tFrmModifyPwd.Create(nil);
Frm.ShowModal;
Frm.Free;
Frm := nil;
end;
上面是我天天在写的代码,我又把它修改成:

TFormClass=class of TForm;
procedure TDM.CreateForm(aTClass: TFormClass);
var Instance:TFormClass;
begin
Instance:= TFormClass(aTClass.Create(nil));
TForm(Instance).ShowModal;
TForm(Instance).Free;
TForm(Instance):=nil;
end;
委托数据模块顺带提供方法(挑水带洗菜),现在,就可以
procedure TMainFrm.N1Click(Sender: TObject);
begin
DM.CreateForm(tFrmModifyPwd);
end;
真清爽啊,清爽;但问题也来了,不是全部类都调用父类的Create方法,例如下面:
TStorageInfoFrm_Bom = class(TForm)
Panel2: TPanel;
btnSave: TBitBtn;
BitBtn2: TBitBtn;
Panel1: TPanel;
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Label5: TLabel;
m: TADODataSet;
Edit3: TEdit;
Edit4: TEdit;
procedure Button4Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
MyData: TMyData;
GradeGroupID: integer;
function CheckData: boolean;
public
{ Public declarations }
constructor Create(AOwner: TComponent; lMyData: TMyData); overload;
//重载Form的Create构造函数。
end;

现在我该如何改造procedure TDM.CreateForm(aTClass: TFormClass)方法?建造时,要调用重载Form的Create方法,因为还要传另外参数!
达到目的:
DM.CreateForm(TStorageInfoFrm_Bom ,aMyData);
帮帮我!
 
方法一:overload TDM.CreateForm方法,可能有多少种类型就overload多少个
方法二:为所有的form overload 一个constructor Create(AOwner: TComponent; lMyData: pointer);lMyData为无类型指针,不同的form自己解释如何使用lMyData指针,任何form都调用这个create来构造,在这个create中调用默认的constructor Create(AOwner: TComponent);,相当于constructor Create(AOwner: TComponent; lMyData: pointer)为入口,由他决定怎么创建,但这样,TDM.CreateForm(aTClass: TFormClass)还是要改造,因为对于不同的form,lMyData的解释也不同,TDM.CreateForm就要负责为不同的form提供不同的lMyData结构。
 
关注。 学习中……
 
你还学习!别学了。。。
 
to dirk:真是一流好手啊
procedure CreateForm(aTClass: TFormClass); overload;
procedure CreateForm(aTClass: TFormClass; lPrivilage: string); overload;
procedure CreateForm(aInstance: TForm); overload;
procedure CreateForm(aInstance: TForm; lPrivilage: string); overload;

现在,我的代码太神气了:
dm.CreateForm(TStorageInfoFrm_Bom.Create(nil, mydata));
 
还可以带权限效验,牛b了
dm.CreateForm(TCarAccident_Frm, '车辆事故登记' );
 
领教了什么是牛人!
 
呵呵,这种情况我一般是让所有窗体从一个自定义窗体继承,告诉他们一个“呼叫中心”,
需要什么信息、什么参数自己查询,包括窗体样式等,都可以从这个查询的接口中获取,
如果愿意,还可以动态生成窗体。每一个窗体的Create自己知道该干什么,这样
TDM.CreateForm(aTClass: TFormClass)就不用改造了,呵呵
 
后退
顶部