在Mdi编程下主窗体如何"通用"调用子窗体的函数/过程? 做一个Mdi应用,每个打开的子窗体都固定有个save/add等过程,主窗体有个保存的toolbar按钮,点击该按钮希望能调用当前活动状态的子窗体的save/add等过程,因为活动子窗体可能对应不同的form,不知如何解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己定义个Tmdibasefrm之后你新建的子窗体全部设置为继承自Tmdibasefrm(默认是继承自TForm) 你新建一个form,属性设置为fsMDIChild.然后随便取个名字,比如mdichildfrm.然后你可以得到一个Tmdichildfrm的类. 为这个类分别写个add/save方法,申明为虚函数(virtual)以后你再新建其他fsMDIChild的form时,设置form继承自Tmdichildfrm而不是Tform.再写对应的add/save方法,用override重写父类同名虚方法然后调用的时候就 Tmdichildfrm.add/Tmdichildfrm.save 就可以了具体的要靠你自己理解了. 如果MDIChildFrm是固定的话,是可以的,但是MDIChildFrm是动态的情况下,只调用的是当前活动的MDIChildFrm中的函数/过程 比方说你的子窗体类名为:TYourMdiChildForm你就可以这样:if ActiveMDIChild is TYourMdiChildForm thenbegin TYourMdiChildForm(ActiveMDIChild).Save(); TYourMdiChildForm(ActiveMDIChild).Add(); .....end;ActiveMDIChild表是当前的激活的子窗体 一样的啊你申明个 tempfrm:TTmdichildfrm;哪个窗体是活动的你就 tempfrm:=activefrm;(activefrm是你找到的当前活动的mdichildfrm)然后tempfrm.add/tempfrm.save 楼主第一,你得学会在Delphi下使用继承窗体先创建一个基类窗体,假设叫BaseFrom,在这个窗体里面加上虚(virtual)方法Save()等。然后File-New-Other-Project1(你的工程的名字)-BaseFrom点OK。再然后override那些Save()什么的方法,干你该干的事。第二,你得学会使用多态type TBaseForm = class public procedure Save; virtual; end; TMyForm1 = class(TBaseForm) public procedure Save; override; end; TMyForm2 = class(TBaseForm) public procedure Save; override; end; var frmArry: array[0..1] of TBaseForm;如上所示,假如你有frmArry[0] := TMyForm1.Create(nil);frmArry[1] := TMyForm2.Create(nil);虽然frmArry[0]和frmArry[1]里面存的都是TBaseForm类型,但是你调用frmArry[0].Save执行的是TMyForm1重写的那个Save方法而frmArry[1].Save执行的是TMyForm2重写的那个Save方法 虽然有点广告之嫌,但建议楼主到我的Blog中去看看http://blog.csdn.net/flexitime/archive/2008/02/11/2088103.aspx,你这个其实是与一个MDI框架有关的问题,你如果能看懂我Blog中的文章的话,那么才有可能做到你想要的效果 在Delphi中使用SQL语句对数据库进行模糊查询的问题,请教高手。 讨论:大家说说当前软件开发中最热门的技术是什么? 服务器端与客户端问题 有没有仅仅播放而不编辑PowerPoint文件的控件? 串口通信的头疼问题 要怎样得到图片的‘创建时间’和‘最后被修改的时间’呢??????? 如何让程序在运行期也能像设计时一样使form上的控件可选取,移动,改变大小?up有分! query1.CanModify:= true;???? 如何实现ascii码与二进制码之间的转化?有函数吗? borland出delphi6了 如何让窗口保持激活状态 关于子查询
以后你再新建其他fsMDIChild的form时,设置form继承自Tmdichildfrm而不是Tform.再写对应的add/save方法,用override重写父类同名虚方法
然后调用的时候就 Tmdichildfrm.add/Tmdichildfrm.save 就可以了具体的要靠你自己理解了.
你就可以这样:
if ActiveMDIChild is TYourMdiChildForm then
begin
TYourMdiChildForm(ActiveMDIChild).Save();
TYourMdiChildForm(ActiveMDIChild).Add();
.....
end;
ActiveMDIChild表是当前的激活的子窗体
哪个窗体是活动的你就 tempfrm:=activefrm;(activefrm是你找到的当前活动的mdichildfrm)
然后tempfrm.add/tempfrm.save
第一,你得学会在Delphi下使用继承窗体
先创建一个基类窗体,假设叫BaseFrom,在这个窗体里面加上虚(virtual)方法Save()等。
然后File-New-Other-Project1(你的工程的名字)-BaseFrom点OK。
再然后override那些Save()什么的方法,干你该干的事。
第二,你得学会使用多态
type
TBaseForm = class
public
procedure Save; virtual;
end; TMyForm1 = class(TBaseForm)
public
procedure Save; override;
end; TMyForm2 = class(TBaseForm)
public
procedure Save; override;
end;
var frmArry: array[0..1] of TBaseForm;如上所示,假如你有
frmArry[0] := TMyForm1.Create(nil);
frmArry[1] := TMyForm2.Create(nil);
虽然frmArry[0]和frmArry[1]里面存的都是TBaseForm类型,但是你调用
frmArry[0].Save执行的是TMyForm1重写的那个Save方法
而frmArry[1].Save执行的是TMyForm2重写的那个Save方法
,你这个其实是与一个MDI框架有关的问题,你如果能看懂我Blog中的文章的话,那么才有可能做到你想要的效果