Einzelnen Beitrag anzeigen

Benutzerbild von TERWI
TERWI

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

idUDPServer - Fehler bei Definition von OnUdpRead

  Alt 11. Feb 2016, 13:57
Weil unter Netzwerke irgendwie keine Lösung kommt, poste ich das hier in dieser Abteilung noch mal, weil es auch nicht unbedingt Netzwerktypisch ist
Zur Info vorweg: Delphi 7 mit Indy 10_5339 unter XP.

Zum testen von WebServices hatte ich mir zunächst eine einfache Form gebastelt, auf der ich u.a. je eine TIdIPMCastClient-, TIdIPMCastServer- TIdUDPServer- und eine TTimer-Komponente gepackt habe.
Die jeweiligen Ereignisprozeduren wurden jeweils mit Doppelklick im Objektinspektor erzeugt.

Nach kleinen anfänglichen Problemchen lief das Tool bereits nach kurzer Zeit recht ordentlich und da ich dazu eigentlich keine Form brauche, wollte ich die Funktionen zur Wiederverwendung in eine Klasse packen.
Also eine Klasse angelegt und Stück für Stück die einzelnen Komponenten eingetragen und proceduren übertragen.
So weit so gut - lässt sich problemlos kompilieren. Der Timer timed, die Multicast-Komp castet auch fleißig rein und raus ...

Nur der UDP-Server macht nachhaltig Zicken ! Beim zuweisen der Ereignissprozedur erscheint der Fehler:
"Incompatible types: Parameter lists differ"
Wieso das denn ? ich habe nichts an der Prozedurdeklaration geändert ! Der Rest tuts doch auch ...

Nach einiger Sucherei im Netz fand ich Tips, dass der Compiler ggf. den Typ TidBytes nicht versteht und man statt dessen ein array of byte nehmen sollte.
Das war es aber auch nicht.

Weitere Sucherei brachte mich auf diese Seite, wo exakt mein Prob beschrieben wurde:
http://www.delphigroups.info/2/11/215650.html
Ich habe diese "Krücke" mit TMethod mal ausprobiert - das sieht dann hier allerdings so aus
Delphi-Quellcode:
  // TWSDiscovery ist der Klassen-Name
  udpSrv_Send := TIdUDPServer.Create(nil);
  FMethod.Data := udpSrv_Send; // !!!!
  FMethod.Code := @TWSDiscovery.onUPDSrvRead; // !!!!
  with udpSrv_Send do begin
    Active := false;
    OnUDPRead := TUDPReadEvent(FMethod); // !!!!
// OnUDPRead := onUPDSrvRead; // FUNKTIONIERT NICHT
    Bindings.DefaultPort := FRcvPort + 1;
    DefaultPort := FRcvPort + 1;
    BufferSize := 8192;
    ThreadedEvent := true;
    BroadcastEnabled := true;
    Active := True;
  end;
Dieses "Konstrukt" lässt sich nun zumindest fehlerfrei kompilieren.
Ich habe das zunächst der Einfachheit halber in der Art "gemonitort", als das ich die Unit meiner Hauptform unter IMPLEMENTATION mit USES eingetragen habe, um somit schnell und einfach was in ein MEMO zu schreiben.
Siehe folgender Code mit Hinweis "-> 1)"
Delphi-Quellcode:
// interface
// uses {allerlei}
// ...
// type TWSDiscovery = Class ....
// ...
// var WSD : TWSDiscovery;
// ...
procedure TWSDiscovery.onUPDSrvRead(AThread : TIdUDPListenerThread;
                                    AData : TidBytes; ABinding : TIdSocketHandle);
begin
  Form1.Memo1.Lines.Add(BytesToString(AData)); // -> 1) DAS FUNKTIONIERT
  Add2Memo(BytesToString(AData)); // -> 2) DAS FUNKTIONIERT NICHT
  wsd.Add2Memo(BytesToString(AData)); // -> 3) DAS FUNKTIONIERT AUCH
end;
Wäre ja nun alles prima, gäbe es da nicht immer dieses leidige ABER....
Damit das ganze vielseitig bleibt, habe ich eine CallBack-Funktion [TWSDiscovery.Add2Memo(s : string)] zum rufenden Programm eingebaut. Das funzt tadellos bei MCast und dem Timer - nur beim UDP-Server eben nicht.
Gemeint ist hier "-> 2).
Es tut sich gar nichts - keine Ahnung wo die Daten hin verschwinden.

Irgendwann habe ich dann einfach mal wie bei "-> 3)" wsd. davorgeschrieben .... das geht dann wieder.
Das erweckt hier den Eindruck, das der UDP-Server und seine OnRead-Prozedur gar nicht zur Klasse gehört - ist aber definitv darin deklariert und instanziert.

Kann das bitte mal jemand erklären - und noch besser: lösen !?

Geändert von TERWI (11. Feb 2016 um 18:53 Uhr)
  Mit Zitat antworten Zitat