Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 用Delphi实现Indy查询_Sockets_Tcp_Pascal_Indy_Delphi Xe - Fatal编程技术网

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
属性(见下文)

组件通过其
标记
属性进行标识。如何在shared
OnStatus
事件中识别正在调用的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