0

我想向 中添加一个数据指针,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 ?

4

1 回答 1

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将此单元添加到's unit INTERFACE/USES list中的最后一个位置,瞧!服务器现在 - 对 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;   
于 2013-07-19T23:36:25.977 回答