OnUDPRead von IdUDPServer1



  • Hallo
    Beim implementieren des Ereignisses "OnUDPRead" von "IdUDPServer1" erhalte ich folgende Fehlermeldung:

    Fehler im Modul UDP_Main: Falsche Methodendeklaration in Klasse TForm_UDP.

    #include <vcl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "UDP_Main.h"
    #include <winsock2.h>
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "ipwcore"
    #pragma link "ipworks"
    #pragma resource "*.dfm"
    TForm_UDP *Form_UDP;
    
    __fastcall TForm_UDP::TForm_UDP(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    
    void __fastcall TForm_UDP::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, TArray<System.Byte> AData,
    		  TIdSocketHandle *ABinding)
    {
    	// was ist hier falsch?
    }
    

    Liegt der Fehler an Embacadero (6.2) oder habe ich etwas vergessen?
    Alle anderen Ereignisse lassen sich problemlos implementieren.
    Bei anderen UDP Server Componenten habe ich den gleichen Fehler bei "UDPRead"



  • Hallo

    2 Minuten Suche mit Google...

    bis bald
    akari



  • bei mir sieht die Methodendeklaration so aus:

    void __fastcall IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, _dt_Idudpserver_1 AData,TIdSocketHandle *ABinding)
    

    In der Datei IdUDPServer.hpp findest du die entsprechenden Definitionen.



  • Btw:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    

    sind ebenfalls falsch und sollten durch ihre C++ Pendants ersetzt werden.



  • Ich versuche es dann noch einmal:

    @j.halder
    Hier sehe ich, dass es auch anders geht, aber warum?

    @DocShoe
    Dann schreibe mir doch mal die C++ Pendants auf
    Bin kein Experte und deshalb frage ich hier!
    Obwohl, sind für dieses Problem wohl nicht wichtig, oder?

    @Akari
    Finde da keine Lösung! Hast du einen Link parat?

    Ich habe das Gefühl, Embarcadero macht da was falsch.
    Ich baue das gleiche Programm unter Kylix3 C++ (Linux) auf.
    Dort funktioniert es problemlos!

    Beispiele unter WIN7 und WIN8 (Embarcadero):

    void __fastcall TForm_UDP::IdUDPServer_CP800Status(TObject *ASender, const TIdStatus AStatus, const UnicodeString AStatusText)
    {
    ; // OnStatus,  funktioniert!
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm_UDP::IdUDPServer_CP800AfterBind(TObject *Sender)
    {
    ; // OnAfterBind,  funktioniert!
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm_UDP::IdUDPServer_CP800UDPException(TIdUDPListenerThread *AThread, TIdSocketHandle *ABinding,
              const UnicodeString AMessage, const TClass AExceptionClass)
    {
    ; // OnUDPExeption,  funktioniert!
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm_UDP::IdUDPServer_CP800UDPRead(TIdUDPListenerThread *AThread, TArray<System.Byte> AData,
              TIdSocketHandle *ABinding)
    {
    ; // OnUDPRead,  Fehlermeldung beim erstellen:  
    // Fehler im Modul UDP_Main: Falsche Methodendeklaration in Klasse TForm_UDP.
    }
    //---------------------------------------------------------------------------
    

    Nur dieses Ereignis "OnUDPRead" wird im Objektinspektor bei DoppelClick
    nicht eingetragen!
    Was ist an der Methodendeklaration falsch?, wird doch von Embarcadero erzeugt.



  • ich habe es gerade bei XE2 ausprobiert und bekomme die gleiche Meldung.
    Offensichtlich passt die Komponente aus der Tool-Palette nicht mit der Definition in der Headerdatei IdUDPServer.hpp zusammen.

    Die Komponente aus der Tool-Palette erzeugt diese Methode:

    void __fastcall TForm_UDP::IdUDPServer_CP800UDPRead(TIdUDPListenerThread AThread, TArray<System.Byte> AData,TIdSocketHandle *ABinding)
    

    In der Datei IdUDPServer.hpp ist es aber so definiert:

    void __fastcall IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, _dt_Idudpserver_1 AData,TIdSocketHandle *ABinding)
    

    1. Erstelle die Methode durch einen Doppelklick im Objektinspektor, so dass die Fehlermeldung erscheint.
    2. Klicke die Fehlermeldung weg und ändere in deinem Sourcecode in der Cpp- und in der Headerdatei den Parameter "TArray<System.Byte> AData" in "_dt_Idudpserver_1 AData", dann sollte es funktionieren.



  • Ich habe inzwischen das neue Embarcadero X4 als 30 Tage Testversion installiert.
    Dort funktioniert es problemlos. Muss also ein Bug im Embarcadero sein!
    @j.halder
    Vielen Dank für den Tip, werde es austesten!



  • Hallo
    Im File lässt sich alles ändern, aber...
    im Object lässt sich leider die Mehode "IdUDPServer1UDPRead" nicht eintragen.
    ICH GEBE AUF!
    trotzdem viele Dank für die Hilfe.



  • wenn es mit dem Objektinspektor nicht funktioniert, dann kannst du die Methode auch im Sourcecode zuweisen. Das habe ich in meinem Projekt auch so gemacht und das funktioniert schon seit 10 Jahren problemlos.

    1. Methode manuell erstellen:

    void __fastcall TForm_UDP::IdUDPServerOnRead(TIdUDPListenerThread *AThread, _dt_Idudpserver_1 AData,  TIdSocketHandle *ABinding)
    {
    //
    }
    

    2. Die Methode dem Ereignis OnUDPRead zuweisen:

    IdUDPServer1->OnUDPRead = IdUDPServerOnRead;
    


  • SUPER!
    so läuft es endlich.
    Vielen Dank!!!


Anmelden zum Antworten