现在有一窗体(比如是frmTest),他是这么创建的:
ShowForm(frmTest, TfrmTest);procedure TfrmMain.ShowForm(FormName: TForm; FormClassName: TFormClass); 
begin
  FormName := FormClassName.Create(plMain); //plMain 是一个Panel,frmMain为主窗体,主窗体包含plMain。
  FormName.Parent := plMain;
  FormName.Align := alClient;
  FormName.Show;
end;在frmMain创建完frmTest之后,现在在frmTest又创建了一个ModalForm(frmModalTest)来和frmTest进行交互,或者说frmModalTest和frmTest需要互相访问一些数据。在frmTest创建frmModalTest代码如下:
  frmModalTest := TfrmModalTest.Create(nil);
  try
    frmModalTest.ShowModal;
  finally
    FreeAndNil(frmModalTest);
  end;但是问题现在出现了:无法在frmModalTest里面访问frmTest里面的数据。比如:
frmModalTest.label1.Caption:=frmTest.label1.Caption 这样就会出错。查看得知frmTest的句柄竟然是nil(0)!我已经在frmModalTest里面uses frmTest 的单元了!
请问这究竟是怎么回事?该如何访问 frmTest.label1.Caption ?谢谢!

解决方案 »

  1.   

    动态创建的当然不行,
    在 frmModalTest 里 use frmMainfrmMain 里声明 frmTest ,
      

  2.   

    客观的说,你的这段代码写的挺乱的。
    你可以把 FrmTest的句柄显式的传给frmModalTest。仅仅Uses了frmTest单元式不够的。
      

  3.   

    你改两个地方就ok了,
    1、将frmModalTest := TfrmModalTest.Create(nil);改为
    frmModalTest := TfrmModalTest.Create(self);
    2、将frmModalTest.label1.Caption:=frmTest.label1.Caption 改为
    frmModalTest.label1.Caption:=TfrmTest(self.owner).label1.Caption 建议你创建模式窗体时如果模式窗体和其他窗体有关联得话不要用create(nil),用create(self)
      

  4.   

    你的结构真是别出心裁,没有想过要这么写的,:)分析以下你这个吧,难道你认为调用了这个ShowForm后,你的frmTest就已经指向你在该过程里面创建的那个FormName了么?还是参数的传递问题!你这样过后,frmTest该是nil还是nil!
    ShowForm(frmTest, TfrmTest);procedure TfrmMain.ShowForm(FormName: TForm; FormClassName: TFormClass); 
    begin
      FormName := FormClassName.Create(plMain); //plMain 是一个Panel,frmMain为主窗体,主窗体包含plMain。
      FormName.Parent := plMain;
      FormName.Align := alClient;
      FormName.Show;
    end;
      

  5.   

    用var来传参数,就可以了。但是,还是不要这么写拉,你的窗体之间缠来绕去的,让后来人怎么维护呀?
      

  6.   

    是啊,如上面几位所说的,窗体之间避免相互调用,最好通过Public函数来进行操作
      

  7.   

    首先说一下我为什么要这么写:
    主要是想做一个类似OutLook那样的左右形的界面(就像现在CSDN论坛形式),最初使用TNote做的,但是一则窗体(NoteItem)较多,二则窗体多比较类似,所以就采用再主窗体上点击OutLookBar的时候就显示相应的窗体。其他的就好说了。这个创建的窗体需要输入的数据的一部分可以通过一个类似向导的窗体来辅助完成的。因此就发生了上面的代码。一个最无奈的解决办法就是引用第三方单元(比如全局变量、public函数什么的)。或者就笨笨地遍历各个窗体,判断为需要的就使用。这可以回答一些朋友的问题了。另外对一些朋友的回答也还望这些朋友再解惑一下:To:ahyf
    在 frmModalTest 里 use frmMain,frmMain 里声明 frmTest 
    //已经这样声明过,不行的。:(To:zeroxing
    难道你认为调用了这个ShowForm后,你的frmTest就已经指向你在该过程里面创建的那个FormName了么?还是参数的传递问题!你这样过后,frmTest该是nil还是nil!
    //那应该怎么做呢?诚心求教。之所以做成一个函数是因为不想重复这些创建类似窗体的代码,而且就算不用这个函数,直接创建那也是不行的。还是不能直接引用。To:zkw
    不知Create(self)和Create(nil)有什么区别呢?
    直接写:frmModalTest := TfrmModalTest.Create(self); 是可以运行的,但是如果写成一个函数则不能编译:
    ShowModalForm(frmModalTest, TfrmModalTest);
    procedure ShowModalForm(FormName: TForm;FormClassName: TFormClass);
    begin
      FormName := FormClassName.Create(Self); //不能编译,说Self未定义。:(
      try
        FormName.ShowModal;
      finally
        FreeAndNil(FormName);
      end;
    end;
      

  8.   

    procedure ShowModalForm(FormName: TForm;FormClassName: TFormClass);
    begin
      FormName := FormClassName.Create(Self); //不能编译,说Self未定义。:(
      try
        FormName.ShowModal;
      finally
        FreeAndNil(FormName);
      end;
    end;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    你对Self的含义完全没理解,你的这个函数不是类的成员,自然没办法在函数里面用Self.
      

  9.   

    ShowForm(frmTest, TfrmTest);procedure TfrmMain.ShowForm(FormName: TForm; FormClassName: TFormClass); 修改成
    procedure TfrmMain.ShowForm(var FormName: TForm; FormClassName: TFormClass); 
      

  10.   

    what ???  他写了些啥东西啊////