API Basic Events it - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Event / AddHandler / RemoveHandler / RaiseEvent

ClassicUO • Basic

Event dichiara un evento dello script. AddHandler collega una Sub, RemoveHandler la scollega e RaiseEvent chiama i gestori in modo sincrono nell’ordine di iscrizione.

Sintassi esatta

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)

Parametri

  • EventName / Public / Private — Dichiarare un nome semplice a livello di file (modulo implicito) o dentro Module, fuori dalle procedure. Il valore predefinito è Public; Private richiede Module. Dall’esterno iscriversi con Module.EventName. Solo il modulo che dichiara l’evento può eseguire RaiseEvent, anche se Public. Evitare conflitti con procedure o variabili.
  • Handler / callback — Handler è una Sub univoca indicata con AddressOf o una variabile/fabbrica di callback dello script caricato. Function, nomi sotto forma di stringa, riferimenti estranei e sovraccarichi non sono validi. Numero, tipi e modalità ByVal/ByRef devono corrispondere esattamente. Scrivere ByVal esplicitamente nei gestori: le procedure ordinarie mantengono il precedente valore predefinito ByRef.
  • arguments / ByVal / ByRef — RaiseEvent richiede tutti gli argomenti posizionali. Optional, ParamArray, valori predefiniti, argomenti evento denominati e Safe Call non sono supportati. Event usa ByVal se omesso: copia il valore scalare o il riferimento, non il contenuto dell’oggetto. Le modifiche ByRef passano ai gestori successivi e alla variabile o all’elemento indicizzato scrivibile del chiamante. Argomenti e indici vengono valutati una volta nell’ordine scritto.

Restituisce

Event, AddHandler, RemoveHandler e RaiseEvent non restituiscono valori (Unit): né Boolean, né ID, né numero di iscritti. Usare ByRef o lo stato condiviso di Module per ottenere un risultato. Main restituisce String "ready", Integer 8 e String "ABAC:handler failed".

Comportamento

  • Le iscrizioni appartengono a un interprete. Altri script e un nuovo caricamento partono senza iscrizioni. Ulteriori ingressi nello stesso interprete caricato le conservano fino alla rimozione o al rilascio dell’interprete. Chiudere l’IDE mantiene lo script in esecuzione, senza creare un servizio di eventi indipendente.
  • AddHandler aggiunge in coda; i duplicati ripetono la stessa Sub. RemoveHandler elimina l’ultima occorrenza; se non esiste, non cambia nulla. Il motore verifica dichiarazione, accesso e firma, valuta gli argomenti e fissa la lista ordinata. Le modifiche alle iscrizioni durante un gestore valgono dal RaiseEvent successivo.
  • Un errore interrompe i gestori rimanenti e raggiunge Catch/Finally del chiamante. Le modifiche ByRef precedenti vengono copiate indietro. Pausa e arresto di emergenza valgono nei gestori; Catch non assorbe l’arresto. Nessun nuovo thread. Le chiamate native bloccanti mantengono i propri limiti di annullamento.
  • Limiti: 4096 iscrizioni per evento, 16 RaiseEvent annidati e 32 frame di procedure. Cicli e ricorsioni profonde producono un errore intercettabile anziché esaurire lo stack del client. Usare un ciclo per elaborazioni profonde. Gli scalari condivisi vanno nei campi Module; quelli storici a livello di file restano ereditati come copie.
  • Gli eventi dichiarati dallo script richiedono ancora RaiseEvent. Le sottoscrizioni automatiche a diario, risorse e connessione usano gli eventi client UO. descritti in Basic.GameEvents. Handles, WithEvents, Custom Event, tipi delegato di eventi ed eventi di classe restano non supportati.

Esempi

1. Iscrivere e rimuovere

# Feed.Message trasporta text As String ByVal. Feed.Publish, mostrata interamente, attiva l’evento; Record aggiunge a State.log. handler iscrive Record e "ready" viene salvato. RemoveHandler riconosce la stessa Sub anche da un’altra riga AddressOf. "ignored" dopo la rimozione non aggiunge nulla. Main restituisce "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

Spiegazione dei parametri e dell’esecuzione:

Feed.Message trasporta text As String ByVal. Feed.Publish, mostrata interamente, attiva l’evento; Record aggiunge a State.log. handler iscrive Record e "ready" viene salvato. RemoveHandler riconosce la stessa Sub anche da un’altra riga AddressOf. "ignored" dopo la rimozione non aggiunge nulla. Main restituisce "ready".

2. Modificare un valore in sequenza

# Adjust ed entrambe le Sub usano total As Integer ByRef. Increment trasforma 3 in 4; DoubleValue riceve 4 e lo porta a 8. RaiseEvent ricopia 8 in Main. Le due iscrizioni vengono rimosse. Integer 8 è una quantità, non True/False; RaiseEvent non restituisce valori.
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

Spiegazione dei parametri e dell’esecuzione:

Adjust ed entrambe le Sub usano total As Integer ByRef. Increment trasforma 3 in 4; DoubleValue riceve 4 e lo porta a 8. RaiseEvent ricopia 8 in Main. Le due iscrizioni vengono rimosse. Integer 8 è una quantità, non True/False; RaiseEvent non restituisce valori.

3. Gestire un errore e ripartire

# Ready non ha parametri. First aggiunge A, Failing aggiunge B e genera un errore; Last viene saltata. Catch salva il messaggio, Finally rimuove Failing. Il prossimo evento aggiunge AC. Main restituisce "ABAC:handler failed". Tutti i gestori e State sono inclusi.
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

Spiegazione dei parametri e dell’esecuzione:

Ready non ha parametri. First aggiunge A, Failing aggiunge B e genera un errore; Last viene saltata. Catch salva il messaggio, Finally rimuove Failing. Il prossimo evento aggiunge AC. Main restituisce "ABAC:handler failed". Tutti i gestori e State sono inclusi.


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

Basic