有两个form,分别是MainForm,childForm,
在SDI方式下可以通过以下的方式对ChildForm传值(childform的public下定义有str:string的参数)
SDI:
childform:=Tchildform.create(Application);
childform.str:='ABC';
childform.ShowModal;
childform.free;
但是在MDI的方式就不行了,请问在MDI的方式如何实现form间传值的问题
MDI:
childform:=Tchildform.Create(Application);
childform.str:='ABC'

解决方案 »

  1.   

    MDI:
    childform:=Tchildform.Create(Application);
    childform.str:='ABC'
      这样做也是可以的,即使childform是一个全程变量,第一步创建窗口的时候,该变量已经指向了最新一次创建的窗口实例,以前创建的(如果有的话)实例里面的内容不会有丝毫的变化,不过你这时候已经不能再给以前的窗口实例传送参数了。  如果要想继续给以前创建的窗口传送参数,就是用保存实例的数组或者TList容器实现。
      

  2.   

    谢谢bigysw,你能说的详细些吗?
      

  3.   

    public  
       FormList:TStringList;
    .......procedure TMDIFormCreate(Owner:TObject);  //初始化FormList;
    begin
      FormList:=TStringList.Create;
    end;procedure TMDIFormClose(Owner:TObject);    //释放没有关闭的窗体;
    var
      i:integer;
    begin
      for i:=0 to FormList.Count-1 do
        TChildForm(FormList.Objects[i]).Free;
      FormList.Clear;
      FormList.Free;
    end;procedure TMDIForm.Menu1Click(Sender:TObject);//创建新窗口,并且给新的子窗口赋值
    begin
      childform:=Tchildform.Create(Application);
      childform.str:='ABC';
      FormList.AddObject(ChildForm.Str,ChildForm);
    end;function TMDIForm.FindForm(Str:String):integer;//根据变量值查找窗口,这个Str可以用另外变量的代替,因为可能不唯一,思路类似
    var
      i:integer;
    begin
      FormList.Find(Str,i);
      result:=i;
    end;procedure SetChildParam(OldStr,NewStr:String);//根据OldStr查找并且给某一个窗口赋值
    var
      i:integer;
    begin
      i:=FindForm(OldStr);
      if i>=0 then
        TChildForm(FormList.Objects[i]).Str:=NewStr;
    end;------------------------------------------------------------------------在子窗口段中, Procedure TChildFormClose(Sender:TOnject);//释放该窗口和MDI的List资源
    begin
      ca:=Free;
      MDIForm.FormList.delete(MDIForm.FindForm(Str)).
    end;