比如说我有两个窗体form1和form2,它们都是子窗体,
form2是通过form1上的一个按钮打开的,请问当form2
关闭时如何刷新form1的数据?最好采用消息机制,
也就是说当form2关闭时返回一个消息,当form1收到这个消息后执行一些事件.

解决方案 »

  1.   

    用事件不就行了。
    form2.OnClose := form1XXXXX;
      

  2.   

    没必要吧form2.ShowModal;
    form1.xxx:= form2.xxx;
      

  3.   

    由于这两个窗体都是子窗体,用showModal不行吧。
      

  4.   

    在form2的关闭事件里写form1的事件(方法)是可以的,
    但是我想用消息机制来处理是不是会好一点呢.
      

  5.   

    建一个Data Module把相关数据放到那上面,show的时候取数据,或者findwindow/sendmessage|postmessage,不赞成采用后者
      

  6.   

    使用Data Module不存在窗体间引用,各个窗体全都引用Data Module
      

  7.   

    我的项目也用了data Module,但我form1的数据控件是clientDataset;
    我在Data Module一般是只写了一些方法返回olevariant类型。
    我的clientDataSet.data只是获取了返回的olevariant.
      

  8.   

    或者这样,两个窗体本身就不该互相调用的, 你建一个 Control单元。 窗体1 通过 Control类打开 窗体2,窗体2关闭之前也通过Control类刷新窗体1
      

  9.   

    请问我如何知道form2何时关闭?
      

  10.   

    这种方法跟用data module一样的。见11楼回复。
      

  11.   

    如果我在form2关闭时发送一个消息,问题是我如何知道form2何时关闭?
      

  12.   

    其实用月亮说的办法是我们最常用的,也最简单的了
    用消息就要自定义相关的消息,然后定义相关的事件,然后通过PostMessage等函数传递消息
      

  13.   

    窗体关闭的判断用返回参数啊!!  if (frmDepartmentShow.ShowModal = mrCancel) and (frmDepartmentShow.bFlag = False ) then
          Exit;
      

  14.   

    一个简单的刷新还用的着这么复杂么!唉!frmDepartmentShow := TfrmDepartmentShow.Create(self);  frmDepartmentShow.sMotion := sAction;
      if (frmDepartmentShow.ShowModal = mrCancel) and (frmDepartmentShow.bFlag = False ) then
          Exit;  //执行刷新代码
    我做的交易系统管理平台都是这样处理的,就是添加数据后,关闭窗体后,原才窗体刷新一下。
      

  15.   

    我的form1和form2都是MDI子窗体,不能用showModal吧.
      

  16.   

    不象相互引用,可这样:const WM_DOSOMETHING = WM_USER + 100;
    private
       procedure WMDosomething(Msg :TMessage); message WM_DOSOMETHING;procedure TForm1.Button1Click(Sender :TObject);
    begin
      TForm2.Create(Self);//此处限定Form2的Owner(拥有者)为Form1
    end;procedure TForm1.WMDosomething(Msg :TMessage);
    begin
      //Dosomething
    end;
    ----------------------------
    procedure TForm2.Close(Sender :TObject);
    begin
      SendMessage(TCustomForm(Owner).Handle, WM_DOSOMETHING, 0, 0);
    end;如此,Form2单元就不必引用Form1单元,Form1单元引用Form2单元即可,不会有交叉引用了