【问题标题】:Indy Query Using Delphi使用 Delphi 进行 Indy 查询
【发布时间】:2021-01-28 23:50:10
【问题描述】:

我有两个 TIdTCPClient 组件(TCPClient1 和 TCPClient2)共享相同的 OnStatus 属性(见下文)。

组件由它们的Tag 属性标识。如何识别共享OnStatus事件中调用的TCPClient?

procedure TForm2.TCPClientStatus(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
begin
end;

【问题讨论】:

  • 我相信 ASender 参数会保存 TidTCPClient 实例。所以这样的事情应该有效: if TIdTCPClient(ASender).Tag = 1 then ...

标签: sockets tcp pascal indy delphi-xe


【解决方案1】:

ASender 参数指向触发事件的对象。对于TIdTCPClient,该发件人可以是任一

  • TIdTCPClient 对象本身
  • 客户端的IOHandler对象

在后一种情况下,TIdTCPClient.OnStatus 事件与IOHandler 对象挂钩仅当该对象在客户端的Connect() 方法中隐式创建当IOHandler 属性为nil 时。在这种情况下,TIdTCPClient 被设置为该新对象的Owner。另一方面,如果您在调用Connect() 之前显式将您自己的TIdIOHandler 派生组件分配给IOHandler 属性,则TIdTCPClient.OnStatus 事件将不会连接到@987654336 @ 组件自动,因此如果需要,您必须单独为该组件自己的 OnStatus 事件分配一个处理程序。

因此,在您的TIdTCPClient.OnStatus 事件处理程序中,假设正在使用一个隐式 IOHandler 对象,您可以像这样返回TIdTCPClient 对象:

procedure TForm2.TCPClientStatus(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
var
  Client: TIdTCPClient;
  IO: TIdIOHandler;
begin
  Client := nil;
  if ASender is TIdTCPClient then begin
    Client := TIdTCPClient(ASender);
  end
  else if ASender is TIdIOHandler then begin
    IO := TIdIOHandler(ASender);
    if IO.Owner is TIdTCPClient then
      Client := TIdTCPClient(IO.Owner);
  end;
  if Client <> nil then begin
    // use Client.Tag as needed...
  end;
end;

【讨论】:

  • 发件人不能是 TIdTCPClient,因为我收到了无效的类型转换错误。
【解决方案2】:

在所有事件处理程序中,在每个组件中,Sender 参数始终是触发事件的对象实例。

要掌握该对象,您可以进行简单施法或安全施法。对于您使用的TIdTCPClient 和您要检查的Tag 属性,它将变为:

TIdTCPClient(Sender).Tag

(Sender as TIdTCPClient).Tag

第二种形式更安全,因为如果出于某种原因,Sender 不是假定类型,您将在运行时收到一个异常,您可以使用 try/except 构造来管理/检测该异常。

您甚至可以在不同类型的组件之间共享相同的事件处理程序。我对 Indy 的了解不足以给出一个相关的例子,所以我将使用OnClick 事件来处理TButtonTEdit。您可以使用is 运算符来检查类型:

if Sender is TButton then
  // Do something using TButton(Sender).SomeProperty
else if Sender is TEdit then
  // Do something using TEdit(Sender).SomeProperty

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多