이벤트 작업 방법을 보여 주는 두 가지 항목 중 두 번째 항목입니다. 첫 번째 항목인 자습서: 이벤트 선언 및 발생은 이벤트를 선언하고 발생시키는 방법을 보여 줍니다. 이 섹션에서는 해당 연습에서의 양식과 클래스를 사용하여 이벤트가 발생했을 때 이를 처리하는 방법을 보여줍니다.
클래스 예제에서는 Widget 기존 이벤트 처리 문을 사용합니다. Visual Basic은 이벤트 작업을 위한 다른 기술을 제공합니다. 연습으로 이 예제를 수정하여 AddHandler 및 Handles 문을 사용할 수 있습니다.
위젯 클래스의 PercentDone 이벤트를 처리하려면
다음 코드를 다음 위치에 배치합니다.
Form1Private WithEvents mWidget As Widget Private mblnCancel As Boolean키워드는
WithEvents변수mWidget를 사용하여 개체의 이벤트를 처리하도록 지정합니다. 개체를 만들 클래스의 이름을 제공하여 개체 종류를 지정합니다.변수
mWidget는 클래스 수준이어야 하는Form1변수이므로WithEvents에 선언됩니다. 이는 배치하는 클래스의 유형에 관계없이 마찬가지입니다.변수
mblnCancel는 메서드를 취소LongTask하는 데 사용됩니다.
이벤트를 처리하는 코드 작성
변수를 사용하여 WithEvents선언하는 즉시 변수 이름이 클래스 코드 편집기의 왼쪽 드롭다운 목록에 나타납니다. 선택하면 mWidgetWidget 클래스의 이벤트가 오른쪽 드롭다운 목록에 표시됩니다. 이벤트를 선택하면 접두 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에 잠시 다시 진입합니다.
실행이 다시 코드 Form1LongTask 에 있는 동안 메서드가 다시 호출되면 어떻게 되나요? 최악의 경우, 이벤트가 발생할 때마다 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