RaiseEvent 문

클래스, 양식 또는 문서 내의 모듈 수준에서 선언된 이벤트를 트리거합니다.

구문

RaiseEvent eventname[( argumentlist )]  

부분

eventname
필수입니다. 트리거할 이벤트의 이름입니다.

argumentlist
선택 사항. 쉼표로 구분된 변수, 배열 또는 식 목록입니다. argumentlist 인수는 괄호로 묶어야 합니다. 인수가 없으면 괄호를 생략해야 합니다.

설명

필수 eventname은 모듈 내에 선언된 이벤트의 이름입니다. 이는 Visual Basic 변수 명명 규칙을 따릅니다.

이벤트가 발생한 모듈 내에서 이벤트가 선언되지 않은 경우 오류가 발생합니다. 다음 코드 조각에서는 이벤트 선언과 이벤트가 발생하는 프로시저를 보여 줍니다.

' Declare an event at module level.
Event LogonCompleted(ByVal UserName As String)

Sub Logon(ByVal UserName As String)
    ' Raise the event.
    RaiseEvent LogonCompleted(UserName)
End Sub

모듈에서 명시적으로 선언되지 않은 이벤트를 발생시키는 데 RaiseEvent를 사용할 수 없습니다. 예를 들어, 모든 양식은 System.Windows.Forms.Form에서 Click 이벤트를 상속하며 파생 양식에서 RaiseEvent를 사용하여 발생시킬 수 없습니다. 양식 모듈에서 Click 이벤트를 선언하면 양식 자체의 Click 이벤트가 숨겨집니다. OnClick 메서드를 호출하여 양식의 Click 이벤트를 계속 호출할 수 있습니다.

기본적으로 Visual Basic에 정의된 이벤트는 연결이 설정된 순서대로 이벤트 처리기를 발생시킵니다. 이벤트에는 ByRef 매개 변수가 있을 수 있으므로 늦게 연결하는 프로세스는 이전 이벤트 처리기에서 변경한 매개 변수를 수신할 수 있습니다. 이벤트 처리기가 실행된 후 이벤트를 발생시킨 서브루틴으로 제어가 반환됩니다.

참고 항목

공유되지 않은 이벤트는 해당 이벤트가 선언된 클래스의 생성자 내에서 발생하면 안 됩니다. 이러한 이벤트로 인해 런타임 오류가 발생하지는 않지만 관련 이벤트 처리기가 이를 catch하지 못할 수도 있습니다. 생성자에서 이벤트를 발생시켜야 하는 경우 Shared 한정자를 사용하여 공유 이벤트를 만듭니다.

참고 항목

사용자 지정 이벤트를 정의하여 이벤트의 기본 동작을 변경할 수 있습니다. 사용자 지정 이벤트의 경우 RaiseEvent 문은 이벤트의 RaiseEvent 접근자를 호출합니다. 사용자 지정 이벤트에 대한 자세한 내용은 Event 문을 참조하세요.

예 1

다음 예제에서는 이벤트를 사용하여 10초부터 0초까지 카운트 다운합니다. 이 코드는 RaiseEvent 문을 포함하여 여러 가지 이벤트 관련 메서드, 속성 및 문을 보여 줍니다.

이벤트를 발생시키는 클래스는 이벤트 소스이고 이벤트를 처리하는 메서드는 이벤트 처리기입니다. 이벤트 소스는 생성되는 이벤트에 대해 여러 개의 처리기를 사용할 수 있습니다. 클래스에서 이벤트를 발생시키면 해당 이벤트는 개체의 해당 인스턴스에 대해 이벤트를 처리하도록 선택한 모든 클래스에서 발생됩니다.

또한 이 예제에서는 단추(Button1)와 텍스트 상자(TextBox1)가 있는 폼(Form1)을 사용합니다. 단추를 클릭하면 첫 번째 텍스트 상자에 10초부터 0초까지의 카운트 다운이 표시됩니다. 전체 시간(10초)이 경과되면 첫 번째 텍스트 상자에 "Done"이 표시됩니다.

Form1에 대한 코드는 폼의 초기 상태 및 최종 상태를 지정합니다. 또한 이벤트가 발생될 때 실행될 코드도 포함됩니다.

이 예를 사용하려면 새 Windows 애플리케이션 프로젝트를 열고 Button1이라는 단추와 TextBox1이라는 텍스트 상자를 Form1이라는 기본 양식에 추가합니다. 폼을 마우스 오른쪽 단추로 클릭하고 코드 보기를 클릭하여 코드 편집기를 엽니다.

Form1 클래스의 선언 섹션에 WithEvents 변수를 추가합니다.

Private WithEvents mText As TimerState

예제 2

Form1에 대한 코드에 다음 코드를 추가합니다. Form_Load 또는 Button_Click과 같이 있을 수 있는 모든 중복 프로시저를 대체합니다.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

F5 키를 눌러 앞의 예를 실행하고 시작 단추를 클릭합니다. 첫 번째 텍스트 상자에서 초를 카운트 다운하기 시작합니다. 전체 시간(10초)이 경과되면 첫 번째 텍스트 상자에 "Done"이 표시됩니다.

참고 항목

My.Application.DoEvents 메서드는 양식이 이벤트를 처리하는 것과 동일한 방식으로 이벤트를 처리하지 않습니다. 양식이 직접 이벤트를 처리하도록 하려면 다중 스레딩을 사용하면 됩니다. 자세한 내용은 관리형 스레딩을 참조하세요.

참고 항목