이벤트 작업 방법을 보여 주는 두 가지 항목 중 두 번째 항목입니다. 첫 번째 항목인 자습서: 이벤트 선언 및 발생은 이벤트를 선언하고 발생시키는 방법을 보여 줍니다. 이 섹션에서는 해당 연습에서의 양식과 클래스를 사용하여 이벤트가 발생했을 때 이를 처리하는 방법을 보여줍니다.
클래스 예제에서는 Widget
기존 이벤트 처리 문을 사용합니다. Visual Basic은 이벤트 작업을 위한 다른 기술을 제공합니다. 연습으로 이 예제를 수정하여 AddHandler
및 Handles
문을 사용할 수 있습니다.
위젯 클래스의 PercentDone 이벤트를 처리하려면
다음 코드를 다음 위치에 배치합니다.
Form1
Private WithEvents mWidget As Widget Private mblnCancel As Boolean
키워드는
WithEvents
변수mWidget
를 사용하여 개체의 이벤트를 처리하도록 지정합니다. 개체를 만들 클래스의 이름을 제공하여 개체 종류를 지정합니다.변수
mWidget
는 클래스 수준이어야 하는Form1
변수이므로WithEvents
에 선언됩니다. 이는 배치하는 클래스의 유형에 관계없이 마찬가지입니다.변수
mblnCancel
는 메서드를 취소LongTask
하는 데 사용됩니다.
이벤트를 처리하는 코드 작성
변수를 사용하여 WithEvents
선언하는 즉시 변수 이름이 클래스 코드 편집기의 왼쪽 드롭다운 목록에 나타납니다. 선택하면 mWidget
Widget
클래스의 이벤트가 오른쪽 드롭다운 목록에 표시됩니다. 이벤트를 선택하면 접두 mWidget
사 및 밑줄이 있는 해당 이벤트 프로시저가 표시됩니다. 변수와 WithEvents
연결된 모든 이벤트 프로시저에는 변수 이름이 접두사로 지정됩니다.
이벤트를 처리하려면
mWidget
에서 왼쪽 드롭다운 목록에서 선택합니다.PercentDone
오른쪽 드롭다운 목록에서 이벤트를 선택합니다. 코드 편집기에서 이벤트 프로시저를mWidget_PercentDone
엽니다.비고
코드 편집기는 새 이벤트 처리기를 삽입하는 데 유용하지만 필수는 아닙니다. 이 연습에서는 이벤트 처리기를 코드에 바로 복사하는 것이 더 간편합니다.
이벤트 처리기에 다음 코드를
mWidget_PercentDone
추가합니다.Private Sub mWidget_PercentDone( ByVal Percent As Single, ByRef Cancel As Boolean ) Handles mWidget.PercentDone lblPercentDone.Text = CInt(100 * Percent) & "%" My.Application.DoEvents() If mblnCancel Then Cancel = True End Sub
이벤트가 발생할 때마다
PercentDone
이벤트 프로시저는 컨트롤에 완료 백분율을Label
표시합니다. 이DoEvents
메서드를 사용하면 레이블을 다시 칠할 수 있으며 사용자에게 취소 단추를 클릭할 수도 있습니다.이벤트 처리기에 대해
Button2_Click
다음 코드를 추가합니다.Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
실행 중인 동안 사용자가 LongTask
버튼을 클릭하면, Button2_Click
문장이 이벤트 처리를 허용하자마자 DoEvents
이벤트가 실행됩니다. 클래스 수준 변수 mblnCancel
은 True
으로 설정되고, mWidget_PercentDone
이벤트가 이를 테스트한 후 인수 ByRef Cancel
을 True
로 설정합니다.
WithEvents 변수를 개체에 연결
Form1
는 이제 Widget
개체의 이벤트를 처리하도록 설정되었습니다. 해야 할 일은 어딘가에서 Widget
를 찾는 것입니다.
디자인 타임에 변수 WithEvents
를 선언하면 연결된 개체가 없습니다.
WithEvents
변수는 다른 개체 변수와 같습니다. 개체를 만들고 변수를 사용하여 개체에 대한 참조를 할당해야 합니다 WithEvents
.
개체를 만들고 개체에 대한 참조를 할당하려면
코드 편집기에서 왼쪽 드롭다운 목록에서 (Form1 이벤트)를 선택합니다.
Load
오른쪽 드롭다운 목록에서 이벤트를 선택합니다. 코드 편집기에서 이벤트 프로시저를Form1_Load
엽니다.이벤트 프로시저에
Form1_Load
대해 다음 코드를 추가하여 다음을 만듭니다Widget
.Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
이 코드가 실행되면 Visual Basic은 개체를 Widget
만들고 해당 이벤트를 연결된 mWidget
이벤트 프로시저에 연결합니다. 이 시점부터 Widget
이벤트가 PercentDone
이벤트를 발생시키면 mWidget_PercentDone
이벤트 프로시저가 실행됩니다.
LongTask 메서드를 호출하려면
이벤트 처리기에 다음 코드를
Button1_Click
추가합니다.Private Sub Button1_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button1.Click mblnCancel = False lblPercentDone.Text = "0%" lblPercentDone.Refresh() mWidget.LongTask(12.2, 0.33) If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%" End Sub
메서드를 LongTask
호출하기 전에 완료 비율을 표시하는 레이블을 초기화해야 하며 메서드를 취소하기 위한 클래스 수준 Boolean
플래그를 로 False
설정해야 합니다.
LongTask
는 12.2초의 작업 기간으로 호출됩니다. 이 PercentDone
이벤트는 1/3초마다 한 번씩 발생합니다. 이벤트가 발생할 때마다 mWidget_PercentDone
이벤트 절차가 실행됩니다.
LongTask
이 완료되면, mblnCancel
를 테스트하여 LongTask
가 정상적으로 종료되었는지, 또는 mblnCancel
가 True
로 설정되어 중지되었는지 확인합니다. 완료 비율은 이전 사례에서만 업데이트됩니다.
프로그램을 실행하려면
F5 키를 눌러 프로젝트를 실행 모드로 전환합니다.
작업 시작 단추를 클릭합니다. 이벤트가 발생할 때마다
PercentDone
레이블이 완료된 작업의 백분율로 업데이트됩니다.취소 단추를 클릭하여 작업을 중지합니다. 취소 단추의 모양은 클릭할 때 즉시 변경되지 않습니다.
Click
이벤트는My.Application.DoEvents
문이 이벤트 처리를 허용할 때까지 발생할 수 없습니다.비고
메서드는
My.Application.DoEvents
폼과 정확히 동일한 방식으로 이벤트를 처리하지 않습니다. 예를 들어 이 설명에서는 취소 단추를 두 번 클릭해야 합니다. 폼에서 이벤트를 직접 처리할 수 있도록 멀티쓰레딩을 사용할 수 있습니다. 자세한 내용은 관리되는 스레딩을 참조하세요.
F11을 사용하여 프로그램을 실행하고 코드를 한 번에 한 줄씩 실행하는 것이 유용할 수 있습니다. 실행이 LongTask
에 어떻게 진입하는지 명확하게 볼 수 있으며, Form1
이벤트가 발생할 때마다 PercentDone
에 잠시 다시 진입합니다.
실행이 다시 코드 Form1
LongTask
에 있는 동안 메서드가 다시 호출되면 어떻게 되나요? 최악의 경우, 이벤트가 발생할 때마다 LongTask
가 호출되면 스택 오버플로가 발생할 수 있습니다.
변수 mWidget
에 새 Widget
개체에 대한 참조를 Widget
에 할당하여 다른 mWidget
개체의 이벤트를 처리하도록 할 수 있습니다. 사실상 Button1_Click
의 코드는 버튼을 클릭할 때마다 이 작업을 수행하도록 만들 수 있습니다.
다른 위젯에 대한 이벤트를 처리하려면
다음 코드 줄을
Button1_Click
프로시저에 추가하여mWidget.LongTask(12.2, 0.33)
줄 바로 앞에 옵니다.mWidget = New Widget ' Create a new Widget object.
위의 코드는 단추를 클릭할 때마다 새 Widget
코드를 만듭니다. 메서드 LongTask
가 완료되는 즉시 Widget
에 대한 참조가 해제되고, Widget
가 파괴됩니다.
변수는 WithEvents
한 번에 하나의 개체 참조만 포함할 수 있으므로 다른 Widget
개체를 할당하면 mWidget
이전 Widget
개체의 이벤트가 더 이상 처리되지 않습니다. 이전 mWidget
개체에 대한 참조를 포함하는 유일한 개체 변수인 경우 Widget
개체가 제거됩니다. 여러 Widget
개체의 이벤트를 처리하려면 문을 사용하여 AddHandler
각 개체의 이벤트를 개별적으로 처리합니다.
비고
필요한 만큼 WithEvents
변수를 선언할 수 있지만 변수 배열 WithEvents
은 지원되지 않습니다.
참고하십시오
- 가이드: 이벤트 선언 및 발생
- 이벤트
.NET