API Basic Events ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Event / AddHandler / RemoveHandler / RaiseEvent
ClassicUO โข Basic
Event๋ ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ๋ฅผ ์ ์ธํฉ๋๋ค. AddHandler๋ Sub๋ฅผ ๋ฑ๋กํ๊ณ RemoveHandler๋ ํด์ ํ๋ฉฐ, RaiseEvent๋ ๋ฑ๋ก ์์๋๋ก ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋๊ธฐ ์คํํฉ๋๋ค.
์ ํํ ๊ตฌ๋ฌธ
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)
๋งค๊ฐ๋ณ์
EventName / Public / Privateโ ํ์ผ ์์ค(์์์ ์คํฌ๋ฆฝํธ ๋ชจ๋)์ด๋ Module ๋ด๋ถ์ ํ๋ก์์ ๋ฐ๊นฅ์ ๋จ์ ์ด๋ฆ์ ์ ์ธํฉ๋๋ค. ๊ธฐ๋ณธ ์ ๊ทผ์ Public์ด๋ฉฐ Private์ Module์ด ํ์ํฉ๋๋ค. ์ธ๋ถ ๋ฑ๋ก์๋ Module.EventName์ ์ฌ์ฉํฉ๋๋ค. Public ์ด๋ฒคํธ๋ ์ ์ธํ ๋ชจ๋๋ง RaiseEvent๋ก ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ํ๋ก์์ ๋ ๋ณ์์ ๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.Handler / callbackโ Handler๋ ์ ์ผํ๊ฒ ์ ์ธ๋ Sub๋ก, AddressOf ๋๋ ํ์ฌ ๋ก๋ํ ์คํฌ๋ฆฝํธ์ ์ฝ๋ฐฑ ๋ณ์/ํฉํฐ๋ฆฌ๋ก ์ ๋ฌํฉ๋๋ค. Function, ์ด๋ฆ ๋ฌธ์์ด, ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์ฐธ์กฐ, ์ค๋ฒ๋ก๋ ๊ทธ๋ฃน์ ํ์ฉ๋์ง ์์ต๋๋ค. ๋งค๊ฐ๋ณ์ ๊ฐ์ยทํ์ยทByVal/ByRef๊ฐ ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค. ์ผ๋ฐ ํ๋ก์์ ๋ ๊ธฐ์กด ๊ธฐ๋ณธ๊ฐ ByRef๋ฅผ ์ ์งํ๋ฏ๋ก ์ฒ๋ฆฌ๊ธฐ์๋ ByVal์ ๋ช ์ํ์ธ์.arguments / ByVal / ByRefโ RaiseEvent์๋ ๋ชจ๋ ์์น ์ธ์๊ฐ ํ์ํฉ๋๋ค. Optional, ParamArray, ๊ธฐ๋ณธ๊ฐ, ์ด๋ฆ ์๋ ์ด๋ฒคํธ ์ธ์, Safe Call์ ์ง์ํ์ง ์์ต๋๋ค. Event ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ ByVal์ด๋ฉฐ ์ค์นผ๋ผ๋ ์ฐธ์กฐ๋ฅผ ๋ณต์ฌํ๊ณ ๊ฐ์ฒด ๋ด์ฉ์ ๋ณต์ฌํ์ง ์์ต๋๋ค. ByRef ๋ณ๊ฒฝ์ ๋ค์ ์ฒ๋ฆฌ๊ธฐ์ ์ ๋ฌ๋๊ณ ํธ์ถ์์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ณ์๋ ์ธ๋ฑ์ค ์์์ ๋ณต์ฌ๋ฉ๋๋ค. ์ธ์์ ์ธ๋ฑ์ค๋ ์์ฑ ์์๋๋ก ํ ๋ฒ์ฉ ํ๊ฐํฉ๋๋ค.
๋ฐํ๊ฐ
Event, AddHandler, RemoveHandler, RaiseEvent๋ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค(Unit). Boolean, ID, ๊ตฌ๋ ์ ์๋ ์๋๋๋ค. ๊ฒฐ๊ณผ๋ ByRef ๋๋ Module ๊ณต์ ์ํ๋ก ์ ๋ฌํ์ธ์. ๊ฐ ์์ ์ Main์ String "ready", Integer 8, String "ABAC:handler failed"๋ฅผ ๋ฐํํฉ๋๋ค.
๋์
- ๊ตฌ๋ ์ ์ธํฐํ๋ฆฌํฐ๋ง๋ค ๋ณ๊ฐ์ ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ ๋ค์ ๋ก๋ํ ์คํฌ๋ฆฝํธ๋ ๊ตฌ๋ ์์ด ์์ํฉ๋๋ค. ๊ฐ์ ๋ก๋๋ ์ธํฐํ๋ฆฌํฐ๋ก ๋ค์ ์ง์ ํ๋ฉด ํด์ ํ๊ฑฐ๋ ์ธํฐํ๋ฆฌํฐ๋ฅผ ํ๊ธฐํ ๋๊น์ง ์ ์ง๋ฉ๋๋ค. IDE๋ฅผ ๋ซ์๋ ์คํ ์ค์ธ ์คํฌ๋ฆฝํธ์ ๊ตฌ๋ ์ ๋จ์ง๋ง ๋ ๋ฆฝ์ ์ธ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ด๋ฒคํธ ์๋น์ค๊ฐ ์๊ธฐ์ง๋ ์์ต๋๋ค.
- AddHandler๋ ๋์ ์ถ๊ฐํ๋ฉฐ ์ค๋ณต ๋ฑ๋ก์ ๊ฐ์ Sub๋ฅผ ๋ฐ๋ณต ํธ์ถํฉ๋๋ค. RemoveHandler๋ ๋ง์ง๋ง์ผ๋ก ์ผ์นํ๋ ๋ฑ๋ก์ ์ง์ฐ๊ณ , ์์ผ๋ฉด ์๋ฌด ์ผ๋ ํ์ง ์์ต๋๋ค. ์ ์ธยท์ ๊ทผยท์๊ทธ๋์ฒ๋ฅผ ๊ฒ์ฌํ๊ณ ์ธ์๋ฅผ ํ๊ฐํ ๋ค ์์ ์๋ ๋ชฉ๋ก์ ๊ณ ์ ํฉ๋๋ค. ์ฒ๋ฆฌ๊ธฐ ์์ ๊ตฌ๋ ๋ณ๊ฒฝ์ ๋ค์ RaiseEvent๋ถํฐ ์ ์ฉ๋ฉ๋๋ค.
- ์ฒ๋ฆฌ๊ธฐ ์ค๋ฅ๋ ๋จ์ ํธ์ถ์ ์ค๋จํ๊ณ ํธ์ถ์์ Catch/Finally๋ก ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ฏธ ๋ฐ์ํ ByRef ๋ณ๊ฒฝ์ ๋ณต์ฌ๋ฉ๋๋ค. ์ผ์ ์ ์ง์ ๊ธด๊ธ ์ค์ง๋ ์ฒ๋ฆฌ๊ธฐ ์์์๋ ์๋ํ๋ฉฐ Catch๋ ๊ธด๊ธ ์ค์ง๋ฅผ ์ผํค์ง ์์ต๋๋ค. ์ ์ค๋ ๋๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค. ์ฐจ๋จ๋๋ ๋ค์ดํฐ๋ธ ํธ์ถ์ ์์ฒด ์ทจ์ ์ ํ์ ์ ์งํฉ๋๋ค.
- ์ ํ์ ์ด๋ฒคํธ๋น 4096๊ฐ ๊ตฌ๋ , 16๋จ๊ณ RaiseEvent ์ค์ฒฉ, 32๊ฐ ์คํฌ๋ฆฝํธ ํ๋ก์์ ํ๋ ์์ ๋๋ค. ์ํ์ด๋ ๊น์ ์ฌ๊ท๋ ํด๋ผ์ด์ธํธ ์คํ์ ๋์น๊ฒ ํ์ง ์๊ณ ์ก์ ์ ์๋ ์คํฌ๋ฆฝํธ ์ค๋ฅ๋ฅผ ๋ ๋๋ค. ๊น์ ์ฒ๋ฆฌ๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ธ์. ๊ณต์ ์ค์นผ๋ผ๋ Module ํ๋์ ์ ์ฅํฉ๋๋ค. ๊ธฐ์กด ํ์ผ ์์ค ์ค์นผ๋ผ๋ ๋ณต์ฌ๋ณธ์ผ๋ก ์์๋ฉ๋๋ค.
- ์คํฌ๋ฆฝํธ ์ ์ธ ์ด๋ฒคํธ๋ ์ฌ์ ํ ๋ช ์์ ์ธ RaiseEvent๊ฐ ํ์ํฉ๋๋ค. ์ ๋ยท์์ยท์ฐ๊ฒฐ ์๋ ๊ตฌ๋ ์ Basic.GameEvents์ ํด๋ผ์ด์ธํธ UO. ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. Handles, WithEvents, Custom Event, ์ด๋ฒคํธ ๋๋ฆฌ์ ํ์ ๋ฐ ํด๋์ค ์ด๋ฒคํธ๋ ์ง์ํ์ง ์์ต๋๋ค.
์์
1. ๋ฑ๋ก ๋ฐ ํด์
# Feed.Message๋ text As String์ ByVal๋ก ์ ๋ฌํฉ๋๋ค. ์ ์ฒด๊ฐ ํ์๋ Feed.Publish๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ณ Record๋ ๊ณต์ State.log์ ์ถ๊ฐํฉ๋๋ค. handler๊ฐ Record๋ฅผ ๋ฑ๋กํ์ฌ "ready"๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ค๋ฅธ ์ค์ AddressOf Record๋ ๊ฐ์ Sub๋ก ์ธ์ํด ํด์ ํฉ๋๋ค. ํด์ ํ "ignored"๋ ์ถ๊ฐ๋์ง ์์ผ๋ฉฐ Main์ "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
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
Feed.Message๋ text As String์ ByVal๋ก ์ ๋ฌํฉ๋๋ค. ์ ์ฒด๊ฐ ํ์๋ Feed.Publish๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ณ Record๋ ๊ณต์ State.log์ ์ถ๊ฐํฉ๋๋ค. handler๊ฐ Record๋ฅผ ๋ฑ๋กํ์ฌ "ready"๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ค๋ฅธ ์ค์ AddressOf Record๋ ๊ฐ์ Sub๋ก ์ธ์ํด ํด์ ํฉ๋๋ค. ํด์ ํ "ignored"๋ ์ถ๊ฐ๋์ง ์์ผ๋ฉฐ Main์ "ready"๋ฅผ ๋ฐํํฉ๋๋ค.
2. ๊ฐ์ ์ฐ์์ผ๋ก ๋ณ๊ฒฝ
# Adjust์ ๋ Sub๋ total As Integer ByRef๋ฅผ ์ ์ธํฉ๋๋ค. Increment๊ฐ 3์ 4๋ก ๋ฐ๊พธ๊ณ DoubleValue๋ 4๋ฅผ ๋ฐ์ 8๋ก ๋ง๋ญ๋๋ค. RaiseEvent๊ฐ Main์ 8์ ๋ณต์ฌํ ํ ๋ ๊ตฌ๋
์ ํด์ ํฉ๋๋ค. Integer 8์ ์๋์ด์ง True/False๊ฐ ์๋๋ฉฐ RaiseEvent ์์ฒด๋ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค.
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
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
Adjust์ ๋ Sub๋ total As Integer ByRef๋ฅผ ์ ์ธํฉ๋๋ค. Increment๊ฐ 3์ 4๋ก ๋ฐ๊พธ๊ณ DoubleValue๋ 4๋ฅผ ๋ฐ์ 8๋ก ๋ง๋ญ๋๋ค. RaiseEvent๊ฐ Main์ 8์ ๋ณต์ฌํ ํ ๋ ๊ตฌ๋ ์ ํด์ ํฉ๋๋ค. Integer 8์ ์๋์ด์ง True/False๊ฐ ์๋๋ฉฐ RaiseEvent ์์ฒด๋ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค.
3. ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ณ์
# Ready์๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. First๊ฐ A๋ฅผ, Failing์ด B๋ฅผ ์ถ๊ฐํ๊ณ ์ค๋ฅ๋ฅผ ๋์ ธ ์ด๋ฒ์๋ Last๋ฅผ ๊ฑด๋๋๋๋ค. Catch๊ฐ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ Finally๊ฐ Failing์ ํด์ ํฉ๋๋ค. ๋ค์ ํธ์ถ์ AC๋ฅผ ์ถ๊ฐํ๋ฉฐ Main์ "ABAC:handler failed"๋ฅผ ๋ฐํํฉ๋๋ค. ๋ชจ๋ ์ฒ๋ฆฌ๊ธฐ์ State๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
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
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
Ready์๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. First๊ฐ A๋ฅผ, Failing์ด B๋ฅผ ์ถ๊ฐํ๊ณ ์ค๋ฅ๋ฅผ ๋์ ธ ์ด๋ฒ์๋ Last๋ฅผ ๊ฑด๋๋๋๋ค. Catch๊ฐ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ Finally๊ฐ Failing์ ํด์ ํฉ๋๋ค. ๋ค์ ํธ์ถ์ AC๋ฅผ ์ถ๊ฐํ๋ฉฐ Main์ "ABAC:handler failed"๋ฅผ ๋ฐํํฉ๋๋ค. ๋ชจ๋ ์ฒ๋ฆฌ๊ธฐ์ State๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.