我从VC转换过来一段代码,一个消息和消息相应的操作。
首先注册消息,然后调用一函数可以进入消息相应操作,要结束消息相应时也是调用
一个函数。问题就在这,我如果在程序退出前,即在onclose操作前执行了结束消息相应
的函数则一切正常,但如果在onclose中执行这个函数则报内存地址错误。这个结束函数也会先相应消息,进入一次消息处理操作中的。但VC中就没这个现象。好奇怪!有谁帮帮忙。谢谢了

解决方案 »

  1.   

    你在OnCloseQuery里注销消息就是了
    我遇到过的情况和你类似,
    我原先以为form在销毁时,肯定是先把它所有的子控件以及以它为owner的类都释放掉
    但是实际情况好象并不是这样的
    我以前做过一个VCL,如果拖到窗体上,程序退出时就会出错
    只好在VCL里,知道它的parentform,然后在它的onclosequery里把我的vcl先释放掉,才解决
      

  2.   

    楼上,在OnCloseQuery也是没用的,我试过。
    附简易代码
    const
      REAM_STREAM = WM_USER + 600;
    在formCreatez 中注册消息
      RegisterStreamNotify(Form1.Handle, REAM_STREAM); //注册消息
    进入消息循环StartStream;
    退出Stopstream;
    就是这个Stopstream函数如果在close之前调用则无错,但如果在onclose中执行则报错。
    VC中则没有此现象
      

  3.   

    To : xzgyb(老达摩) :
    const
      REAM_STREAM = WM_USER + 600;
    procedure TFrmMain.FormCreate(Sender: TObject);
    begin
      RegisterStreamNotifyMessage(Handle, REAM_STREAM);
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      StartStreamCapture;
    end;
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      StopStreamCapture;//在此执行正确,如象以下方式执行则报错
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      StopStreamCapture;//报错
    end;
    但VC中则是在 OnClose中执行的StopStreamCapture,没有错误。百思不得其解。
    附:转换Delphi前的VC库
    int  RegisterStreamNotifyMessage(HWND hWnd,UINT nMessageID);
    int  StartStreamCapture;
    int  StopStreamCapture;
      

  4.   

    Delphi响应WM_CLOSE消息的代码就是Close
    procedure TCustomForm.Close;
    var
      CloseAction: TCloseAction;
    begin
      if fsModal in FFormState then
        ModalResult := mrCancel
      else
        if CloseQuery then
        begin
          if FormStyle = fsMDIChild then
            if biMinimize in BorderIcons then
              CloseAction := caMinimize else
              CloseAction := caNone
          else
            CloseAction := caHide;
          DoClose(CloseAction);
          if CloseAction <> caNone then
            if Application.MainForm = Self then Application.Terminate
            else if CloseAction = caHide then Hide
            else if CloseAction = caMinimize then WindowState := wsMinimized
            else Release;
        end;
    end;StopStreamCapture是怎么操作的呢
      

  5.   

    To : xzgyb(老达摩) :
      StopStreamCapture执行也会跑到消息处理函数中进行文件的写操作及关闭操作。
    我该如何在OnClose中执行StopStreamCapture且不报错呢??
    各位大侠,帮帮忙,解决在另给分
      

  6.   

    想弄明白
    这个StopStreamCapture具体是个什么样的
      

  7.   

    StopStreamCapture这个函数是从动态链接库里引出调用的,具体什么样子我也不清楚了
      

  8.   

    试试:
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      StopStreamCapture;//报错
      Application.ProcessMessage;
    end;