我在论坛里找了好久,没有找到确切解答,只好烦请大家关注啦!窗体form1,form2 点击form1上的按钮打开form2。form1,form2二者循环调用。当form1在程序执行时自动创建时,通过form2可以控制和修改form1的属性。但当form1、form2均为动态创建时,调试时就会出现“raised exception class ……”这样的错误?由于初学,不知具体原因,请大家不吝赐教,先谢!
 

解决方案 »

  1.   

    循环调用时候可以创建后不要重复创建...要调的时候直接show出来
      

  2.   

    感谢回复。但我的问题是:当form1作主窗口或自动创建时,在form1中点击按钮打开form2(动态创建),在form2中可以调用form1全局变量并可控制其组件属性。若在主窗口mainform中打开form1(动态创建),再在form1中打开form2(动态创建),这时,在form2中仅能调用form1中的全局变量,而不同控制form1中组件的属性,否则运行出错!简单示意:
    form1(作为主窗口或程序运行时自动创建)<-->form2  循环调用正常
    mainform1->form1(动态创建)<-->form2(动态创建) 循环调用会出问题!
      

  3.   

    最好不要这样进行循环调用,这是很坏的软件结构。可以在Form2中申明一个事件,当Form1初始化from2时注册这个事件。然后form2在需要的时候触发事件,让form1的响应函数中进行相应的操作。事件类型可以用系统定义的如TNotifyEvent也可以自己定义,其实就是一个回调函数,如:
    TEventHanler = procedure(sender: TObject; e: TEventArgs) of object; // (TEventArgs 也是自己定义的)--------
    以下是代码示例//Form2:private
      FMyEvent: TEventHandler;
    public
      property MyEvent: TEventHanler read FMyEvent write FMyEvent;
    ...// Form1
      form2 := TForm2.Create(self);
      form2.MyEvent = MyProc;
      form2.Show;
    ...procedure Form1.MyProc(sender: tobject; e: TEventArgs)
    begin
      ... 做你的操作……
    end;
      

  4.   

    你是不是这样?:procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;procedure TForm2.FormDestroy(Sender: TObject);
    begin
      Form2:=nil;
    end;我猜你访问的全局变量应该是属于Form2所在单元的.
    你需要贴出你创建的代码,访问的代码还有释放的代码.这样才知道错在哪里?
      

  5.   

    1、这个问题可以通过引用单元写在不同的位置避免,如果在申明部分都用不到对方,那么把引用单元写在implementation的uses里面,这样不会有循环调用的问题可以一个写在implementation上面的那个uses里,一个写在implementation下面的uses里,这样也不会有循环调用的问题2、如果两个都必须写在implementation上面的那个uses里,那只能换一种方法调用了,比如你可以在unit1里引用unit2,unit2不引用unit1,然后把unit1里的一些变量和控件之类的当做参数传递到unit2里