PROGRAMMING WORKSHOP

VB.Net | 버튼을 런타임에 생성하기

Window폼이나 UserControl이나 ..위에 또 콘트롤을 추가하게 된다
디자인타임에 하기도 하지만..
그냥 빈탕의 폼에 폼이 로딩하면서 콘트롤을 만드는 것도 다이나믹하여 좋다


작업시간도 시간이지만..서식등이 일관성을 유지하게 된다
그런데 개체지향성에 좀 익숙치 않으면 어라#@!# 이것 왜 안되지??
하는 부분이 있다
아래와 같이



VBA에서는 그렇게 말 잘듣던..
버튼의 Name속성이 말을 안듣는다..
ReadOnly라는 팁이 나타난다..
아니..속성창에서는 설정이 되는데 ReadOnly라니!!!
그것 참!!
좌절스러운 순간이 된다..이걸..더 해..말어..
어디가서 물어 볼곳도 없구..그래서 그냥 디폴트 폰트명으로
놓아두고 마는 경우가 있다

아래와 같이 개체를 만들어서 전달하는 것이다

.Font = New System.Drawing.Font("맑은 고딕", 10, System.Drawing.FontStyle.Regular)

.Font.Name속성은 그런 후 읽기 전용만 지원하는 셈이다
쓸때는 위와 같이 Font개체에다가 Font개체를 만들어서
전달하는 것이다
단순한 Name이라는 문자열정보가 아닌..

New System.Drawing.Font(....)

아하.. Font개체를 System.Drawing.Font 메소드로 만들어 주는 구나!!
알면 천국..모르면 지옥이다!!

또한 Left속성이나, Top속성도 VBA에서 아래와 같이 하던것을
물론 이것은 VB.Net에서도 된다

.Left=10
.Top=100

아래와 같이 Point개체를 생성하여 Location개체가 되는 것이다

.Location = New System.Drawing.Point(5, iX * .Height + 5)

또한

.Width=100
.Height=100

의 경우도 Size개체라는 것을 생성하여 Size속성에 전달한다

.Size=New System.Drawing.Size(폭,높이)

아하!!! System.Drawing이라는 NameSpace(개체가 아니다) 에는 많은 지원부대가 있구나!!
라는 것을 접수하시면 된다

아하..System.Drawing에는 아래의 그림과 같이 그리고,칠하고
인쇄하고 하는 그래픽적인 개체들이 줄줄이 들어 있구나!!라는 것을
이해하시고 활용하면 된다



이제 가장 큰 문제는 버튼을 크릭하면 뭔일을 해야 하는데
어떻게 일을 시키나??
VBA에서는 Application.Caller도 있고 OnAction속성도 있어서
버튼에 작업할 내용의 프로시져를 연결하면 되었는데..
윈도우폼의 Button에는 OnAction속성같은 것도 없다

AddHandler라는 명령이 있다
Handler ...어떤 처리를 하는 프로시져를 말한다
어떤 프로시져를 Add한다라는 소리!!
아래와 같이 한다

AddHander oBtn.Click, AddressOf [EventHandler]

즉 버튼의 Click 이벤트를 실행하면 [EventHandler]의 것을 실행하라!!라는 소리다
AddressOf라는 연산자(Operator)는 해당 프로시져에 접근시킨다

Private Sub FormLesson_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For iX As Integer = 1 To 7 Dim oBtn As New Windows.Forms.Button With oBtn .Text = "Button_" & iX .Font = New System.Drawing.Font("맑은 고딕", 10, System.Drawing.FontStyle.Regular) .Left = 5 .Top = iX * .Height + 5 AddHandler .Click, AddressOf ButtonClicked End With Me.Controls.Add(oBtn) Next End Sub Sub ButtonClicked(ByVal sender As Windows.Forms.Button, ByVal e As EventArgs) MsgBox(sender.Text) End Sub

ButtonClicked라는 이벤트를 다루는 프로시져를 작성하면 된다
이때 매개변수 두개는 어떤 이벤트프로시져를 만들던 필수적으로
넣어야 한다
그렇지 않으면 어떤 버튼을 크릭하였는지 알수가 없다
즉 이벤트를 일으킬때(버튼을 크릭할때) 버튼에 관한 모든 정보는
위의 두개의 매개변수속으로 자동전달되게 VB.Net이 처리해주니까..
프로그래머는 Sender개체에서 e 라는 개체에서
정보를 읽고 처리하면 된다
위에서는 단순히 sender개체의 text즉 VBA에서 Caption에 해당하는것을
읽을수 있었던 것이다

이렇게 AddHandler로 이벤트프로시져를 붙여놓으면 하나의 이벤트프로시져로
마음내키는 만큼의 버튼을 공동으로 사용하게 될 것이다
각버튼을 크릭할때마다 아래의 그림과 같이 싱거운 짓을 해보자



색상을 바꾸기..그런데 색상은 또 어떻게 넣지??
위에서 Size개체,Location개체같은 뭐가 또 있나??
올려놓은 쌤플화일을 실행시켜보시기 바란다

***[LOG-IN]***