我想向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?
答案 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;