PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net | VBA_XL프로그래밍학습도구만들기

Resource,자원에 보관한 Text화일대신에..XML로...

앞페이지에서 하였던 것과는 다른 방법으로 접근해 보자
코드쌤플이 많아지면, 프로젝트의 Resource(자원)에 보관하기도 그렇고
외부에 xml화일로 저장을 해놓고 불러서 사용하는 방법이 어떨까하는
생각을 하게 될 것이다
이 코너는 실질적인 소루션이 되기 보다는 VB.Net과 VBA의 기능들을 살펴보는
목적으로 보시면 좋을 것이다
그리고, 각자의 현업에 맞는 응용을 하는 도구를 챙긴다는 것으로 이해 하시는 것이 좋겠다
xml을 다루는 도구는 아주 많지만,
가장 세련된 System.Linq.Xml 네임스페이스에 있는 XElement개체를 다루는 기능을
사용하는 것이 좋을 것이고, 이것을 해보도록 하자
XElement를 통한 작업은 LINQ작업을 쉽게 할수 있다
즉 순환하지 않고 명령줄로서 찾고 싶은 데이타를 찾는 작업을 쉽게 하는 것이다
새로 화일을 만들어서 XML을 갖고 놀아 보도록 하자
우선 아래와 같이 새 화일을 만들고 폼의 Load 이벤트에 작성하고 실행 시켜 보시기를

Public Class Form1
    Const XML_FILE_NAME_PATH As String = "http://uno21.com/codes/codelist.xml"

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Const GAP As Integer = 6
        Dim oFont As New Font("맑은 고딕", 9)
        Dim oTxt As New TextBox With {.Left = GAP, .Top = GAP, .Width = 600, .Height = 500, .Multiline = True, .Font = oFont, .ScrollBars = ScrollBars.Vertical}
        Dim oBtn As New Button With {.Left = oTxt.Left + oTxt.Width + GAP, .Top = GAP, .Width = 150, .Height = 25, .Text = "XML화일 전체내용보기", .Font = oFont}
        AddHandler oBtn.Click, Sub()
                                   Dim oList As System.Xml.Linq.XElement = XElement.Load("http://uno21.com/codes/codelist.xml")
                                   oTxt.Text = oList.ToString
                               End Sub

        Me.Controls.AddRange({oBtn, oTxt})
        Me.ClientSize = New Size(oTxt.Width + oBtn.Width + GAP * 3, oTxt.Height + GAP * 2)
    End Sub
End Class

그림과 같이 웹에 있는 XML화일을 간단하게 불러다가 텍스트콘트롤에 표현했다



Dim oTxt As New TextBox
With oTxt
    .Left = GAP
    .Top = GAP
    .Width = 600
    .Height = 500
    .Multiline = True
    .Font = oFont
    .ScrollBars = ScrollBars.Vertical
End With
VBA에서와 같이 위와 같이 작성해도 되지만,
새로운 언어의 발전에 발맞춰서..단축형을 사용하시는 것이 바람직 합니다
아래와 같이..

Dim oTxt As New TextBox With {.Left = GAP, .Top = GAP, .Width = 600, .Height = 500, .Multiline = True, .Font = oFont, .ScrollBars = ScrollBars.Vertical}

어느 것이 편리한 것인지는 자명한 일..
또한 버튼의 크릭이벤트를 사용하기 위한 AddHandler 에서 아래와 같은 표현은

AddHandler oBtn.Click, Sub()
						Dim oList As System.Xml.Linq.XElement = XElement.Load("http://uno21.com/codes/codelist.xml")
						oTxt.Text = oList.ToString
				End Sub

위의 표현은 Lambda 표현식으로 같은 라인상에 표현하는 편리한 방법이다
Lambda 표현식이 없다면 아래와 같이 별도의 프로시져를 만들고, 호출해야 한다
간단한 작업은 이렇게 Lambda 표현식을 사용하는 습관이 좋다,
VB.Net을 세련되게 사용한다면


''내부의 개체를 외부변수로 해야 하고..
Dim oTxt As TextBox 
 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
 ...
 ...
 ...
 AddHandler oBtn.Click, AddressOf btn_click
 ...
 ...
 End Sub
 Sub btn_click(obj As Object, e As EventArgs)
        Dim oList As System.Xml.Linq.XElement = XElement.Load("http://uno21.com/codes/codelist.xml")
        oTxt.Text = oList.ToString
 End Sub

Lambda 표현식으로 표현한 라인상의 프로시져는 프로시져의 제목이 없다
그래서 이것을 Anonymous Event Handlers(익명의 이벤트핸들러)라고 한다
그래도 delegate라는 것이 뭔지 간단하게 쌤플을 만들어 보자
delegate는 lambda, linq등과 없어서는 안될 VB.Net에서의 표현들이다

아래를 새로운 폼을 하나 삽입한후 복사하여 붙여 넣고
실행 시켜 보시기 바란다(쌤플화일에 포함시켰지만,해보시기를..)

Delegate가 뭔가?

Public Class Form2

    ''delegate는 어떤 메소드에 매개변수로 함수를 전달하기 위한 역할을 한다
    '' 아무튼 delegate는 왜필요하냐는 주목적은 어떤 메소드에 함수를 전달하기 위함이라는 점!!!
    '' 아래의 예문에서 어떻게 사용하는지 잘 관찰하셔서
    '' VB.Net에서는 Delegate, Rambda 표현식, Linq 언어등을 모르면
    '' VB.Net을 사용하는 보람이 없다!!!
    Public Delegate Sub greeting(sName As String)

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim oFnt As New Font("맑은 고딕", 9)

        '' 아래와 같이 rambda 표현식으로 하여도 되고////////////////////////////////////
        Dim oBtn As New Button With {.Left = 6, .Top = 6, .Width = 100, .Height = 25, .Text = "아침인사", .Font = oFnt}
        AddHandler oBtn.Click, Sub()
                                   Dim oQ As New greeting(AddressOf morningGreeting)
								   ''Invoke메소드에 delegate에서 원하는 매개변수를 전달했다
                                   oQ.Invoke("홍길동")
                               End Sub
        '' 이렇게 별도의 이름있는 프로시져를 사용해도된다
        '' 여기에서는 rambda 표현식을 강조하는 것이니 위와 같이 하시고, 아래는 참고하시기를..
        'AddHandler oBtn.Click, New EventHandler(AddressOf button1_click)
        ''혹은 약식으로...
        'AddHandler oBtn.Click, AddressOf button1_click
        ''////////////////////////////////////////////////////////////////////

        ''두번째 버튼도 마찬가지..////////////////////////////////////////////////////////
        Dim oBtn1 As New Button With {.Left = 6, .Top = oBtn.Top + oBtn.Height + 3, .Width = 100, .Height = 25, .Text = "오후인사", .Font = oFnt}
        AddHandler oBtn1.Click, Sub()
                                    Dim oQ As New greeting(AddressOf afternoonGreeting)
                                    oQ.Invoke("일지매")
                                End Sub
        '' 이렇게 별도의 이름있는 프로시져를 사용해도된다
        '' 여기에서는 rambda 표현식을 강조하는 것이니 위와 같이 하시고, 아래는 참고하시기를..
        'AddHandler oBtn.Click, New EventHandler(AddressOf button2_click)
        ''혹은 약식으로...
        'AddHandler oBtn.Click, AddressOf button2_click
        ''////////////////////////////////////////////////////////////////////

        Dim oLabel As New Label With {.Name = "myLabel", .Left = 6, .Top = oBtn.Top + oBtn.Height * 2 + 3, .AutoSize = True, .Font = New Font("맑은 고딕", 14)}

        Me.Controls.AddRange({oBtn, oBtn1, oLabel})
        Me.AutoSize = True


    End Sub
''event 에서 AddressOf로 참조하는 프로시져..
    Sub button1_click(sender As Button, e As EventArgs)
        Dim oQ As New greeting(AddressOf morningGreeting)
        oQ.Invoke("홍길동")
    End Sub
    Sub button2_click(sender As Button, e As EventArgs)
        Dim oQ As New greeting(AddressOf afternoonGreeting)
        oQ.Invoke("일지매")
    End Sub

''event 에서 Lambda 표현식에서 delegate를 통하여 직접참조하는 프로시져
    Sub morningGreeting(sX As String)
        Me.Controls("myLabel").Text = "안녕하세요[" & sX & "]님 좋은 아침입니다"
    End Sub
    Sub afternoonGreeting(sX As String)
        Me.Controls("myLabel").Text = "안녕하세요[" & sX & "]님 좋은 오후입니다"
    End Sub

End Class

실은 매개변수로 프로시져를 전달하는 것은
VBA에서도 있었다
버튼이나 도형을 만들고,
OnClick 메소드에 실행시키고자 하는 프로시져이름을 문자열로 전달하였으니까..
그런 개념으로 생각하시면 아하!! 하게 되실 것이다

System.Xml.Linq.XElement를 익숙하게 하자..

현대 프로그래밍을 하는데 몰라서는 안될 것이 XML 화일를 다루는 것이다
XML화일을 다루는 개체들은 VB.Net속에는 다양하게 있지만
VBA에서 외부라이브러리(이것도 다양한 버전에..)를 참조하고, 번접을 떨었던 기억이 나실 것이다
VB.Net에서는 간단하게 처리할수 있다
가장 바람직한 System.XML.Linq 즉 linq 네임스페이스에 있는 XElement와 XDoucment개체이다
XDocument는 잊어먹어도 좋고 간략하게 XElement개체를 즐기는 것이 좋다
그래도 조금 설명하자면 말그대로 xDocument는 xml문서자체를 가져다 다루는 것이고
xElement는 말 그대로 일부분(Element)를 가져와서 다루는 것이지만,
문서자체를 통째로 하나의 부품으로 보고 xElement로도 갖여 오는 셈이니
xElement를 사용하는 것이 편리하다
아무튼 첨부화일에 두개를 비교하여 놓고
xElement를 사용하도록 하자

컴퓨터도 써피스로 바꾸고, Visual Studio도 2019버전으로 바꾸고
새로운 마음으로
위의 진행내용 무시하고 다시 만들었다
여러분도 visual studio 2019 community version은 무료이니
다운 받아서 새롭게 사용하여 보시기를..



윈도우폼이 콘트롤들은 모두 아래의 xml화일정보의
내용을 처리하기 위하여 xml 화일을 xElement개체를 활용하여
마음대로 불러서 만들게 되는 것이다
그러니 그렇게 간단하고 편리한 것을 안배우겠다고 버티면 뭔 배짱에, 뭔재미..