!!! 关于动态创建窗体导致程序不稳定的问题! 郁闷! 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 如何使得 服务端能够检测到自创建的客户端关闭时的断开事件!!!?
-------------------------------------------------------------------
解决方案 »
- fastreport问题?
- StringGrid控件如何连接按钮控件?
- on ESocketError do messagedlg('您所连接的主机不存在',mtinformation,mbok],0)
- 这个问题该如何解决!郁闷中。。。。。。
- 哪里有数字签名的工具?
- 用COM+开发高效率的分步式数据库应用程序?
- 哪里能下载delphi5的正式版,谢谢
- idtcpclient 10061异常,该如何消除弹出的错误框,如何让client自动重新尝试连接?
- tparam和tparams的联系,虚心求助
- 高分求delphi cdkey
- IDTCPClient/IDTCPServer/IDUDPClient/IDUDPServer
- 一个菜鸟,请教各位大侠!谢谢:)
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;正好就合适。我没有试过,但估计应该可以。
var
form2: TForm2;
begin
try
form2:= TForm2.Create(nil);
form2.Show;
finally
form2.Free;
end;
end;