!!! 关于动态创建窗体导致程序不稳定的问题! 郁闷! QQ里面可以动态的创建N个聊天对话框不知道它是怎么实现的? 
以下是我的方法,但是在这些动态创建窗体关闭的时候偶尔会出错!var form2:Tform2procedure TForm1.BtConnetClick(Sender: TObject);
begin
// Application.CreateForm(TForm2, Form2);
  Form2 := TForm2.Create(nil);  //self  Application nil
  with Form2 do
  try
    Caption := '正在连接远程主机' + ip + '......';
    DoConnect(ip, 8888); 
   {======>Tform2中的一个连接服务端的方法;Tform2中有个clientsocket组件}
  finally
  end;
end;我第一次分析: 以为是服务端正在发送文件的时候,客户端突然断开而引起的错误-----------------------------------------------------------------------
后来出现: 当这些自创建的窗体关闭时,
              服务端检测不到客户端的断开事件!!!?
--------------------------------------------------------------------
                 
经过分析:自创建窗体的close只是隐藏,并没有 Destroy;即没有从内存中卸载掉于是 我加入了下面代码
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if ClientSocket1.Active then ClientSocket1.Active := False;
  Action := Cafree; //释放窗体实例
  //Destroy;  {错误}
  //free;       {错误}
end;
procedure TForm2.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;但是   服务端还是检测不到客户端的断开事件!!!? 从而继续读写socket,引发错误.导致程序不稳定.
请教:
------------------------------------------------------------------
1 我的这个创建方法对吗? 要实现QQ的效果应该如何创建?2 如何使得 服务端能够检测到自创建的客户端关闭时的断开事件!!!?
-------------------------------------------------------------------

解决方案 »

  1.   

    我觉得应该在Tform1中这样写:
     try
       Form2 := TForm2.Create(nil);  //self  Application nil
      w  th Form2 do
       try
        Caption := '正在连接远程主机' + ip + '......';
        DoConnect(ip, 8888); 
       {======>Tform2中的一个连接服务端的方法;Tform2中有个clientsocket组件}
      finally
      end;
    // 这部分是我加的
     finally
      form2.free;
     end。
    你再form2中出错的原因是对象本身不能调用自己的free事件,应该在它的宿主窗体来调用,而try ..finally.. end;正好就合适。我没有试过,但估计应该可以。
      

  2.   

    你这样的话,form2刚刚一显示,就被你free了,看都看不到
      

  3.   

    你的form2被释放的话,最好使用的是 cafree,和nil一起
      

  4.   

    可以用局部变量,不要放在全局。这样每次都是自己的,而且会free调。
    var
      form2: TForm2;
    begin
      try
        form2:= TForm2.Create(nil);
        form2.Show;
      finally
        form2.Free;
      end;
    end;