void __fastcall TForm2::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  Form1->Close();
}

解决方案 »

  1.   

    if Form2.modalresult = mrok then
       form1.close;
      

  2.   

    unit1unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
        form2.ShowModal;
    end;
    end.
    unit2:unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementationuses unit1      ;
    {$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
    begin
            form2.Close;
            form1.Close;
    end;end.
      

  3.   

    没反应,对了,我的FORM2是在FORM1的ONACTIVATE事件中用SHOWMODAL显示的
      

  4.   

    关键是在unit2中uses unit1      ;之后就可以用: form1.Close;
      

  5.   

    请大家看清,我的FORM2是在FORM1的ONACTIVATE事件中用SHOWMODAL显示的 
      

  6.   

    Unit1.pas
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
        procedure FormActivate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.DFM}procedure TForm1.FormActivate(Sender: TObject);
    begin
      Form2.ShowModal;
    end;end.Unit2.pas
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementationuses Unit1;{$R *.DFM}procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Form1.Close;
    end;procedure TForm2.Button1Click(Sender: TObject);
    begin
      Close;
    end;end.
      

  7.   

    大家误解了,如果程序中只有两个窗口,方法是可行的,但我的FORM1本身也是其它窗口通过按下一个BUTTON来SHOWMODAL的。
      

  8.   

    if Form2.ModalResult=mrCancel then
      form1.close;
      

  9.   

    在FORM1的ONACTIVATE事件中
    form2:=Tform2.Create(self);
    showmodal(form2);
    freeandnil(form2);
    self.close;
    我在网吧没法测试,记得以前也遇到过类似问题,不记得当初是放在OnActivate事件不是放在OnShow事件中了,反正好像有一个不行。另外,最好不要把上述代码放在Onactivate事件或OnShow事件中,你可以放在OnCreate事件中!
      

  10.   

    delphi5.0 测试通过unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
      uses Unit2;
    {$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    var
      fm:TForm2;
    begin
      fm:=TForm2.Create(Application);
      fm.ShowModal;
      fm.Free;
      close;
    end;end.
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.DFM}procedure TForm2.Button1Click(Sender: TObject);
    begin
      close;
    end;end.
      

  11.   

    procedure TForm2.Button1Click(Sender: TObject);
    begin
      ModalResult:=mrCancel;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fm:TForm2;
    begin
      fm:=TForm2.Create(Application);
      if fm.ShowModal=mrCancel then
        close;
    end;
      

  12.   

    弟兄们,两个窗体是可以实现,但我的FORM1本身也是在别的窗体中通过SHOWMODAL调用的
      

  13.   

    而且我的FORM2窗体是在FORM1的OnActivate事件中调用的,并不是通过FORM1中的某个BUTTON实现的。(但很奇怪,代码放在BUTTON事件中便成功)
      

  14.   

    当然了,OnActivate事件之后还有其他的事件,所以你无法成功。
    你必须换一种程序的思路,不要放到 OnActivate之中或者,你这样:
    将代码放到一个button中(先别管他),然后在OnActivate中调用button的代码如何?
      

  15.   


    在执行ONACTIVATE事件时,modalform的消息循环还没有开始,
    所以在此时执行close,它的效果等于让modalresult=mrcancel,
    而modalform的消息循环开始前它会设置modalresult=0,也就使你前面的close白做了。showmodal源码摘要:
    function TCustomForm.ShowModal: Integer;
    var
      ...
      ...
    begin
      ...
      ...
      try
        Show;
        try
          SendMessage(Handle, CM_ACTIVATE, 0, 0);///这里会执行OnActivate事件,close时ModalResult:=...;
          ModalResult := 0;//清空了ModalResult
          repeat
            Application.HandleMessage;
            if Application.FTerminate then ModalResult := mrCancel else
              if ModalResult <> 0 then CloseModal;
          until ModalResult <> 0;
          Result := ModalResult;
          SendMessage(Handle, CM_DEACTIVATE, 0, 0);
          if GetActiveWindow <> Handle then ActiveWindow := 0;
        finally
          Hide;
        end;
      finally
        ....
        ....
      end;
    end;
    如果一定要在showmodal的form的OnActivate事件内close这个form,可以这样做。(见unit2)//******************* Unit1 form1 *********************
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses
      unit2;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
      form2.ShowModal;
    end;end.
    //******************* Unit2  form2 *********************
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;const
      WM_CLOSEMODAL = WM_USER + 100;type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure FormActivate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        procedure WmCloseModal(var Message:TMessage);message WM_CLOSEMODAL;
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementationuses
      Unit3;{$R *.DFM}procedure TForm2.WmCloseModal(var Message: TMessage);
    begin
      close;//在自定义消息中close
    end;procedure TForm2.FormActivate(Sender: TObject);
    begin
      if mrok = Form3.ShowModal then
        PostMessage(Handle,WM_CLOSEMODAL,0,0);//发一个自定义的消息,一定要用PostMessageend;procedure TForm2.Button1Click(Sender: TObject);
    begin
      close;
    end;end.//******************* Unit3 form3 *********************
    unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm3 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form3: TForm3;implementation{$R *.DFM}procedure TForm3.Button1Click(Sender: TObject);
    begin
      close;
      ModalResult := mrok;
    end;end.