将数据指针添加到TIdTCPServer和TIdCustomTCPServer

时间:2013-07-19 19:53:51

标签: delphi indy indy10 delphi-xe4

我想向TIdTCPServer添加一个数据指针,我想在TIdCustomTCPServer中添加它。我不擅长压倒等等,所以这就是我到目前为止所做的:

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?

1 个答案:

答案 0 :(得分:1)

http://www.indyproject.org/docsite/html/!!MEMBEROVERVIEW_TIdTCPServer.html中没有Data属性 - 您确定您的代码是否已编译并有效?

好吧,如果有这样的属性,那么只需将变量强制转换。

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.

将此单位添加到TForm1的单位INTERFACE / USES列表中的最后位置,瞧!服务器现在是 - IDE不可见 - 替换为您的子类,它具有新的Data字段,因此上面的类型转换可以使用这个新的但有意识的同名类型。

当然,如果您愿意,您可以全力以赴:为新类添加您自己的名称,创建新的运行时和设计时包,然后添加然后将新服务器安装到IDE VCL Palette并替换所有你的表格。另一个“正确的”解决方案是分支INDY源,将DATA变量添加到非常香草的TIdCustomTCPServer类型,然后继续维护你自己的分支INDY。

更保守的方法是创建TDictionary< TIdCustomTCPServer,Integer >类型的全局变量 - http://docwiki.embarcadero.com/CodeExamples/XE4/en/Generics_Collections_TDictionary_(Delphi)

然后会变成这样:

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;