Konsolen-Anwendung, VCL und dynamische Events?



  • Ich möchte das IdIRC Objekt auch in der Konsole benutzen. Das klappt auch ganz gut. Aber irgendwie bekomme ich das mit dem Ereignishandling dann nicht hin. Da ich das Objekt nur zur Laufzeit erstellen kann muss ich ja auch die Events zur Laufzeit erstellen. Aber das klappt nicht. Es scheitert an diesem Fehler:

    [C++ Error] datei.cpp(42): E2034 Cannot convert 'void (_fastcall *)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'
    

    (Wobei es sich um das OnConnected Event von IdIRC handelt)

    Zuweisen tue ich dem IdIRC Objekt das so:
    IRC->OnConnected=IdIRCConnected;

    Ich habe mir auch die FAQ Beiträge zum Thema Events angesehen, aber entweder verstehe ich sie falsch oder es ist einfach nicht das, was ich suche. Ich hoffe ihr könnt mir da helfen 😕



  • da stimmt doch etwas mit den Parametern nicht.
    gib doch mal die Funktionsdeklaration deiner funktion und der OnConnected an.
    (mal zu faul sein zum selber suchen 🙂 )

    mfg
    BigNeal



  • Hallo

    schuld sind nicht die Parameter, sondern das Schlüsselwort __closure.
    Mit den VCL-Events lassen sich nur Klassenmethoden ansprechen, keine normalen Funktionen.
    Am einfachsten dürfte es sein, wenn du für die Behandlung des IdIRC-Objekts ein weiteres Objekt mit passenden Methoden machst.

    bis bald
    akari



  • @BigNeal:

    void __fastcall IdIRC1Connected(TObject *Sender)
    {
     //Befehle
    }
    

    (In der Hoffnung, dass es doch einfacher geht :-))

    @akari: Mhh, dass hört sich gut an. Mal gucken ob ich das so hinbekomme. Danke 🙂



  • Ja 🙂 Das klappt hervorragend: Falls andere damit vielleicht auch mal Schwierigkeiten haben und falls ihr irgendwelche Fehler findet, hier was ich gemacht hab (Hab mich damit größtenteils an die Beispiele aus einer normalen Anwendung gehalten):

    class TMyClass : public TComponent
    {
    __published:	// IDE-managed Components
    private:	// User declarations
    public:		// User declarations
        __fastcall TMyClass(TComponent *AOwner);
        void __fastcall IdIRC1Connected(TObject *Sender); //Das Event
    };
    

    Die Klasse erstellen

    void __fastcall TMyClass::IdIRC1Connected(TObject *Sender)
    {
     //Befehle
    }
    
    __fastcall TMyClass::TMyClass(TComponent* Owner)
            : TComponent(Owner)
    {
    //TIdIRC erstellen und den Ereignissen die Klassenmethoden zuweisen
    //Das TIdIRC Objekt darf nicht in main erstellt werden, weil es dann
    //das Ereignis IdIRC1Connected nicht mehr "findet".
    }
    
    int main(int argc, char* argv[])
    {
    MyClass::TMyClass(Application->Owner);
    return 0;
    }
    

    Also so klappt es bei mir wunderbar...



  • Hallo

    hm... wenn du wirklich in der Konsole arbeitest, kannst du statt von TComponent auch gleich von TObject ableiten, die Zusatzeigenschaften von TComponent nützen dir in der Konsole kaum etwas.

    bis bald
    akari


Anmelden zum Antworten