大家多多原谅,CB写的代码,DP的我也能看懂,现在CB版块不行了,我在这儿讨教高手....
一个MDI程序,平常挺好的,现在我做了一个测试,发现问题了。
假如我在子窗口Form_FreqMon中放一个按钮,添加代码:
//---------------------------------------------------------------------------
void __fastcall TForm_FreqMon::Btn_JKClick(TObject *Sender)
{
  
      for(int i=0;i<=100;i++)
      {
          Sleep(200);
          CGauge1->Value++;
          Application->ProcessMessages() ;
     }     
}
//---------------------------------------------------------------------------
如果点击按钮,此时趁它没有循环结束,直接关闭这个子窗体,就会报内存错误,并指到CGauge1->Value++;这一行,删除这行后,子窗口可以关掉了,但主窗体却不能关掉了。
在子窗体的OnClose事件中,我也写了Action=caFree;这条语句,怎么回事啊?如何解决?

解决方案 »

  1.   

    void __fastcall TForm_FreqMon::Btn_JKClick(TObject *Sender) 

       
          for(int i=0;i <=100;i++) 
          { 
    //定义一个记录状态的变量Boolean Closing,当窗体关闭时设置变量的状态Closing为真,这里检测到状态就退出循环 
              Sleep(200); 
              CGauge1->Value++; 
              Application->ProcessMessages() ;//窗体关了,但循环还在进行,不信你在这里打个断点
              if (Application.Terminated) or (Closing) 
                break;         
         }      

      

  2.   

    呵呵,C++不太懂,应该是这样吧?!
    void __fastcall TForm_FreqMon::Btn_JKClick(TObject *Sender)  
    {  
        
          for(int i=0;i  <=100;i++)  
          {  
    //定义一个记录状态的变量Boolean Closing,当窗体关闭时设置变量的状态Closing为真,这里检测到状态就退出循环  
              if (Application.Terminated || Closing)  
               break;          
              Sleep(200);  
              CGauge1->Value++;  
              Application->ProcessMessages() ;//窗体关了,但循环还在进行,不信你在这里打个断点 
         }       
      

  3.   


    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Gauges;type
      TForm_FreqMon = class(TForm)
        Gauge1: TGauge;
        Btn_JK: TButton;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Btn_JKClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        Closing: Boolean;
      public
        { Public declarations }
      end;var
      Form_FreqMon: TForm_FreqMon;implementation{$R *.dfm}procedure TForm_FreqMon.FormCreate(Sender: TObject);
    begin
      Closing := False;//在窗体创建时,InLoop := False;
    end;procedure TForm_FreqMon.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Closing := True;
      Action := caFree;
    end;procedure TForm_FreqMon.Btn_JKClick(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 1 to 100 do
      begin
        if Closing or Application.Terminated then
          Break;
        Sleep(200);
        Gauge1.Progress := Gauge1.Progress + 1;
        Application.ProcessMessages() ;
      end;
    end;end.delphi代码,已经测过,你再看看吧
      

  4.   

    这个注释写错了
    procedure TForm_FreqMon.FormCreate(Sender: TObject);
    begin
      Closing := False;//在窗体创建时,InLoop := False;
    end;
      

  5.   

    void __fastcall TForm_FreqMon::Btn_JKClick(TObject *Sender)  
    {  
        
          for(int i=0;i  <=100;i++)  
          {  
    //定义一个记录状态的变量Boolean Closing,当窗体关闭时设置变量的状态Closing为真,这里检测到状态就退出循环  
              Sleep(200);  
              CGauge1->Value++;  
              Application->ProcessMessages() ;//窗体关了,但循环还在进行,不信你在这里打个断点 
              if (Application.Terminated) or (Closing)  
                break;          
         }       
    }
      

  6.   

    blazingfire ,谢谢你,我试过了,怎么还报错啊????