Skip to content

API Basic Events de

Codex edited this page Sep 16, 2026 · 2 revisions

Event / AddHandler / RemoveHandler / RaiseEvent

ClassicUO • Basic

Event deklariert ein Skriptereignis. AddHandler verbindet eine Sub, RemoveHandler trennt sie, und RaiseEvent ruft die Handler synchron in Anmeldereihenfolge auf.

Genaue Syntax

Event Changed(ByVal value As Integer)
Public Event Adjust(ByRef value As Integer)
Private Event Completed()
AddHandler EventName, AddressOf Handler
AddHandler Module.EventName, callback
RemoveHandler EventName, AddressOf Handler
RaiseEvent EventName(arguments)

Parameter

  • EventName / Public / Private — Ein einfacher Name auf Dateiebene (implizites Skriptmodul) oder in Module, außerhalb von Prozeduren. Standard ist Public; Private benötigt Module. Externe Anmeldung: Module.EventName. Auch ein Public-Ereignis darf nur sein deklarierendes Modul auslösen. Der Name darf keiner Prozedur oder Variablen entsprechen.
  • Handler / callback — Handler ist eine eindeutig deklarierte Sub, über AddressOf oder eine Callback-Variable/Fabrik dieses geladenen Skripts. Function, Namenszeichenfolgen, fremde Referenzen und Überladungsgruppen sind unzulässig. Anzahl, Typen und ByVal/ByRef müssen genau übereinstimmen. In Handlern ByVal ausdrücklich angeben; normale Prozeduren behalten ihren älteren ByRef-Standard.
  • arguments / ByVal / ByRef — RaiseEvent benötigt sämtliche Positionsargumente. Optional, ParamArray, Standardwerte, benannte Ereignisargumente und Safe Call werden nicht unterstützt. Ereignisparameter sind standardmäßig ByVal: Skalar oder Referenz werden kopiert, nicht der Objektinhalt. ByRef-Änderungen erreichen folgende Handler und die beschreibbare Variable bzw. das indizierte Element des Aufrufers. Argumente und Indizes werden einmal in Schreibreihenfolge ausgewertet.

Rückgabewert

Event, AddHandler, RemoveHandler und RaiseEvent liefern keinen Wert (Unit), weder Boolean noch ID oder Teilnehmerzahl. Ergebnisse über ByRef oder gemeinsamen Modulzustand übertragen. Main liefert String "ready", Integer 8 bzw. String "ABAC:handler failed".

Verhalten

  • Anmeldungen gehören einem Interpreter. Andere Skripte und erneutes Laden beginnen ohne sie. Weitere Einsprünge in denselben geladenen Interpreter behalten sie bis zum Entfernen oder Freigeben des Interpreters. Schließen der IDE lässt laufende Skripte samt Anmeldungen bestehen; es erzeugt keinen unabhängigen Ereignisdienst.
  • AddHandler hängt an; doppelte Anmeldung ruft dieselbe Sub mehrfach auf. RemoveHandler entfernt ihr letztes Vorkommen, bei fehlendem Treffer passiert nichts. Nach Prüfung von Deklaration, Zugriff und Signatur werden Argumente ausgewertet und die geordnete Handlerliste fixiert. Änderungen während eines Aufrufs gelten beim nächsten RaiseEvent.
  • Ein Handlerfehler beendet die aktuelle Folge und erreicht Catch/Finally des Aufrufers. Vorherige ByRef-Änderungen werden zurückgeschrieben. Pause und Notstopp gelten im Handler; Catch verschluckt den Notstopp nicht. Kein neuer Thread entsteht. Blockierende native Aufrufe behalten ihre Abbruchbeschränkungen.
  • Grenzen: 4096 Anmeldungen pro Ereignis, 16 verschachtelte RaiseEvent-Aufrufe, 32 Skriptprozedurrahmen. Zyklen/tiefe Rekursion erzeugen einen abfangbaren Skriptfehler statt eines Client-Stacküberlaufs. Für tiefe Verarbeitung Schleifen verwenden. Gemeinsame Skalare in Module-Feldern speichern; ältere Dateiskalare werden weiterhin als Kopien geerbt.
  • Skripteigene Ereignisse benötigen weiterhin RaiseEvent. Automatische Journal-, Ressourcen- und Verbindungsabonnements verwenden die Client-Ereignisse UO. aus Basic.GameEvents. Handles, WithEvents, Custom Event, Ereignisdelegattypen und Klassenereignisse bleiben ununterstützt.

Beispiele

1. Anmelden und abmelden

# Feed.Message überträgt text As String ByVal. Die vollständig gezeigte Feed.Publish löst es aus, Record ergänzt State.log. handler meldet Record an; "ready" wird gespeichert. RemoveHandler erkennt dieselbe Sub trotz anderer AddressOf-Zeile. "ignored" nach Abmeldung ändert nichts. Main liefert "ready".
Option Explicit On
Module Feed
    Public Event Message(ByVal text As String)
    Public Sub Publish(ByVal text As String)
        RaiseEvent Message(text)
    End Sub
End Module

Module State
    Public Dim log As String = ""
End Module

Sub Record(ByVal text As String)
    State.log = State.log & text
End Sub

Sub Main()
    Dim handler = AddressOf Record
    AddHandler Feed.Message, handler
    Feed.Publish("ready")
    RemoveHandler Feed.Message, AddressOf Record
    Feed.Publish("ignored")
    Return State.log
End Sub

Erläuterung der Parameter und Ausführung:

Feed.Message überträgt text As String ByVal. Die vollständig gezeigte Feed.Publish löst es aus, Record ergänzt State.log. handler meldet Record an; "ready" wird gespeichert. RemoveHandler erkennt dieselbe Sub trotz anderer AddressOf-Zeile. "ignored" nach Abmeldung ändert nichts. Main liefert "ready".

2. Einen Wert durch Handler verändern

# Adjust und beide Subs verwenden total As Integer ByRef. Increment macht aus 3 eine 4; DoubleValue erhält 4 und macht 8 daraus. RaiseEvent schreibt 8 nach Main zurück. Beide Handler werden entfernt. Integer 8 ist eine Menge, kein True/False; RaiseEvent liefert keinen Wert.
Option Explicit On
Event Adjust(ByRef total As Integer)

Sub Increment(ByRef total As Integer)
    total += 1
End Sub

Sub DoubleValue(ByRef total As Integer)
    total *= 2
End Sub

Sub Main()
    Dim total As Integer = 3
    AddHandler Adjust, AddressOf Increment
    AddHandler Adjust, AddressOf DoubleValue
    RaiseEvent Adjust(total)
    RemoveHandler Adjust, AddressOf Increment
    RemoveHandler Adjust, AddressOf DoubleValue
    Return total
End Sub

Erläuterung der Parameter und Ausführung:

Adjust und beide Subs verwenden total As Integer ByRef. Increment macht aus 3 eine 4; DoubleValue erhält 4 und macht 8 daraus. RaiseEvent schreibt 8 nach Main zurück. Beide Handler werden entfernt. Integer 8 ist eine Menge, kein True/False; RaiseEvent liefert keinen Wert.

3. Fehler behandeln und fortsetzen

# Ready hat keine Parameter. First ergänzt A, Failing ergänzt B und löst einen Fehler aus; Last entfällt diesmal. Catch speichert die Meldung, Finally entfernt Failing. Der nächste Aufruf ergänzt AC. Main liefert "ABAC:handler failed". Sämtliche Handler und State sind vollständig enthalten.
Option Explicit On
Event Ready()
Module State
    Public Dim log As String = ""
End Module

Sub First()
    State.log = State.log & "A"
End Sub

Sub Failing()
    State.log = State.log & "B"
    Throw "handler failed"
End Sub

Sub Last()
    State.log = State.log & "C"
End Sub

Sub Main()
    Dim message As String = ""
    AddHandler Ready, AddressOf First
    AddHandler Ready, AddressOf Failing
    AddHandler Ready, AddressOf Last
    Try
        RaiseEvent Ready()
    Catch problem
        message = problem
    Finally
        RemoveHandler Ready, AddressOf Failing
    End Try
    RaiseEvent Ready()
    Return State.log & ":" & message
End Sub

Erläuterung der Parameter und Ausführung:

Ready hat keine Parameter. First ergänzt A, Failing ergänzt B und löst einen Fehler aus; Last entfällt diesmal. Catch speichert die Meldung, Finally entfernt Failing. Der nächste Aufruf ergänzt AC. Main liefert "ABAC:handler failed". Sämtliche Handler und State sind vollständig enthalten.


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic

Clone this wiki locally