이 설명서는 Widget
라는 이름이 지정된 클래스에 대한 이벤트를 선언하고 발생하는 방법을 보여 줍니다. 단계를 완료한 후에는 개체의 이벤트를 사용하여 애플리케이션에서 상태 정보를 제공하는 방법을 보여 주는 도우미 항목인 Widget
를 읽을 수 있습니다.
위젯 클래스
잠시 동안 Widget
클래스가 있다고 가정합니다.
Widget
클래스에는 실행하는 데 시간이 오래 걸릴 수 있는 메서드가 있으며 애플리케이션에서 일종의 완료 표시기를 배치할 수 있도록 합니다.
물론 Widget
개체를 사용하여 진행률 대화 상자가 표시되도록 할 수 있지만, 이렇게 하면 Widget
클래스를 사용하는 모든 프로젝트에서 동일한 대화 상자를 계속 사용해야 합니다. 개체 디자인의 좋은 원칙은 개체를 사용하는 애플리케이션이 양식 또는 대화 상자를 관리하는 것이 아닌 한 사용자 인터페이스를 처리하도록 하는 것입니다.
Widget
의 목적은 다른 작업을 수행하는 것이므로, PercentDone
이벤트를 추가하고, Widget
의 메서드를 호출하는 프로시저가 해당 이벤트를 처리하여 상태 업데이트를 표시하도록 하는 것이 좋습니다. 이 PercentDone
이벤트는 작업을 취소하는 메커니즘을 제공할 수도 있습니다.
이 항목에 대한 코드 예제를 빌드하려면
새 Visual Basic Windows 애플리케이션 프로젝트를 열고 이름이 인
Form1
양식을 만듭니다.두 개의 단추와 레이블을 추가합니다
Form1
.다음 표와 같이 개체의 이름을 지정합니다.
객체 재산 설정 Button1
Text
시작 작업 Button2
Text
취소 Label
(Name)
,Text
완료율, 0 프로젝트 메뉴에서 클래스 추가를 선택하여 프로젝트에 명명된
Widget.vb
클래스를 추가합니다.
위젯 클래스에 대한 이벤트를 선언하려면
키워드를
Event
사용하여 클래스에서 이벤트를 선언합니다Widget
. 이벤트에는ByVal
및ByRef
인수가 있을 수 있으며, 이는Widget
의PercentDone
이벤트에서 나타납니다.Public Event PercentDone(ByVal Percent As Single, ByRef Cancel As Boolean)
호출 개체가 이벤트를 받으면 PercentDone
인수에 Percent
완료된 작업의 백분율이 포함됩니다.
Cancel
이벤트를 발생시킨 메서드를 취소하도록 True
인수를 설정할 수 있습니다.
비고
다음과 같은 예외를 제외하고 프로시저의 인수와 마찬가지로 이벤트 인수를 선언할 수 있습니다. 이벤트에는 Optional
ParamArray
반환 값이 없습니다.
이벤트는 PercentDone
의 LongTask
메서드에 의해 Widget
클래스에서 발생합니다.
LongTask
는 메서드가 작업을 수행하는 척하는 시간 길이와 LongTask
이벤트를 발생시키기 위해 PercentDone
가 일시 중지하기 전의 최소 시간 간격이라는 두 개의 인수를 사용합니다.
PercentDone 이벤트를 트리거하려면
이 클래스에서 사용되는
Timer
속성에 대한 액세스를 간소화하려면, 클래스 모듈의 선언 섹션 맨 위에Imports
문을 추가하고Class Widget
문 위에 배치하십시오.Imports Microsoft.VisualBasic.DateAndTime
Widget
클래스에 다음 코드를 추가합니다.Public Sub LongTask(ByVal Duration As Single, ByVal MinimumInterval As Single) Dim Threshold As Single Dim Start As Single Dim blnCancel As Boolean ' The Timer property of the DateAndTime object returns the seconds ' and milliseconds that have passed since midnight. Start = CSng(Timer) Threshold = MinimumInterval Do While CSng(Timer) < (Start + Duration) ' In a real application, some unit of work would ' be done here each time through the loop. If CSng(Timer) > (Start + Threshold) Then RaiseEvent PercentDone( Threshold / Duration, blnCancel) ' Check to see if the operation was canceled. If blnCancel Then Exit Sub Threshold = Threshold + MinimumInterval End If Loop End Sub
애플리케이션이 LongTask
메서드를 호출하면 Widget
클래스는 PercentDone
이벤트를 매 MinimumInterval
초마다 발생시킵니다. 이벤트가 LongTask
에 반환되면 Cancel
인수가 True
로 설정되었는지 확인합니다.
여기에 몇 가지 고지 사항이 필요합니다. 간단히 하기 위해 이 절차에서는 LongTask
작업이 얼마나 오래 걸리는지 미리 알고 있다고 가정합니다. 이것은 거의 일어나지 않는다. 작업을 짝수 크기의 청크로 나누는 것은 어려울 수 있으며, 종종 사용자에게 가장 중요한 것은 단순히 어떤 일이 일어나고 있다는 표시를 받기 전에 경과하는 시간입니다.
이 샘플에서 다른 결함을 발견했을 수 있습니다. 이 속성은 Timer
자정 이후에 경과된 시간(초)을 반환하므로 자정 직전에 시작되면 애플리케이션이 중단됩니다. 시간을 측정하는 보다 신중한 접근 방식은 이와 같은 경계 조건을 고려하거나 같은 Now
속성을 사용하여 완전히 피해야 합니다.
이제 Widget
클래스가 이벤트를 발생시킬 수 있게 되었으므로, 다음 연습으로 넘어갈 수 있습니다.
안내 가이드: 이벤트 처리는 WithEvents
를 사용하여 PercentDone
이벤트에 이벤트 처리기를 연결하는 방법을 설명합니다.
참고하십시오
.NET