在实际应用中遇到窗体继承问题,困扰已久,故在此处发贴,希望能有高手帮助解决!工程中有两个基类窗体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继承来的吗,怎么会这样,请高手帮忙指点一下并能给出解决方法
例如有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继承来的吗,怎么会这样,请高手帮忙指点一下并能给出解决方法
解决方案 »
- delphi系统托盘显示问题
- 我现在有一些tif图像文件,这些文件是我自己写的程序扫描出来的,现在要实现的是,双击这些tif文件,可以打开我的扫描程序浏览这些图片,请问该如何实现?
- delphi7 如何打开文件夹显示上次的文件路径
- 关于制作补丁软件的问题
- VBScript和DELPHI结合中的超级难题,脚本中调用一个执行时间很长的函数如何避免锁定系统.
- [我是菜鸟] 高手帮忙优化一下,谢谢!
- Image显示两个图片的问题?
- ADO的记录插入问题?请大家帮忙!在线等待!!!
- UpdateSQL控件到底是干嘛的!怎么用?
- 类问题
- 昨天搞了台电脑,不知怎么样连接功放和电视。。要买什么线吗?
- 求一种思想?谢谢!
public
class procedure ShowEditForm(FormClass:TFrmBaseEdit;sState:String); virtual;
end;
--------------------------------
这句话看了半天才明白,以前没见人这么用过
是不是这个意思:
FormClass:=TFrmBaseEdit.create(self);
Form:=FormClass;
-----------------
FormClass:TFrmBaseEdit有这一句就肯定了FrmEdit1是TFrmBaseEdit的一个对象阿,怎么会显示不是同一类那,你有is判断的马???
你的意思是让form继承自TfrmEdit1??
那么就这么写吧
form:=TfrmEdit1.create(self);
如果已经存在了,那么你form:=(FrmEdit1 as TFrmBaseEdit);就可以使
form等同于frmEdit1了...
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');
我的目的是只想在frmgrid1或frmgrid2中调用父类的ShowEditForm这个过程,然后根据frmgrid1或frmgrid2来分别显示出frmedit1或frmedit2。我试过在frmgrid1里写ShowEditForm((frmedit1 as frmbaseedit),'sinsert');但报内存错误。你有QQ吗,我的QQ是19028056,希望能和你即时沟通!
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');
2:在你的调用窗体的Button中设定tag值 = <1>的数组下标
3:在基类定写代,调用数据下标指定的窗体