PROGRAMMING WORKSHOP

VSTO_10 | System.Windows.Forms.MouseEventArgs

VB 는 뭐고 VB.Net은 뭐냐?? VB.Net은 Visual Studio 종합개발도구에 포함된 Visual basic이라고
생각하시면 좋을 것이다
즉 VB.Net은 Visual basic의 visual studio버전!

이 말은 또 Visual Studio 연합에 포함되면
.Net FrameWork를 사용하는 것이 기본이 되는 것이다
Visual baic의 최종버전은 visual basic 6.0 이고 여기에서 마감되고
버전 7.0에 해당되는 것이 VB.Net이라고 생각하시면 될 것이다
Visual Studio 그 곳에 포함된 VSTO 도 역시 엑셀외 오피스프로그램을 그 연합에
포함시키는 것이고
그 말을 또 Excel이 .Net FrameWork를 자기의 자원같이 활용하게
된다는 소리가 된다

그러니..VSTO..엑셀을 VisualStudio속의 엑셀을 이야기 하다보면 VBA의 비교적 간단한 언어와 VB의 것과 비교를
하면서 보게 되는 것이고, VB를 먼저 시작한 분이면서 엑셀을 모르시는 분이나
VBA를 먼저 시작하여 엑셀은 잘 아는데 VB를 모르시는 분이나
모두 도움이 되는 장소가 되는 것이다

그러려면 아무튼...Net FrameWork를 친구삼아가는 셈이니..
.Net FrameWork...친한 친구의 이름이 되기 바란다

버튼을 크릭하면
Button1_Click
이라는 이벤트프로시져를 찾아서 실행을 하게 됐었는데
VB.Net에서는 전통적인 Visual Basic이나 Visual Basic for Application의
것과 는 헷갈린다
VB.Net에서는 그냥 프로시져 이름을 찾아가는 것이 아니라
두가지 큰 변화가 있다
첫째는 이벤트프로시져를 찾아가는 것이 아니고
이벤트핸들러를 찾아가는 것이다
그래서 이렇게 뒤에 뭔가 낯선 것이 달려 있는 것이다

Private Sub Button1_Click( _
   ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles Button1.Click
   ...이러 저러한 일을 시키고...
   
End Sub

Handles Button1.Click이라는 것이 달려 있다
두번째는 Sender와 E라는 오브젝트를 패라메터(Parameter), 매개변수로
전달하고 있다는 점이다

어떤 이벤트프로시져든 Sender오브젝트를 받는다
혹시 기억하시는가???
VBA에서 버튼을 크릭하고 버튼을 이름을 알아내기 위한
Application.Caller 속성으로 이름을 알아냈었던 것을..
이것은 크릭한 버튼의 정말 가장 기본적인 최소한의 정보를 얻어내었던것이다
그리고 버튼의 위치를 알아내려면 코딩을 좀더 하여야 했다
또한 UserForm의 콘트롤을 보면

Private Sub CommandButton1_Click()
....
End Sub

매개변수가 하나도 전달되지 않는다
그러나 버튼위에 마우스를 실실 움직이면 발생하는
Private Sub CommandButton1_MouseMove(ByVal Button As Integer, _
    ByVal Shift As Integer,_
    ByVal X As Single, _ ByVal Y As Single)

.....
End Sub
기껏해야 전달 받는 매개변수는
마우스의 왼쪽버튼을 누르고 있는지..오른쪽 버튼을 누르고 있는지
그리고 마우스의 X좌표위지와 Y좌표위치등의 정보를 전달 받는다
그러나 VB.Net은 매개변수가 오브젝트로 전달이 된다
오브젝트로 전달이 된다고 하는 것은 전달되는 정보가 다양하다는
이야기가 된다
VB.Net이 되면서...(VB가 .Net FrameWork 를 사용하면서)
완벽한 개체지향적언어(OOP)로 탈바꿈하게 되니
모든 정보는 오브젝트기준이 되는 셈이다

엑셀 VBA에서 수도 없이 크래스모듈을 활용하십시요..제발 활용하십시요!!
라는 말을 귀담아서 잘 활용하고 계셨다면 .Net FrameWork의
온천지가 오브젝트..크래스 판에서 별로 크게 낯선 동네가 아닐텐데#!@


아래와 같이 버튼을 크릭하였을때의 이벤트프로시져에서

Sub myButton_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
매개변수 sender는 As Object라고 범용으로 전달되어
sender에서 해당 오브젝트의 속성이나 메소드를 알아낼수 없다
이것을 해당 오브젝트로 타입을 구체화시켜주어야 한다

Dim oBtn As Button = CType(sender, Button)

위의 구문은 Sender가 그냥 object라고 전달되었는데 이것을 Button타입
오브젝트로 Change Type 해주세요!!! 즉 CType함수를 사용하여
oBtn이라는 Button타입변수에 담어야..
아래의 그림과 같이 다양한 Button오브젝트의 자원을 볼수 있게 되고
활용하게 된다



또한 e As System.EventArgs 라고 한것도
시스템상의 범용의 EventArgs 이벤트아규먼트..즉 이벤트인수..이지
구체적인 버튼의 EventArgs가 아닌 것이다
이것도 아래와 같이 타입변경을 해 주어야 한다

Dim oH As System.Windows.Forms.MouseEventArgs = _
CType(e, System.Windows.Forms.MouseEventArgs)

EventArgs를 폼의 MouseEventArgs로 변화시켜주어야
버튼위에서 왔다갔다한 마우스의 정보를 얻어낼수 있는 것이다

왜 이따위가 필요할까..
좀더 섬세한 프로그래밍을 하자는 소리지!!!
oH.Location.ToString()

이라고 하면 {x=10,y=8 }이라는 마우스위치의 배열을 얻을수 있고..
등등 다양한 정보를 얻게 되는 것이다

실은 엑셀에서도 많은 오브젝트와 속성과 메소드가 있어도
모두 사용하지는 않는다
소루션의 목적에 따라서 필요한 것만 사용하게 된다
그러니 .Net FrameWork에서도 역시 마찬가지다..
자원이 방대하여도 사용하는 것만 사용하게 되는 것이니..
너무 걱정하지 않아도 되는 것이다
예를 들어서 웹페이지를 전문적으로 다루고 싶으면
.Net FrameWork중의 ASP.Net을 다루면 되는 것이고
데이타베이스를 다루려면 ADO.Net을 다루면 되는 것이고..

엑셀소루션을 만들면서 다양하게 사용되게 될 것은
엑셀만 갖고 사용할때의 DAO로 데이타베이스에 접근하던것을
ADO.Net과 같은 자원을 활용하게 될 것이다

이 코너를 목이 빠지게 기다리시는 분들에게 감사하고..
조금씩이라도 정보를 추가하여 나가도록 노력하여야겠다!!!

***[LOG-IN]***