困扰已久的窗体继承问题!(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继承来的吗,怎么会这样,请高手帮忙指点一下并能给出解决方法




...全文
203 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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,希望能和你即时沟通!

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧