2017-08-02 78 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我似乎找到一個有類似問題的人,但我不夠熟練,無法完全理解解決方案。 –