Sockets 用Delphi实现Indy查询
我有两个Sockets 用Delphi实现Indy查询,sockets,tcp,pascal,indy,delphi-xe,Sockets,Tcp,Pascal,Indy,Delphi Xe,我有两个TIdTCPClient组件(TCPClient1和TCPClient2),它们共享相同的OnStatus属性(见下文) 组件通过其标记属性进行标识。如何在sharedOnStatus事件中识别正在调用的TCPClient procedure TForm2.TCPClientStatus(ASender:TObject;const-status:TIdStatus; 常量(文本:字符串); 开始 结束; ASender参数指向触发事件的对象。对于TIdTCPClient,发送方可以是:
TIdTCPClient
组件(TCPClient1和TCPClient2),它们共享相同的OnStatus
属性(见下文)
组件通过其标记
属性进行标识。如何在sharedOnStatus
事件中识别正在调用的TCPClient
procedure TForm2.TCPClientStatus(ASender:TObject;const-status:TIdStatus;
常量(文本:字符串);
开始
结束;
ASender参数指向触发事件的对象。对于TIdTCPClient
,发送方可以是:
对象本身TIdTCPClient
- 客户端的
对象IOHandler
IOHandler
属性为nil
时,在客户端的Connect()
方法中隐式创建了TIdTCPClient.OnStatus
对象,才会将TIdTCPClient.OnStatus
事件连接到IOHandler
对象。在该场景中,将TIdTCPClient
设置为该新对象的Owner
。另一方面,如果在调用Connect()
之前将自己的TIdIOHandler
派生组件显式分配给IOHandler
属性,则TIdTCPClient.OnStatus
事件将不会自动连接到IOHandler
组件,因此,如果需要,您必须分别为该组件自己的OnStatus
事件分配一个处理程序
因此,在TIdTCPClient.OnStatus
事件处理程序内部,假设正在使用隐式IOHandler
对象,您可以返回到TIdTCPClient
对象,如下所示:
procedure TForm2.TCPClientStatus(ASender:TObject;const-status:TIdStatus;
常量(文本:字符串);
变量
客户:TIdTCPClient;
IO:TIdIOHandler;
开始
客户:=零;
如果ASender是TIdTCPClient,则开始
客户:=TIdTCPClient(ASender);
结束
否则,如果ASender是TIdIOHandler,则开始
IO:=TIdIOHandler(ASender);
如果IO.Owner是TIdTCPClient,则
客户:=TIdTCPClient(IO.Owner);
结束;
如果客户端为零,则开始
//根据需要使用Client.Tag。。。
结束;
结束;
在所有事件处理程序中,在每个组件中,Sender
参数始终是触发事件的对象实例
要获得该对象的手,您可以进行简单投射或安全投射。对于您使用的TIdTCPClient
和要检查的Tag
属性,它将成为:
TIdTCPClient(Sender).Tag
或
第二种形式更安全,因为如果出于任何原因,Sender
不是假定的类型,您将在运行时得到一个异常,您可以使用try/except
构造来管理/检测该异常
您甚至可以在不同类型的组件之间共享相同的事件处理程序。我对Indy了解不够,无法给出相关示例,因此我将使用OnClick
事件作为TButton
和TEdit
。您可以使用is
运算符检查类型:
if Sender is TButton then
// Do something using TButton(Sender).SomeProperty
else if Sender is TEdit then
// Do something using TEdit(Sender).SomeProperty
发件人不能是TIdTCPClient,因为我遇到了无效的类型转换错误。我相信ASender参数将保存TIdTCPClient实例。所以类似的东西应该可以工作:如果TIdTCPClient(ASender).Tag=1,那么。。。
if Sender is TButton then
// Do something using TButton(Sender).SomeProperty
else if Sender is TEdit then
// Do something using TEdit(Sender).SomeProperty