VB.NET에서 컨트롤 배열 만들기

2022. 12. 9. 09:00VB.NET

VB6에서는 기본 디자인창에서 컨트롤 배열을 손쉽게 만들 수 있었는데 이게 VB.NET에서는 안된다. 은근히 편리한 기능이라 컨트롤 배열이 없어지니 처음에는 많이 불편했다.

하지만, VB.NET에서도 컨트롤 배열을 만들어서 사용할 수 있다. 디자인창에서 만드는것보다는 많이 번거롭지만 그래도 꼭 필요한 상황이 생기면 어쩔수 없이 만들어서 써야하기에 이번 강좌에서 한번 만들어보자.

버튼부터 텍스트박스나 레이블을 포함해서 모든 컨트롤을 배열로 만들 수 있지만, 이번 강좌에서는 간단하게 타이머 컨트롤을 컨트롤 배열로 만들어보자. 왜냐하면, 타이머는 눈에 보이는 컨트롤이 아니니 위치나 크기를 잡는등의 잡다한 기능을 모두 배제하고 오로지 컨트롤 배열이라는 기능을 설명하는데 충실할 수 있기 때문이다.

우선 타이머 컨트롤 배열로 사용할 클래스를 하나 만들자.

Public Class ClassTimerArray : Inherits System.Collections.CollectionBase
    ' 닷넷프레임워크의 System.Collections.CollectionBase 클래스에서 상속됨

    Private ReadOnly HostForm As System.Windows.Forms.Form      ' 대상폼

    Public Sub New(ByVal pForm As System.Windows.Forms.Form, pKind As Integer)
        HostForm = pForm
    End Sub

    Public Sub AddNewTimer()
        ' 새로운 타이머 컨트롤을 추가한다. (pKind : 0-등록, 1-품단종)

        ' Timer 클래스의 새 인스턴스를 만든다.
        Dim aTimer As New System.Windows.Forms.Timer()

        ' 컬렉션의 내부 목록에 타이머를 추가한다.
        Me.List.Add(aTimer)

        ' HostForm 필드에서 참조하는 폼의 컨트롤 컬렉션에 타이머를 추가한다.
        ' HostForm.Controls.Add(aTimer) - 타이머는 폼에 추가할 수 없음 - 버튼등의 컨트롤을 추가할때 필요함

        ' 타이머 개체의 초기 속성 설정
        aTimer.Tag = Me.List.Count - 1

        ' 타이머 이벤트를 이벤트 처리기와 연결
        AddHandler aTimer.Tick, AddressOf RegTimer_Tick

    End Sub

    Public Sub TimerStart(pIndex As Integer)    ' 타이머 켜기
        Me.List(pIndex).Interval = 1000
        Me.List(pIndex).Enabled = True
    End Sub

    Public Sub TimerStop(pIndex As Integer)     ' 타이머 끄기
        Me.List(pIndex).Enabled = False
    End Sub

    Public Sub RemoveTimer(pIndex As Integer)   ' 타이머 한개 제거
        HostForm.Controls.Remove(Me(pIndex))
        Me.List.RemoveAt(pIndex)
    End Sub

    Public Sub RemoveAllTimer()                 ' 모든 타이머 제거
        Dim lpCount = Me.List.Count
        For i As Integer = 0 To lpCount - 1
            'HostForm.Controls.Remove(Me(Me.List.Count - 1))    ' 버튼등의 컨트롤일때 필요함
            Me.List.RemoveAt(Me.List.Count - 1)
        Next
    End Sub

    Public Sub RegTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
        ' 타이머 이벤트 처리기

        Dim lpIndex = CType(CType(sender, Timer).Tag, Integer)


        Me.List(lpIndex).Enabled = False
        Me.List(lpIndex).Interval = 100

        Debug.Print(lpIndex & "번 Timer 발생됨")
RE_TIMER:
        Me.List(lpIndex).Enabled = True


    End Sub

End Class

위 타이머를 메인폼에서 사용해보자.

1. 타이머객체 생성
   전역변수로 타이머(MyTimer) 선언후 할당 

MyTimer = New ClassTimerArray(Me)

2. 타이머 객체안에 타이머를 원하는 개수만큼 추가

   For i As Integer = 0 To 9
      MyTimer.AddNewTimer()
   Next

   이렇게 하면 총 10개의 타이머가 생성된다.

3. 원하는 인덱스의 타이머 켜기 

MyTimer.TimerStart(index)

4. 원하는 인덱스의 타이머 끄기 

MyTimer.TimerStop(index)

이런식으로 컨트롤 배열을 생성해서 사용이 가능하다.

반응형