2017-08-02 7 views
-3

Ich kann das OnUDPRead-Ereignis nicht mit IdUDPServer verknüpfen.So verknüpfen Sie das OnUDPRead-Ereignis

-Code lautet wie folgt:

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. 

ich die Fehlermeldung erhalten:

[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' 

ich meine Schwierigkeiten glauben ist, dass ich nicht in der Lage bin, die Eventhandler dem Verfahren zu verbinden.

+0

Es muss eine Objektmethode sein. Was Sie haben, ist ein regelmäßiger Vorgang. – Victoria

+1

Die Fehler, die Sie melden, stimmen nicht mit dem von Ihnen angegebenen Code überein. Details sind wichtig. Es sieht so aus, als hätten Sie versucht, '' object' 'am Ende Ihrer Prozedurdeklaration anzubringen, zumindest in einer anderen Version Ihres Codes. Wenn Sie eine Instanz einer Klasse nicht instanziieren möchten, verwenden Sie einfach eine Klassenmethode. –

Antwort

0

Sie müssen der Eigenschaft OnUDPRead eine passende Objektmethode zuweisen. Was Sie zugewiesen haben, ist ein reguläres Verfahren. Tun Sie etwas wie dieses:

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

Verschieben Sie das Serverobjekt jedoch lieber in dieses Hilfsobjekt. – Victoria

+0

Ich habe Ihren Code ausprobiert. Und jetzt bekomme ich den Fehler "Parameterlisten unterscheiden sich". Ich glaube, das bedeutet, dass die Parameter in der Prozedur sich von der "Struktur" des OnUDPRead unterscheiden. Ich habe mir http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TUDPReadEvent.html –

+0

http://www.delphigroups.info/2/11/215650.html angeschaut habe eine Person mit einem ähnlichen Problem gefunden, aber ich bin nicht geschickt genug, um vollständig zu verstehen, was die Lösung ist. –

Verwandte Themen