2012-11-05 4 views
0

이 질문의 제목에 접근하는 방법에 대해서는 확신하지 못했기 때문에 의심을 분명히하기를 희망하면서 상황을 설명하겠습니다. (제목에 대한 더 나은 제안이 있다면 그것을 바꿀 것입니다.)대리자 메서드의 매개 변수로 컨트롤

지난 며칠 동안 나는 그 시나리오를 사용하여 멀티 스레딩과 GUI 컨트롤 수정에 대해 읽었습니다. 제 질문은 컨트롤을 내 대리자 및 메서드의 매개 변수로 변경하여 전달하는 것과 관련이 있습니다. 의가 나는 ListView1 있다고 가정 해 봅시다 내가 거기에 그룹을 추가 할 내가 본 실시 예에 따르면, (이것은 단순한 경험 그리고 몇 가지 코드가)

을 할 수있는 방법이 될 것

Private Delegate Sub ResultsAddGroup_Delegate(ByVal FondsGroup As ListViewGroup) 

Private Sub ResultsAddGroup(ByVal FondsGroup As ListViewGroup) 
    If Me.ListView1.InvokeRequired Then 
     Dim d As New ResultsAddGroup_Delegate(AddressOf ResultsAddGroup) 
     Dim ParamArgs() As Object = New Object() {FondsGroup} 
     Me.ListView1.BeginInvoke(d, ParamArgs) 
    Else 
     Me.ListView1.Groups.Add(FondsGroup) 
    End If 
End Sub 

일반적으로 컨트롤을 매개 변수로 전달하여 코드를 명확하게 유지하고 메서드 나 함수를 특정 컨트롤 개체에서 멀리 떨어 뜨리는 것이 좋습니다. 내가 같이, 위의 경우에 매개 변수로 ListView를 전달하고 싶었다면 : 멀티 스레딩 및 제어 목적을 변경하는 문제의 어떤 종류를 나타냅니다

Private Delegate Sub ResultsAddGroup_Delegate(ByVal LView As ListView, ByVal FondsGroup As ListViewGroup) 

Private Sub ResultsAddGroup(ByVal LView As ListView, ByVal FondsGroup As ListViewGroup) 
    If LView.InvokeRequired Then 
     Dim d As New ResultsAddGroup_Delegate(AddressOf ResultsAddGroup) 
     Dim ParamArgs() As Object = New Object() {LView, FondsGroup} 
     LView.BeginInvoke(d, ParamArgs) 
    Else 
     LView.Groups.Add(FondsGroup) 
    End If 
End Sub 

겠습니까? 그렇다면 컨트롤을 지정하지 않고이 작업을 수행 할 수있는 다른 방법이 있습니까?

또 다른 참고 사항, 내가 일반적으로 내 방법 (위에서 설명한대로 컨트롤을 매개 변수로 전달)에 어떤 문제가 있습니까?

감사합니다.

답변

0

몇 가지 프로젝트에서 두 번째 패턴을 직접 사용했습니다. 그것은 Ctrl.InvokeRequired가 스레드로부터 안전하므로 작업을 수행하는 것 같습니다. 컨트롤을 매개 변수로 사용하는 것은 개체 참조 일 뿐이므로 문제가 없습니다. 내가 그 첫 번째 코드 블록에서 생각

는 객체 배열 초기화에 작은 오류가 이는 것입니다 :

Dim ParamArgs() As Object = New Object() {FondsGroup} 

하지만 내가 뭔가를 놓친 경우에 변경 주저 :)

+0

그래, 나는 그렇게 생각하지만, 확실하지 않기 때문에 나는 나보다 많은 경험을 가진 사람의 의견을 기다리고 있었다. 코드에 대해서는 두 번째 코드 블록에서 볼 수 있듯이 복사/붙여 넣기 실수였습니다. 입력 해 주셔서 감사합니다. – Deltint

관련 문제