如何共用一个idtcpclient连接?(100分)

  • 主题发起人 主题发起人 masm
  • 开始时间 开始时间
M

masm

Unregistered / Unconfirmed
GUEST, unregistred user!
设计如下一个程序:
1、登录界面
2、公告、通知等信息发布界面
3、基本信息交换界面
4、程序主体
前面3步分别用各自动态建立独立的窗口,4是主窗口。但这四步共用一个idtcpclient连接,那么,我只能在1后不释放这个登录界面窗口,只是隐藏起来,以便在以后的步骤中可以继续使用这个idtcpclient连接,这样做我觉得很傻,浪费了大量的资源,能不能在整个程序一运行就建立一个干净的idtcpclient连接以便使用,而不附带其他的冗余信息?
 
没人会?
 
不要直接把它拖到你的窗口里,动态创建那个idtcpclient,作为一个全局变量来保存
 
这个全局变量保存在什么地方?怎么调用?请用简单的代码示范一下。
 
你可以放在任何一个unit的interface里,例如:
unit xxx; // xxx你自己随便

interface
uses IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

// 加入你其它的内容

var TcpClient: TIdTCPClient;

implementation

// 加入你其它的代码

end.

第一次使用前,需要初始化:
TcpClient := TIdTcpClient.Create;
TcpClient.Host := 你要连接的地址;
TcpClient.Port := 目标端口;
如果需要,还要赋一个procedure of object给OnConnected, OnDisconnected等来处理Event
就是你要把在设计阶段的任务放到程序里,给那些成员赋值
 
谢谢!
但问题是,如何使这个Unit的代码运行起来?不会又把这个unit包含在一个Form的unit中吧,这样这个form就不能释放,否则以后的form就没法使用TcpClient了。
 
大胆的包含,不会有问题的。关键是 TIdTcpClient.Create;的时候是建立在谁的基础上
 
这样看来,这个TIdTcpClient只能依附于某一个Form中了,而这个form又不能释放,内存中又要多一大块“垃圾”了:(
能不能这样实现
在工程文件中建立一个类例如TIT,只包含TIdTcpClient,名称Id1,工程一建立首先生成这个对象,然后在各个动态生成的form中调用TIT.Id1,可否?
 
不会有问题,在你所有需要使用TcpClient的unit里使用这个单元就是了
 
你释放你的Form就是了,Form和它无关!
 
你可以放在任何一个unit的interface里,例如:
unit xxx; // xxx你自己随便

interface
uses IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

// 加入你其它的内容

var TcpClient: TIdTCPClient;

implementation

// 加入你其它的代码
end.
///////////////////////////////////

uses ...,***;
...
第一次使用前,需要初始化:
TcpClient := TIdTcpClient.Create;
TcpClient.Host := 你要连接的地址;
TcpClient.Port := 目标端口;
==========================================
你的意思就是说:在执行上述初始化的Form中,建立的TIdTcpClient连接在释放掉这个Form后还有效?那么如何释放他??
 
是的,因为这个TIdTcpClient并不在你的Form里,所以你的Form释放了它还存在,在不需要它时需要你自己去释放,只要用TcpClient.Free就可以了。
 
我验证过你的设计思路后给分!谢谢!
 
不行啊
我是这么用的:
unit nc;
interface
uses IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;
var TcpClient: TIdTCPClient;
implementation
end.
///////////////////////////////////

uses ...,nc;
...
TcpClient := TIdTcpClient.Create;//这句就出错!!!说 TIdTcpClient为定义!!!
救命啊!!!

 
高手们,帮帮忙啊!
 
我自己解决了!!
unit nc;
interface
uses IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;
var TcpClient: TIdTCPClient;
implementation
//////////////////假如初始化代码
begin
TcpClient:=TIdTCPClient.create(Nil);
//////////////////
end.
这样,
uses ...,nc;
...
TcpClient.host:='**.**.**.**';
TcpClient.port:=****;
TcpClient.Connect(300);
...
就可以啦!!
感谢乡村月光和liqianlong!
 
后退
顶部