Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   UDP Broadcast: Fehler bei OnUDPRead (https://www.delphipraxis.net/171131-udp-broadcast-fehler-bei-onudpread.html)

Gargamel 22. Okt 2012 10:50

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;

Bummi 22. Okt 2012 11:26

AW: UDP Broadcast: Fehler bei OnUDPRead
 
versuch mal

procedure UDPServerRead(AThread: TIdUDPListenerThread; AData: TArray<Byte>; ABinding: TIdSocketHandle);

Gargamel 22. Okt 2012 11:32

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Geht ebenfalls nicht. Es erscheint die gleiche Fehlermeldung.

Bummi 22. Okt 2012 11:48

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Sorry, ich bin falsch abgebogen:

Delphi-Quellcode:
 procedure UDPServerRead(AThread: TIdUDPListenerThread; AData: TArray<Byte>; ABinding: TIdSocketHandle);

Gargamel 22. Okt 2012 11:58

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.

Gargamel 22. Okt 2012 14:13

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];

TERWI 9. Feb 2016 20:14

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.

hoika 10. Feb 2016 05:43

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Hallo,
mach mal ein Minimal-Beispiel.


Heiko

TERWI 10. Feb 2016 10:06

AW: UDP Broadcast: Fehler bei OnUDPRead
 
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 ....

himitsu 10. Feb 2016 10:14

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Zitat:

// doesnt't work !!!
Was sagt der Compiler? Ich wette da steht der Grund.

TERWI 10. Feb 2016 11:01

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Steht im Post#7

"Incompatible Types: Parameter lists differ"

himitsu 10. Feb 2016 12:04

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Man könnte jetzt natürlich einfach mal auf die Idee kommen und schaut nach, wie OnUDPRead deklariert ist. :roll:

TERWI 10. Feb 2016 12:15

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Das passt schon, wie ich es dort in dem Code geschrieben habe.
Indy 9 und 10 sind da leicht unterschiedlich ...

Noch mal zur Verinnerlichung: Ich habe den gesamten Hauptteil aus einer ganz normalen, funktionierenden Form herausgenommen und habe es einfach in eine separate Unit in eine Klasse verpackt.

In der Form geht das wie die Wutz - da hat der Compiler ja auch sogar selbst per Doppelklick die Prozedurdeklaration erstellt !
In der Klasse wird aus der ursprünglichen Dekl. plötzlich ein TUDPReadEvent und der Compiler mault endlos.
Das verstehe ich eben nicht ....

TERWI 11. Feb 2016 16:03

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Keiner eine Idee ?
Ich habs hier nochmal als neuenThread mit erwas mehr text und anderer Erkenntnis gepostet:
http://www.delphipraxis.net/188225-i...onudpread.html

TERWI 11. Feb 2016 19:16

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Problem gelöst !
Siehe hier: http://www.delphipraxis.net/1330094-post2.html

Neutral General 12. Feb 2016 11:01

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Zitat:

Zitat von TERWI (Beitrag 1330095)

Genau darauf hat dich himitsu quasi hingewiesen. Du solltest gucken wie das OnUDPRead definiert ist.
Dann hättest du gemerkt dass da ein const fehlt.

TERWI 17. Feb 2016 14:58

AW: UDP Broadcast: Fehler bei OnUDPRead
 
Die Antwort bin ich noch schuldig: ASCHE AUF MEIN HAUPT / MEA CULPA !

Dieses 'Ctrl-Click auf' war mir nicht mehr so geläufig - ich hab einfach immer mit der Maus auf die Funktion gezeigt und ... AHA - was'n das für Typ ? ... wird die IDE schon richten ...

Wo das besagte "CONST" beim kopieren von FORM nach Klasse abgeblieben ist - keine Ahnung ...
... ich hatte das bei den diversen "Beschreibungen" im WWW auch nicht wirklich wahrgenommen. (nix CONST - INDY 9 statt 10 wie so oft ?!)
UND: ... "DER", welcher es wissen müsste, hat mich mit seiner TMethod-Methoden-Krücke völlig fehlgeleitet. Wen noch ?

Nun bin ich ne Latte schlauer und sage Dank für die wirkliche wichtige Info's.
Ich hoffe, es hilft anderen unwissenden & fehlgeleiteten auch weiter !


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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