在实际应用中遇到窗体继承问题,困扰已久,故在此处发贴,希望能有高手帮助解决!工程中有两个基类窗体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继承来的吗,怎么会这样,请高手帮忙指点一下并能给出解决方法

解决方案 »

  1.   

    TFrmBaseGrid = class
    public
      class procedure ShowEditForm(FormClass:TFrmBaseEdit;sState:String); virtual;
    end;
      

  2.   

    Form:=FormClass.Create(application);
    --------------------------------
    这句话看了半天才明白,以前没见人这么用过
    是不是这个意思:
    FormClass:=TFrmBaseEdit.create(self);
    Form:=FormClass;
    -----------------
    FormClass:TFrmBaseEdit有这一句就肯定了FrmEdit1是TFrmBaseEdit的一个对象阿,怎么会显示不是同一类那,你有is判断的马???
      

  3.   

    回楼上的,我的Formclass是一个参数,因为调用这个过程时,要传递参数进来,例如是FrmGrid1调用的话就是ShowEditForm(FrmEdit1,'sInsert');这时formclass就是frmedit1这个窗体,如果是frmgrid2调用的话就是ShowEditForm(FrmEdit2,'sInsert');这时formclass就是frmedit2这个窗体
      

  4.   

    既然你的frmEdit1、frmEdit2
    你的意思是让form继承自TfrmEdit1??
    那么就这么写吧
    form:=TfrmEdit1.create(self);
      

  5.   

    我的意思是form应该是TFrmBaseEdit这个窗体的继承类窗体,如Frmedit1,Frmedit2。
      

  6.   

    你的frmEdit1和frmEdit2是动态生成的,还是编译的时候就存在了?
    如果已经存在了,那么你form:=(FrmEdit1 as TFrmBaseEdit);就可以使
    form等同于frmEdit1了...
      

  7.   

    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');
      

  8.   

    frmedit1和frmedit2,frmgrid1和frmgrid2都是在编译时就已经存在的窗体。
    我的目的是只想在frmgrid1或frmgrid2中调用父类的ShowEditForm这个过程,然后根据frmgrid1或frmgrid2来分别显示出frmedit1或frmedit2。我试过在frmgrid1里写ShowEditForm((frmedit1 as frmbaseedit),'sinsert');但报内存错误。你有QQ吗,我的QQ是19028056,希望能和你即时沟通!
      

  9.   

    谢谢楼上各位兄弟,我已经解决了,代码如下:
    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');
      

  10.   

    1:定义一个数组指向要被调用的TForm (数据类型为TFormClass)
    2:在你的调用窗体的Button中设定tag值 = <1>的数组下标
    3:在基类定写代,调用数据下标指定的窗体