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
中,从而使其正常工作。谢谢:)