Dokumentation zu: handle_event(S)

HR Image


FUNKTION
        varargs void handle_event(mixed info)

ARGUMENTE
        info - Beliebiger Wert != 0 (optional).

BESCHREIBUNG
        Markiert den aktuell laufenden Event als 'gehandelt'. Moeglich ist
        dies natuerlich nur, wenn gerade ein Event laeuft, handle_event()
        also im gleiche Backend-Cycle abgearbeitet wird, wie der Event. Es 
        macht daher nur Sinn, handle_event() auszufuehren, wenn das Objekt
        als Lauscher angemeldet ist, und gerade einen Event mitgeteilt
        bekommt.

        Normalerweise ist das 'handlen' den Systemhandlern vorbehalten. Das
        'Handeln' von Systemevents ist NICHT erlaubt! Bei privaten Events
        ist dies nicht nur erlaubt, sondern sogar notwendig. *grins*

        'info' muss nicht gesetzt werden. Wird es gesetzt, wird es im Event-
        Daten-Mapping in Key E_HANDLED gespeichert. Der Handler wird automa-
        tisch immer in Key E_HANDLER des Mappings gespeichert.

BEACHTE
        Ein Event muss nicht als gehandelt markiert werden. Die meisten
        System-Events testen jedoch den Erfolg des Events mittels des
        E_HANDLED und/oder E_HANDLER. Es ist auf jeden Fall ein guter
        Stil als Handler den Event als 'gehandelt' zu markieren...

        System-Handler sind meist als globale Lauscher angemeldet und
        in /global/handlers/* zu finden.

        ES IST NICHT ERLAUBT, NACH handle_event() WEITERE AKTIONEN AUS-
        ZUFUEHREN! D.h. wenn man handle_event() aufgerufen hat, darf
        man KEINE WEITEREN AKTIONEN mehr ausfuehren, die dazu fuehren
        koennten, dass ein weiterer Event erzeugt wird. Am besten ist das
        handle_event() also am Ende der Funktion unmittelbar vor return.
        Wer das nicht macht, muss sich nicht wundern, wenn der Event nicht
        korrekt als gehandelt markiert wird! Der Event-Daemon markiert den
        Event naemlich nicht sofort, sondern erst, wenn die Funktion ein
        return macht. Sendet man aber nach handle_event() einen neuen 
        Event werden die internen Variablen des Event-Daemons dadurch neu
        initialisiert und das Handeln wird nicht ausgefuehrt. Also: Immer
        erst alles erledigen, was zu tun ist, neue Events senden, etc und
        erst dann (ganz am Ende) den Event als gehandelt markieren!!!

        ES IST NICHT ERLAUBT, EINEN BEREITS GEHANDELTEN EVENT EIN WEITERES
        MAL ZU HANDLEN! (bei System-Events)

BEISPIEL
        Der System Move-Handler lauscht als Handler auf ET_GO:

        void create() {
          if(clonep()) { destruct(this_object()); return; }
          listen_event(ET_GO, EPRIO_DEF_HANDLE, #'receive_event);
          set_global_listener(ET_GO, 1);
        }

        void receive_event(mapping data, string type, int prio) {
          // wenn schon gehandelt, dann nichts machen!
          if(data[E_HANDLED]) return;
          //
          // .. ein Handler muss tun, was ein Handler tun muss ;-)
          //
          handle_event();
        }

        Der Go-Event wird gehandelt und der Event markiert.

SIEHE AUCH
        listen_event(S), unlisten_event(S), set_global_listener(S),
        send_event(S), cancel_event(S), events(WL), event_senders(WL),
        event_prioritaeten(WL), event_types(WL)


Start » Magierhandbuch » Docu » Sfun » Handle_event Letzte Generierung: 01.05.2021, 16:59
Valid HTML 4.01!