AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke UDP Broadcast: Fehler bei OnUDPRead

UDP Broadcast: Fehler bei OnUDPRead

Ein Thema von Gargamel · begonnen am 22. Okt 2012 · letzter Beitrag vom 17. Feb 2016
Antwort Antwort
Seite 1 von 2  1 2   
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#1

UDP Broadcast: Fehler bei OnUDPRead

  Alt 22. Okt 2012, 11:50
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;
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 22. Okt 2012, 12:26
versuch mal

procedure UDPServerRead(AThread: TIdUDPListenerThread; AData: TArray<Byte>; ABinding: TIdSocketHandle);
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#3

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 22. Okt 2012, 12:32
Geht ebenfalls nicht. Es erscheint die gleiche Fehlermeldung.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 22. Okt 2012, 12:48
Sorry, ich bin falsch abgebogen:

 procedure UDPServerRead(AThread: TIdUDPListenerThread; AData: TArray<Byte>; ABinding: TIdSocketHandle);
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#5

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 22. Okt 2012, 12:58
Schreibe ich statt AData: TArray<Byte>; einfach nur AData: array of byte, meckert der Compiler nicht mehr.
Allerdings funktioniert dann BytesToString(aData,nil) nicht.
  Mit Zitat antworten Zitat
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#6

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 22. Okt 2012, 15:13
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];
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 9. Feb 2016, 21:14
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 10. Feb 2016, 06:43
Hallo,
mach mal ein Minimal-Beispiel.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 10. Feb 2016, 11:06
Im Prinzip das gleiche wie von Gargamel in Posting #1.
Code:
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;
Eigentlich (!?) hab ich schon ne Lösung gefunden - siehe Link im Code bei Create.
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 ....

Geändert von TERWI (10. Feb 2016 um 12:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#10

AW: UDP Broadcast: Fehler bei OnUDPRead

  Alt 10. Feb 2016, 11:14
Zitat:
// doesnt't work !!!
Was sagt der Compiler? Ich wette da steht der Grund.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz