![]() |
UDP Broadcast: Fehler bei OnUDPRead
Hi
Ich habe mir eine Klasse geschrieben, um UDPBroadcast zu verwenden. Wenn ich nun dem UDPServer das OnUDPRead-Event zuweisen will, erzeugt der Compiler folgende Fehlermeldung: E2010 Inkompatible Typen: 'array of Byte' und 'System.TArray<System.Byte>' Als Hilfe hier noch die Klasse:
Delphi-Quellcode:
TUDPBroadcast = class
strict protected udpClient:TidUDPClient; udpServer:TidUDPServer; Port:integer; BroadText:string; public constructor Create(thePort:integer); destructor Destroy(); override; procedure UDPServerRead(Sender: TObject; AData: TidBytes; ABinding: TIdSocketHandle); procedure sendBroadcast(); procedure sendBroadcastEx(bc_text:string); end; constructor TUDPBroadcast.Create(thePort:integer); begin BroadText:='irgendwas'; Port:=thePort; udpClient:=TidUDPClient.Create; udpClient.Active:=false; udpClient.BroadcastEnabled:=true; udpClient.Port:=Port; udpClient.Active:=true; udpClient.ReceiveTimeout:=2000; udpServer:=TidUDPServer.Create; udpServer.Active:=false; udpServer.Name:='UDPServer1'; udpServer.DefaultPort:=Port; udpServer.OnUDPRead:=UDPServerRead; // hier meckert der Compiler udpServer.ThreadedEvent:=true; udpServer.Active:=true; end; |
AW: UDP Broadcast: Fehler bei OnUDPRead
versuch mal
procedure UDPServerRead(AThread: TIdUDPListenerThread; AData: TArray<Byte>; ABinding: TIdSocketHandle); |
AW: UDP Broadcast: Fehler bei OnUDPRead
Geht ebenfalls nicht. Es erscheint die gleiche Fehlermeldung.
|
AW: UDP Broadcast: Fehler bei OnUDPRead
Sorry, ich bin falsch abgebogen:
Delphi-Quellcode:
procedure UDPServerRead(AThread: TIdUDPListenerThread; AData: TArray<Byte>; ABinding: TIdSocketHandle);
|
AW: UDP Broadcast: Fehler bei OnUDPRead
Schreibe ich statt AData: TArray<Byte>; einfach nur AData: array of byte, meckert der Compiler nicht mehr.
Allerdings funktioniert dann BytesToString(aData,nil) nicht. |
AW: UDP Broadcast: Fehler bei OnUDPRead
Möglicherweise habe ich den Fehler gefunden. Es scheint, laut anderer User, ein Compiler-Fehler zu sein.
TidBytes = TBytes = array of byte Der Compiler scheint TidBytes wieder auf array of byte zu reduzieren. Deswegen gab es die Probleme bei OnUDPRead. Nimmt man also statt procedure UDPServerRead(Sender: TObject; AData: TidBytes; ABinding: TIdSocketHandle); diese Zeile procedure UDPServerRead(Sender: TObject; AData: array of byte; ABinding: TIdSocketHandle); meckert der Compiler nicht mehr. Allerdings will dann die Funktion BytesToString nicht mehr, da diese TidBytes verlangt. Das habe ich dann so gelöst:
Delphi-Quellcode:
var
idBytes:TidBytes; num_idBytes:integer; i:integer; num_idBytes:=length(AData); setLength(idBytes, num_idBytes); for i:=0 to num_idBytes-1 do idBytes[i]:=AData[i]; |
AW: UDP Broadcast: Fehler bei OnUDPRead
Ich muss diesen Steinzeit-Thread noch mal hoch holen....
Gleiches Prob tat sich hier auch auf. Ich auch ne Klasse nach der gleichen Art gebastelt und die Funktionszuweisung an OnUDPRead will einfach nicht. "Incompatible Types: Parameter lists differ" Also mal den Trick wie vor probiert -> Immer noch das gleiche Gemecker. Verstehe eigentlich gar nicht warum. Hatte den ganzen Code vorher in einer Form - nun in einer Klasse. In der Form wird ja auch auf Doppelklick bei OnUDPRead entsprechende procedure generiert und alles läuft prima. Bevor Fragen kommen: Delphi7 und Indy 10_5339. |
AW: UDP Broadcast: Fehler bei OnUDPRead
Hallo,
mach mal ein Minimal-Beispiel. Heiko |
AW: UDP Broadcast: Fehler bei OnUDPRead
Im Prinzip das gleiche wie von Gargamel in Posting #1.
Code:
Eigentlich (!?) hab ich schon ne Lösung gefunden - siehe Link im Code bei Create.
typ
TWSDiscovery = Class public constructor Create(); // override; destructor Destroy; override; procedure Send_PROBE(RcvPort : word); procedure Send_HELLO(); procedure Send_BYE(); procedure Send_PROBE_CHINACAM(RcvPort : word); private ... div var FMethod : TMethod; udpSrv_Lstn : TIdUDPServer; udpSrv_Send : TIdUDPServer; TimeOutTimer : TTimer; ... procedure udpSrv_LstnRead(AThread : TIdUDPListenerThread; AData : TidBytes; ABinding : TIdSocketHandle); procedure udpSrv_SendRead(AThread : TIdUDPListenerThread; AData : TidBytes; ABinding : TIdSocketHandle); procedure TimeOutTimerOnTimer(Sender: TObject); ... published property ... end; constructor TWSDiscovery.Create(); begin inherited Create; ... TimeOutTimer := TTimer.Create(nil); TimeOutTimer.Enabled := false; TimeOutTimer.Interval := 3000; TimeOutTimer.OnTimer := TimeOutTimerOnTimer; // create the "listening" server for HELLO & BYE udpSrv_Lstn := TIdUDPServer.Create; // !!! http://www.delphigroups.info/2/11/215650.html FMethod.Data := udpSrv_Send; // !!!! FMethod.Code := @TWSDiscovery.udpSrv_SendRead; // !!!! with udpSrv_Send do begin // !!!! Active := false; OnUDPRead := TUDPReadEvent(FMethod); // !!!! // OnUDPRead := udpSrv_LstnRead; // doesnt't work !!! Bindings.DefaultPort := WS_PORT_HELLOBYE; DefaultPort := 20001; BufferSize := 4096; ThreadedEvent := true; BroadcastEnabled := true; Active := True; end; // create the server for sending PROBE & listen for PROBEMATCH ... // das gleiche noch mal end; Aber A) verstehe ich die auch nicht wirklich und B) geht mir nicht in den Kopf, warum das was in/auf einer Form funktioniert und ausgerechnet "nur" bei der Zuweisung der OnRead-procedure so ein Theater macht. Compilerfehler ? Die Timer-Sache fnktioniert jedenfalls wie gewohnt. Es spielt dabei anscheinend auch keine Geige, ob ich die var- und procedure Deklarationen unter private, protected, public oder published packe. So wie es Remy Lebeau beschrirben hat und es da oben mit dem Umweg über die Zuweisung mit TMehtod steht, funktioniert es. Sehr eigenartig .... |
AW: UDP Broadcast: Fehler bei OnUDPRead
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz