!!! 关于动态创建窗体导致程序不稳定的问题! 郁闷! 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 如何使得 服务端能够检测到自创建的客户端关闭时的断开事件!!!?
----------------------------------------------------------------------------------
以下是我的方法,但是在这些动态创建窗体关闭的时候偶尔会出错!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 如何使得 服务端能够检测到自创建的客户端关闭时的断开事件!!!?
----------------------------------------------------------------------------------
这个问题我也想知道