PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net |

Form_Load Event
데스크탑상에서 가장 많이 사용하는 프로그래밍의 인터페이스는 윈도우폼
이것을 하나씩 살펴가면서 VB.Net의 구문도 익숙해지도록 하자
실은 VB.Net혹은 VB의 언어에 대한 문법을 단순히 익히려고 하면 지루하다
뭔가 만들어 보면서 ,
만들기 위하여 VB.Net의 언어적 측면도 같이 이야기 하는 것이 좋을 것이다
새프로젝트를 하나 만들고



이번에는 Windows Form템프릿을 선택하여 만든다
이렇게 만들면 System.Windows.Forms 이라는 NameSpace를 Imports가 이미 된 상태가
되니까..신경쓸 것이 없다



도구상자의 콘트롤에 마우스를 올려놓으면 콘트롤에 대한 설명이 항상
나타나니까..버전등을 참고하는 습관이 좋다
빈폼이 하나 나타나고, 도구상자에서 버튼이나 텍스트상자등의 콘트롤을 끌어다가
윈도우폼상에 배치하면서 각각의 콘트롤의 이벤트프로시져에 하고 싶은 일을
하면 되는 것인데...
여기에서는 도구상자에서 끌어다 놓는 작업을 하는 DesignTime으로 하지 말고
RunTime으로 필요한 콘트롤을 만들어 가면서 해보도록 하자
그래야 코딩의 즐거움을 갖고 섬세한 표현이 즐겁게 된다

폼의 코드보기를 하여 모듈시트를 열면

Public Class Form1

End Class

빈탕의 모듈시트를 볼수 있다
이곳에 무언가 작성을 해나가면 멋진일이 벌어지는 것
프로그래밍은 어떤 타이밍에 어떤 일이 벌어지라고 하는 명령을 작성하는 것
폼의 실행되면서 나타나는 이벤트를 찾아야 한다
폼모듈시트의 왼쪽상단 목록상자를 보면 (Form Events)가 있고 이것을 크릭하면
오른쪽에 폼개체가 갖고 있는 이벤트목록이 있다
와..뭐가 이렇게 많다..
이중에서 폼이 로딩할때 발생하는 Load이벤트에 아래와 같이 작성해보자

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    If Date.Now.Second Mod 2 = 0 Then
        Me.BackColor = Color.Red
    Else
        Me.BackColor = Color.Blue
    End If
End Sub
  

System.Drawing.Color | Shared
VBA에서 못보던 것이 있다
Date.Now.Second 로 현재시간의 초값을 알아내는 것 같다
DateTime.Now.Second도 같은 표현이 된다
VBA에서는 Second(Now)같은 것으로 초값을 알아냈는데..뭔가 다르다
VB.Net은 모든 것이 개체지향이다
물론 VBA의 Seconde(Now)으로 해도 된다
첨부화일의 내용에 두가지를 모두 표현하였으니 비교하시면서 발전하시면 된다
하지만 색상을 주는 Color.Red와 같은 것은 VB.Net의 방식으로 하여야 한다
이것의 족보가 도대체 어떻게 되나 궁금하면 마우스를 가만히 갖여다가 올려놓으면
그림과 같이 설명이 자세하게 나타난다



System.Drawing 이라는 NameSpace의 Color라는 개체가 갖고 있는
속성이다
그런데 앞에 속성의 Modifier에 Shared라는 표현이 되어있다
이것은 앞으로 자주 나오겠지만..크래스를 개체생성없이 그냥 접근할수있는
것이다
일반적인 크래스는
Dim oQ As New SomeClass
oQ.SomeProeprty="X"
와 같이 New로 생성하고 하여야 하나, Shared가 붙어있는 것은 하지 않아도 접근된다

Mouse_Move Event|CType|Event Parameters
위에서 Load이벤트에 뭔가를 했고
폼이 갖고 있는 이벤트를 몇개 더 해보자
마우스를 움직일때마다 또 이벤트가 발생한다
마우스가 위치를 바꿀때마다 무언가를 우리는 설계할수 있다
간단하게 아래와 같이

    Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Me.Text = "X=" & e.X & "   Y=" & e.Y
    End Sub
    

모든 이벤트는 두개의 매개변수를 갖고 있다
하나는 Sender As Object
이것은 이벤트를 발생한 개체가 어떤 개체인지를 알수 있고
그리고 두번째는 e As ..... 라고 하는 매개변수
이것은 해당 이벤트에서 읽어낼수 있는 다양한 정보
오른쪽버튼을 위의 경우는 X,Y라는 속성을 e 라는 매개변수(이벤트매개변수개체)에서 얻을수 있고
이것으로 마우스의 위치를 추적을 할수 있고
이런 것이 여러분이 응용할수 있는 자원들이 된다

활용하여 얻은 값을 Form의 Text속성에 주면 폼상의 캡션부분에 표현된다
만약 첫번째 매개변수 Object에서 Form1 개체를 얻어내어 활용하고 싶다면

Me.Text = CType(sender, Form1).ProductVersion & " X=" & e.X & " Y=" & e.Y

와 같이 CType함수를 사용한다
CType외에 다른 방법도 있지만 가장 흔히 사용하는 것
sender As Object 에서 Object타입은 모든 개체의 원본(Base Class)이다
이것을 실제 Form1개체로 바꾸려면, CType(sender,Form1), 즉 sender를 Form1타입으로
Converting 하라..즉 Converting Type하는 것
물론 현재의 상태에서는 그냥 Me.ProductVersion 과 같이 Me를 사용하여도 되지만
나중에 다른 상황에서 많이 사용하게 된다
VBA에서도 개체에 접근하는 것이 가장 중요한 것이고
역시 VB.Net에서도 그런 것이고, 더욱이 VB.Net은 다양한 개체를 조립하여 가는 곳이므로
개체에 대한 구체적인 타입을 알아내고 접근해야 한다는 개념이 항상 머리에
자리잡고 있어야 한다

Form_Click Event
하나를 더 해보면 폼의 바탕을 크릭하면 뭔가를 할수 있을 것이다
아래와 같은 것을 작성해 보자

Private Sub Form1_Click(sender As Object, e As System.EventArgs) Handles Me.Click
    Dim oFrm As New Form1
    oFrm.Show()
End Sub
  

폼을 마우스로 크릭할때마다 같은 폼이 또 만들어진다..



이것의 의미는 여러분들이 폼을 하나 만든다고 한 것(Form1이라는 크래스명)은
Dim oFrm As New Form1
새로운 똑같은 폼이 계속 만들어질수 있다는 것이고
여러분이 처음 만든 Form1 모듈은 그 자체가 하나의 Class 가 되는 것이다
마치 VBA에서 Worksheet를 수도 없이 만들어낼수 있는 것과 마찬가지인것이다

StartUp Form
당연 하나의 프로젝트에는 원하는 만큼 폼을 삽입하여 사용한다
이때 여러개의 폼에서 실행하면 어떤 것이 먼저 떠야 할지 결정해주어야 한다
이런 결정은 Project 속성창에서 모두 해결한다
먼저 실행되어야 할 메인폼을 그림과 같이 결정해주면 된다



Timer | Font | Point | Location | Padding | WithEvents
VBA에서 VB.Net을 하면서 아하!! 이것은 반드시 엑셀과 같이 사용하여야겠구나!!
라고 느끼는 것은 당연 수많은 편리한 크래스들 즉 개체들을 만나는 것이다
그중의 하나 Timer개체라고 하는 것은 참으로 편리하다
VBA서 어떤 시간단위로 어떤 작업을 자동으로 하게 하려면
OnTime 등 매우 불편하고, 좀 버벅거린다, 하지만
VB.Net환경에서 제공받는 Timer개체는 아주 간단하다
예를 들어 매초마다 현재시간을 폼에 써주게 하고 싶다!! 라고 하면

    Public Class Form2
    WithEvents oMyTimer As Timer
    Dim oMyLabel As Label

    Private Sub Form2_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        oMyLabel = New Label
        oMyLabel.AutoSize = True
        oMyLabel.Font = New Font("맑은 고딕", 20, FontStyle.Bold)
        oMyLabel.Location = New Point(10, 10)
        oMyLabel.BackColor = Color.Black
        oMyLabel.ForeColor = Color.Yellow
        oMyLabel.Padding = New Padding(5, 5, 5, 10)

        Me.Controls.Add(oMyLabel)

        oMyTimer = New Timer
        oMyTimer.Interval = 1000
        oMyTimer.Start()


    End Sub

    Private Sub oMyTimer_Tick(sender As Object, e As System.EventArgs) Handles oMyTimer.Tick
        oMyLabel.Text = DateTime.Now.ToLongTimeString
    End Sub
End Class
    



Timer를 담을 변수와 Label 콘트롤을 외부변수로 선언하고
선언만 해보았자 아무소용없으니, 개체로 생성해주고(New)
oMyTimer=New Timer
oMyTimer.Interval=1000
타이머의 이벤트의 발생주기를 1000미리세컨, 즉 1초단위로 하고
그리고 폼이 로딩되면서 실행이 되게 한다
만약 2시간마다 뭔가를 하라고 하고 싶다면
oMyTimer.Interval=2*60*60*1000
하면 되겠지
oMyTimer.Start
그러면 Timer가 작동한다, Start시키지 않으면 그냥 멍청히 있을 것이고
그런데 그냥 시작해보았자 활용을 하고 있는 상태가 아니다
WithEvents 를 달아주면 해당 콘트롤의 이벤트목록을 볼수 있고 사용할수 있다
WithEvents 라는 키워드는 VBA에서도 사용하셨던 분들은 낯섫지 않은 것

개체에는 속성과 메소드 그리고 이벤트..
VBA에서의 이벤트활용보다, 더욱 왕성하게 이벤트를 활용하게 되는 것이
VB.Net이다
개체를 생성하고 이벤트프로시져를 사용하기 위하여 WithEvents도 사용하지만
AddHandler 명령을 사용하여..
AddHandler oMyTimer.Tick, AddressOf oMyTimer_Tick
와 같이 VBA에서 버튼을 만들고 매크로를 연결하듯이 하기도 한다
이것은 나중에 더 많이 이야기 하게 될 것이다
쌤플화일에는 두가지 방식을 모두 표현해 놓았고 각각 설명을 주석으로
달아 놓았다
그리고 StartUp폼은 Form1 으로 해 놓았으니까, 두번째폼을 실행시키려면
StartUp폼을 Form2로 하면 된다

컨트롤을 만들면 반드시 Form의 Controls 집합체에 Add 시켜주어야 한다
하지만 Timer컨트롤은 Form의 Controls집합체에 해당하지 않는 독립군이니까..
그냥 생성만 시키면 된다

***[LOG-IN]***