2013-06-10 4 views
0

진행률 표시 줄과 단추와 같은 개체로 양식을 만들었습니다. 양식 외부에 공용 라이브러리 코드를 만들었습니다.진행률 표시 줄을 공용 클래스에서 실행

제 질문은 라이브러리에 작성된 Sub에서 진행률 표시 줄이나 텍스트 단추를 수정하고 싶습니다. (양식을 매개 변수로 전달하려고합니다) : MyProgressBar1

클래스 라이브러리로 작성된 하위 또는 함수에서 직접 내 양식에 내 진행률 표시 줄을 수정하는 방법이 있나요 :

Public Shared Sub ModifyItems(ByRef _WhichForm As Form)<br> 
    _WhichForm.MyProgressBar1.visible = true<br> 
End sub<br> 

불행하게도, 코드 내 진행률 표시 줄의 이름을 인식하지 못합니다 , 직접 양식 코드에?

+0

코드를 일반적으로 UI에 참여하지 않아야 클래스 라이브러리. 격리를 위해 이벤트를 사용합니다. 이 코드는 예를 들어 ProgressChanged 이벤트를 발생시켜야합니다. –

답변

1

이러한 유형의 접근법은 일반적으로 "나쁜 습관"의 우산 아래 있습니다. 서로 다른 객체를 수정하는 객체를 사용하면 어려운 코드가 확장, 디버그 및 유지되도록하는 밀접한 결합이 직접 도입됩니다.

라이브러리에서 무언가를 수정하는 대신 라이브러리 내의 내용이 변경되었음을 알리는 것이 좋습니다. 예를 들어, 라이브러리 내에서 이벤트를 발생시킬 수 있습니다. 그런 다음 Form1은 해당 이벤트를 수신하고 해당 구성 요소를 적절히 변경합니다. 이렇게하면 Form1은 구성 요소를 수정하는 데 전적인 책임이 있으며 라이브러리는 내부 상태의 변경을 알리는 데 전적으로 책임이 있습니다.

좋은 예를 들면, 말하자면 폼의 진행률 표시 줄 구성 요소를 변경했다면 (아마도 더 나은 곳을 찾을 수있을 것입니다) 갑자기 라이브러리에 변경 사항이 도입됩니다.

당신은 같은 것을 할 수있는 이벤트 사용하려면 :

Public Class MyLibrary 
    Event OnSomethingHappened() 

    Private Sub SomethingHappened() 
     RaiseEvent OnSomethingHappened() 
    End Sub 
End Class 

를 다음 형태 :

Public Class Form1 
    Private WithEvents _myLibrary as New MyLibrary 

    Private Sub LibraryDidSomething() Handles _myLibrary.OnSomethingHappened 
     MyProgressBar1.Visible = True 
    End Sub 
End Class 

이 잘 Form1에 어떤 의존도가 디커플링이 - 라이브러리는 독립적으로 존재 엔티티이며 이벤트를 청취하는 사람은 상관하지 않습니다.

당신은 또한 공유 이벤트를 사용할 수있는 shared 클래스와이 작업을 수행하려는 경우 - 다음과 같이 프로그래밍 연결되어 있어야합니다 : 형태로

Public Class MyLibrary 
    Shared Event OnSomething() 

    Public Shared Sub DoSomething() 
     RaiseEvent OnSomething() 
    End Sub 
End Class 

:

Public Class Form1 
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _ 
                 Handles MyBase.Load 
     AddHandler MyLibrary.OnSomethingHappened, AddressOf LibDidSomething 
    End Sub 

    Private Sub Form1_FormClosed(sender As System.Object, e As _ 
     System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed 
     RemoveHandler MyLibrary.OnSomethingHappened, AddressOf LibDidSomething 
    End Sub 

    Private Sub LibDidSomething() 
     MyProgressBar1.Visible = True 
    End Sub 
End Class 

프로그램 추가 이벤트 당신은 그 (것)들을 구독 한 목표의 처분하기 전에 그 (것)들을 제거하기 위하여주의를 기울여야한다. 이 경우 폼이로드 될 때 처리기를 추가하고 폼이 닫힐 때 제거했습니다. 추가 된 처리기를 제거하지 못하면 양식이 가비지 수집되지 않아 메모리 누수가 발생합니다.

더 읽기 여기를 참조하십시오 : Raising Events and Responding to Events (MSDN)

관련 문제