Delphi 添加指向TIdTCPServer和TIdCustomTCPServer的数据指针

Delphi 添加指向TIdTCPServer和TIdCustomTCPServer的数据指针,delphi,indy,indy10,delphi-xe4,Delphi,Indy,Indy10,Delphi Xe4,我想添加一个指向TIdTCPServer的数据指针,我还想在tidcustomtpserver中添加它。我不擅长覆盖,等等。因此,这就是我到目前为止的情况: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdC

我想添加一个指向
TIdTCPServer
的数据指针,我还想在
tidcustomtpserver
中添加它。我不擅长覆盖,等等。因此,这就是我到目前为止的情况:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdContext, IdBaseComponent, IdComponent,
  IdCustomTCPServer, IdTCPServer, Vcl.StdCtrls;

type
  TIdTcpServer = class(IdTcpServer.TIdTcpServer)
  public
    Data : Pointer;
end;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Button1: TButton;
    procedure IdTCPServer1Connect(AContext: TIdContext);
    procedure IdTCPServer1Disconnect(AContext: TIdContext);
    procedure IdTCPServer1Execute(AContext: TIdContext);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdTCPServer1.Data := TObject (12345); // Just a test to fill the Data Pointer;
end;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
  ParentServer  : TIdCustomTCPServer;
  MyData        : Integer;
begin
 //
 ParentServer   := TIdServerContext(AContext).Server;
 // MyData      := Integer(ParentServer.Data);
end;

procedure TForm1.IdTCPServer1Disconnect(AContext: TIdContext);
begin
 //
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
 //
end;

end.

如何将数据指针返回到任何OnConnect/OnDisconnect/etc?

中没有
数据
属性-您确定您的代码已编译并正常工作吗

好吧,如果有这样一个属性,那么只需将变量向后转换

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
  ParentServer  : TIdCustomTCPServer;
  MyData        : Integer;
begin
 //
 ParentServer   := TIdServerContext(AContext).Server;
 MyData      := Integer( (ParentServer as TIdTcpServer).Data);
end;
如果没有-那么你有两个选择。一个是子类化——在类中添加属性,第二个是添加一些外部数据存储

Unit IDWithData;
interface uses IdTCPServer;

type TIdTcpServer = class( IdTCPServer.TIdTcpServer )
      public
        var Data: Integer;
     end;
implementation
end.
将该装置添加到
t FORM1
的装置界面/使用列表的最后一个位置,瞧!服务器现在被IDE不可见的子类服务器所取代,该子类服务器具有新的
数据
字段,因此上面的类型转换将使用这个新的但故意相同的命名类型

当然,如果您愿意,您可以全力以赴:为新类添加您自己的名称,创建新的运行时和设计时包,将新服务器添加到IDE VCL调色板,然后将其安装到所有窗体上。另一个“合适的”解决方案是分叉INDY源,将数据变量添加到非常普通的
TIdCustomTCPServer
类型,然后继续维护自己的分叉INDY分支

更保守的方法是只创建一个类型为
TDictionary
-

然后它会变成这样:

procedure TForm1.Button1Click(Sender: TObject);
begin
  GlobalServerDictionary.AddOrSetValue( IdTCPServer1, 12345 ); 
end;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
  ParentServer  : TIdCustomTCPServer;
  MyData        : Integer;
begin
 ParentServer   := TIdServerContext(AContext).Server;
 MyData         := GlobalServerDictionary.Items[ ParentServer ];
end;   

中没有
数据
属性-你确定你的代码可以编译并工作吗?@Arioch“是的,它确实工作,因为我重写了类(请参见单元标题)。你发布的第二个代码/方法似乎是个好主意,但我宁愿继续重写。如何使用
TIdCustomTCPServer
?Nvm实现这一点。实际上,我不知道我可以像那样将
TIdCustomTCPServer
键入
tidcpserver
。非常感谢您的帮助和回答。@BenjaminWeiss:只有当您确定实例实际上是您要将其转换到的类型时,这种“硬”转换才是安全的。否则,你会遇到各种各样的麻烦,而这些麻烦可能不会立即浮出水面。如果您不确定,并且被传递了一个祖先类型的实例,例如
aInstance:TAncestor
,那么最好使用“软”强制转换:
(aInstance as tdescendatotancestor)
。当aInstance不是tdescendatofthancestor类型时,这将在运行时引发无效的强制转换异常。@BenjaminWeiss我的第二个选项与您的源代码不同(抱歉!似乎我昨天在深夜忽略了它!),只是因为该类被移动到了单独的pdule中,可以在许多不同的表单中重复使用。如果您只需要为一个表单使用它,那么该变量和您已经使用的变量之间没有区别。再次抱歉。@MarjanVenema+1-感谢您使用
as
命令提供的提示。答案是——不要难过。多亏了您,我将数据属性输入到
TIdTCPServer
中,从而使其正常工作。谢谢:)