• 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API

困扰已久的窗体继承问题!(100分送人)

boyjason 2005-03-24 10:59:22
在实际应用中遇到窗体继承问题,困扰已久,故在此处发贴,希望能有高手帮助解决!

工程中有两个基类窗体BaseGrid和BaseEdit,分别是一个表格窗体和一个编辑窗体,而且表格窗体与编辑窗体是存在调用和被调用的关系,即在表格窗体上点新增或是修改按钮,会把编辑窗体显示出来进行操作,因为其他窗体基本上都是从这两个窗体继承而来且基本功能相同,故想偷偷懒,只在基类中写事件代码,但又不知该如何写。以下是我的部分代码及说明!
例如有4个继承窗体分别为FrmGrid1,FrmGrid2,FrmEdit1,FrmEdit2

在BaseGrid里写了一个过程,

procedure TFrmBaseGrid.ShowEditForm(FormClass:TFrmBaseEdit;sState:String);
var
Form:TFrmBaseEdit;
begin
Form:=FormClass.Create(application);
with Form do
begin
ActiveDs.DataSet:=QueryGrid;
if sState='sInsert' then
ActiveDs.DataSet.Append
else
ActiveDs.DataSet.Edit;
ShowModal;
end;
end;


然后分别在FrmGrid1,FrmGrid2中调用ShowEditForm(FrmEdit1,'sInsert');ShowEditForm(FrmEdit2,'sInsert');但调用时显示FrmEdit1和TFrmBaseEdit不是同一类,FrmEdit1不是从TFrmBaseEdit继承来的吗,怎么会这样,请高手帮忙指点一下并能给出解决方法




...全文
166 点赞 收藏 12
写回复
12 条回复
aiirii 2005年03月24日
class function TConsoleAdapter.SetChildForm(ParentControl: TWinControl;
var ChildForm: TForm; ChildClass: string): boolean;
var
FormClass: TFormClass;
begin
if not Assigned(ChildForm) then
begin
FormClass := TFormClass(GetClass(ChildClass));
if Assigned(FormClass) then
ChildForm := FormClass.Create(ParentControl);
end;

ChildForm.Visible := False;
ChildForm.BorderStyle := bsNone;
ChildForm.SetBounds(0, 0, ParentControl.Width, ParentControl.Height);

Windows.SetParent(ChildForm.Handle, ParentControl.Handle);
ChildForm.Visible := True;


TConsoleAdapter.SetConsoleEnabled(True);

或者你的代碼修改如下:
wEditForm(TFrmBaseEdit(TFrmEdit1),'sInsert');

Result := True;
end;

TConsoleAdapter.SetChildForm(PanelMenu, TForm(_FormMenu), 'T_FormMenu');


回复 点赞
何鲁青 2005年03月24日
你的frmEdit1和frmEdit2是动态生成的,还是编译的时候就存在了?
如果已经存在了,那么你form:=(FrmEdit1 as TFrmBaseEdit);就可以使
form等同于frmEdit1了...
回复 点赞
boyjason 2005年03月24日
我的意思是form应该是TFrmBaseEdit这个窗体的继承类窗体,如Frmedit1,Frmedit2。
回复 点赞
何鲁青 2005年03月24日
既然你的frmEdit1、frmEdit2
你的意思是让form继承自TfrmEdit1??
那么就这么写吧
form:=TfrmEdit1.create(self);
回复 点赞
boyjason 2005年03月24日
回楼上的,我的Formclass是一个参数,因为调用这个过程时,要传递参数进来,例如是FrmGrid1调用的话就是ShowEditForm(FrmEdit1,'sInsert');这时formclass就是frmedit1这个窗体,如果是frmgrid2调用的话就是ShowEditForm(FrmEdit2,'sInsert');这时formclass就是frmedit2这个窗体
回复 点赞
何鲁青 2005年03月24日
Form:=FormClass.Create(application);
--------------------------------
这句话看了半天才明白,以前没见人这么用过
是不是这个意思:
FormClass:=TFrmBaseEdit.create(self);
Form:=FormClass;
-----------------
FormClass:TFrmBaseEdit有这一句就肯定了FrmEdit1是TFrmBaseEdit的一个对象阿,怎么会显示不是同一类那,你有is判断的马???
回复 点赞
largewang 2005年03月24日
TFrmBaseGrid = class
public
class procedure ShowEditForm(FormClass:TFrmBaseEdit;sState:String); virtual;
end;
回复 点赞
何鲁青 2005年03月24日
让人看得头昏眼花的...
回复 点赞
supervisors 2005年03月24日
mark
回复 点赞
BES 2005年03月24日
1:定义一个数组指向要被调用的TForm (数据类型为TFormClass)
2:在你的调用窗体的Button中设定tag值 = <1>的数组下标
3:在基类定写代,调用数据下标指定的窗体
回复 点赞
boyjason 2005年03月24日
谢谢楼上各位兄弟,我已经解决了,代码如下:
procedure TFrmBaseGrid.ShowEditForm(FormClass:TFormclass;sState:String);
var
Form:TForm;
begin
Form:=FormClass.Create(self);
with FrmBaseEdit(Form) do
begin
ActiveDs.DataSet:=QueryGrid;
if sState='sInsert' then
ActiveDs.DataSet.Append
else
ActiveDs.DataSet.Edit;
ShowModal;
end;
end;

调用过程如下ShowEditForm(frmedit1,'sinsert');
回复 点赞
boyjason 2005年03月24日
frmedit1和frmedit2,frmgrid1和frmgrid2都是在编译时就已经存在的窗体。
我的目的是只想在frmgrid1或frmgrid2中调用父类的ShowEditForm这个过程,然后根据frmgrid1或frmgrid2来分别显示出frmedit1或frmedit2。

我试过在frmgrid1里写ShowEditForm((frmedit1 as frmbaseedit),'sinsert');但报内存错误。

你有QQ吗,我的QQ是19028056,希望能和你即时沟通!
回复 点赞
发动态
发帖子
Delphi
创建于2007-08-02

1469

社区成员

26.2w+

社区内容

Delphi 开发及应用
社区公告
暂无公告