2017-08-02 54 views
-3

我无法将OnUDPRead事件链接到IdUDPServer。如何链接OnUDPRead事件

代码如下:

uses 
    System.SysUtils, IdUDPServer, IdGlobal, IdSocketHandle, Classes; 

var 
    udp: TIdUDPServer; 
    buffer: TIdBytes; 
    myBinding: TIdSocketHandle; 

procedure UDPRead (Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); 
    var 
    bytes_received: integer; 
    begin 
    bytes_received:= AData.size; 
    end; 

begin 
    myBinding := udp.Bindings.Add; 
    myBinding.IP := '0.0.0.0'; 
    myBinding.Port := 5100; 

    udp.OnUDPRead := UDPRead; // Error occurs here 
    udp.Active := True; 
end. 

我收到错误消息:

[dcc32 Error] ACUR401_20170802_UDPServer.dpr(16): E2029 ';' expected but 'OF' found 
[dcc32 Error] ACUR401_20170802_UDPServer.dpr(28): E2009 Incompatible types: 'method pointer and regular procedure' 

我相信我的困难是,我无法将事件处理程序链接到程序。

+0

它必须是一个对象方法。你有什么是常规程序。 – Victoria

+1

您报告的错误与您提供的代码不匹配。细节很重要。看起来你试图在过程声明的最后添加'object',至少在你的代码的其他版本中。如果你不想实例化一个类的实例,只需使用一个类方法即可。 –

回答

0

您必须为OnUDPRead属性指定一个匹配的对象方法。你分配的是一个常规程序。做这样的事情:

type 
    TMyObject = class 
    public 
    procedure UDPRead(AThread: TIdUDPListenerThread; AData: TIdBytes; 
     ABinding: TIdSocketHandle); 
    end; 

{ TMyObject } 

procedure TMyObject.UDPRead(AThread: TIdUDPListenerThread; AData: TIdBytes; 
    ABinding: TIdSocketHandle); 
var 
    Received: Integer; 
begin 
    Received := Length(AData); 
    ... 
end; 

var 
    MyObject: TMyObject; 
    MyServer: TIdUDPServer; 
    MyBinding: TIdSocketHandle; 
begin 
    MyServer := TIdUDPServer.Create(nil); 
    try 
    MyBinding := MyServer.Bindings.Add; 
    MyBinding.IP := '0.0.0.0'; 
    MyBinding.Port := 5100; 

    MyObject := TMyObject.Create; 
    try 
     MyServer.OnUDPRead := MyObject.UDPRead; 
     MyServer.Active := True; 
    finally 
     MyObject.Free; 
    end; 
    finally 
    MyServer.Free; 
    end; 
end. 
+0

但更好的移动该辅助对象内的服务器对象。 – Victoria

+0

我试过你的代码。现在我得到错误“参数列表不同”。我相信这意味着过程中的参数与OnUDPRead的“结构”不同。我看过http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TUDPReadEvent.html –

+0

http://www.delphigroups.info/2/11/215650.html我似乎找到一个有类似问题的人,但我不够熟练,无法完全理解解决方案。 –