做一个Mdi应用,每个打开的子窗体都固定有个save/add等过程,主窗体有个保存的toolbar按钮,点击该按钮希望能调用当前活动状态的子窗体的save/add等过程,因为活动子窗体可能对应不同的form,不知如何解决?  

解决方案 »

  1.   

    自己定义个Tmdibasefrm之后你新建的子窗体全部设置为继承自Tmdibasefrm(默认是继承自TForm)
      

  2.   

    你新建一个form,属性设置为fsMDIChild.然后随便取个名字,比如mdichildfrm.然后你可以得到一个Tmdichildfrm的类. 为这个类分别写个add/save方法,申明为虚函数(virtual)
    以后你再新建其他fsMDIChild的form时,设置form继承自Tmdichildfrm而不是Tform.再写对应的add/save方法,用override重写父类同名虚方法
    然后调用的时候就 Tmdichildfrm.add/Tmdichildfrm.save 就可以了具体的要靠你自己理解了.
      

  3.   

    如果MDIChildFrm是固定的话,是可以的,但是MDIChildFrm是动态的情况下,只调用的是当前活动的MDIChildFrm中的函数/过程
      

  4.   

    比方说你的子窗体类名为:TYourMdiChildForm
    你就可以这样:
    if ActiveMDIChild is TYourMdiChildForm then
    begin
      TYourMdiChildForm(ActiveMDIChild).Save();
      TYourMdiChildForm(ActiveMDIChild).Add();
      .....
    end;
    ActiveMDIChild表是当前的激活的子窗体
      

  5.   

    一样的啊你申明个 tempfrm:TTmdichildfrm;
    哪个窗体是活动的你就 tempfrm:=activefrm;(activefrm是你找到的当前活动的mdichildfrm)
    然后tempfrm.add/tempfrm.save
      

  6.   

    楼主
    第一,你得学会在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方法
      

  7.   

    虽然有点广告之嫌,但建议楼主到我的Blog中去看看http://blog.csdn.net/flexitime/archive/2008/02/11/2088103.aspx
    ,你这个其实是与一个MDI框架有关的问题,你如果能看懂我Blog中的文章的话,那么才有可能做到你想要的效果