PROGRAMMING WORKSHOP

.Net FrameWork|Google.GData.Calendar|
ElementHost Control + WPF Control

소루션은 완성이 없다
계속 개선하고 발전시키는 것이 컴퓨터소루션이고..
그래서 Developing이라고 한다
그래서 프로그래머라는 말과 같이 Developer라는 말도 쓴다
계속 전개해 나가는것!!
무엇을 만들고 보면 또 이것이 필요하고..
저것을 만들고 보면 이것을 이렇게 고치고 싶고
왼쪽 그림과 같이 구글에서 정보를 갖고 오는 기능의 패널을
하나 삽입하고 만들고 보니..
처음보는 분들에게는 ..이거..뭐 어떻게 하라는 것이야!!
당연히 도움말이 있어야 한다
어디다 넣지????
탭콘트롤을 하나 삽입하여 [도움말]탭을 하나 만들어야겠다

TabControl을 삽입하고 콘트롤들을 TabPage콘트롤로
모두 이동하면 ..어떤 일이 생길까???
(TabControl을 구성하는 하위 개체는 이름이 TabPage이다)
실행하면 에러가 발생한다..
당연히 에러가 발생하게 된다
왜 그러나??
처음부터 TabControl을 넣고 할껄 그랬다!!라는 후회가 되는 순간이다
집을 찾아가는 행정구역상의 주소가 바뀐셈이다
참조의 개념을 모른다면
까딱하면 죄다 다시 작성하게 된다
특히 초보님들의 경우 그렇게 되기 쉽다
참조의 문제가 생긴다
어떤 콘트롤에 어떤값을 넣고 싶은데 이럴때는
당연히 어떤 컨트롤인지 부모자식간의 상하관계를 잘 추적하여
찾아서 값을 주고 받아야 한다
이것은 엑셀의 범위에서도 마찬가지 였지 않은가??
어떤 통합문서에 있는 어떤 시트의 어떤 범위..
이렇게 족보를 따지면서 찾아가야 할 것이다
프로그래밍에서 참조의 끈을 놓치면 엉망이 되는 셈이다

그런 문제와!!!

또 [도움말]을 작성할 TabPage콘트롤에 도움말을 어떻게
작성하여야 할까??
콘트롤에 줄줄이 문장을 작성하여야 하는데..
어떤 컨트롤이 이런 것을 받아 줄 것인가???!!
Label콘트롤로는 MultiLine이 지원되지 않고
그렇다고 TextBox콘트롤의 MultiLine으로 하여 만든다면
이것도 좀 허접한 느낌이 든다..
뭔 콘트롤에 작성해야할까??!!!

그리고 또..
도움말의 내용은 어디에 저장해 놓을 것인가??
워크시트에 작성해 놓는 것은 좀 너무 초보같고!!!
고수들은 이럴때 과연 어떻게 할까??

왼쪽그림을 보면
콘트롤에 텍스트문서를 나름대로 체계적으로 잘 작성했다
어떤 콘트롤을 사용한 것인가??
WPF 콘트롤을 사용한다
WPF 콘트롤은 Window시스템에 속해있지 않은
Silverlight,WPF,WindowPhone 등의 핵심이 되는 XAML언어를
중심으로 이루어지는 인터페이스중의 하나다
또한 이 모든 것은 .Net FrameWork의 Class Library를
사용하게 되는 것이다
이것을 어떻게 Window폼의 콘트롤에 접목시키는가??라는
문제를 풀도록 하고

또 텍스트 문서의 내용에 웹으로 연결하는 HyperLink를
넣게 된다..
이것 또한 XAML언어를 기반으로 하는 내용을 다루게 되는 부분이다
HyperLink또한 과연 해당 웹페이지가 잘 돌아가고 있는지 허당인지를 알아내여야 한다
또 UNO-Weekly의 경우 HyperLink된 부분을 현재일자에 가장
가까운 월요일페이지로 이동하게 동적으로 유지하여야 한다
그러러면 과연 해당요일에 해당페이지가 있는지
아니면 우노가 게으름을 피우고 안올렸는지 알아야
허당을 치지 않게 된다
이 것도 알아내여야 하는 것이 개발자의 일이다
이런 모든 것을 알아내 주는 것이
.Net FrameWork의 개체를 활용하는 셈이 되는 것이다

또한 텍스트의 내용을 서식을 한다
서식하는 것도 개별적인 해당 개체를 찾아야 한다

정리하여
1)새로 중간에 삽입해 버린 TabControl때문에 변경된 개체들의 참조상의 문제
2)목적에 따른 적당한 콘트롤의 선택(WPF콘트롤)
3)웹페지이의 존재여부의 확인을 위한 개체들은?
4)문장을 작성하기 위한 개체들은?
5)현재일자와 가까운 월요일 UNO_Weekly시트명 만들기
6)WPF콘트롤,Silverlight의 핵심이 되는 XAML문은 과연 어떤것 인가?

아래가 Silverlight쌤플이다
XAML문을 기반으로 하는 .Net FrameWork의 파워중의 하나다
WindowPhone도 이 Silverlight를 기반으로 하여 프로그래밍을
하게 되는 것이다
이 XAML문을 엑셀에 살짝 삽입하여 도움말을 만들어 본다

위의 것이 하나의 App인 것이다
WindowPhone에 들어가면 WindowPhone App인것이고
여러분의 데스크탑에 원도우 프로그램같이 만들어서 사용하면 Client App인것이고
Web페이지에 만들어 넣으면 Web App인 것이고..

이번주 주간강좌에 TaskPane상에 새로 삽입한 TabPage의
UNO-WEEKLY를 크릭하면 이동되는 uno-weekly의 페이지를
크릭한 날짜의 가장 가까운 이전 월요일날짜를 화일명으로 바꾸어서
HyperLink를 하게 하면 해당시트에 이동된다
오늘날짜보다 작거나 같으면서 월요일인 날짜!!를 찾아내는 것은
엑셀의 VBA에서 그리고 엑셀시트상에 잘 만들어 놓을수 있을 것이다
그런데 문제는 UNO가 게을러서 해당월요일날짜의 시트가 없는데
Hyperlink가 만들어졌다면 어떻게 될까???!!!
에러가 있는 시트로 이동이 될것이다
이것은 사용자를 힘들게 만드는 수작이 되는 것이다
이것을 과연 이시트가 웹상에 있는지 확인하는 절차를 갖는다면
좋을 것이다
또한 아예 해당 날짜와 가까운 월요일시트가 없다면
uno-weekly의 첫페이지로 이동하게 한다면 좀더 친절한 소루션이
될 것이다
그렇다면 문제는 해당 홈페이지가 있는지 확인을 하는 절차!!를
어떻게 할 것이냐의 문제인 것이다
여기에서 .Net FrameWork의 파워가 나오는 것이다

아래는 UNO-Weekly를 크릭하면 발생하도록 한 이벤트프로시져이다
UNO-Weekly에는 현재 해당날짜의 해당월요일시트로 하이퍼링크되어있다

Sub Hyperlink_RequestNavigate(ByVal sender As Object, ByVal e As RequestNavigateEventArgs) Try If IsConnectionAvailable(e.Uri) Then Process.Start(New ProcessStartInfo(e.Uri.AbsoluteUri)) e.Handled = True Else Dim sNewUri As String = Split(Right(e.Uri.ToString, 13), ".")(0) If IsNumeric(sNewUri) Then Process.Start(New ProcessStartInfo(Replace(e.Uri.ToString, sNewUri & ".aspx", ""))) End If End If Catch ex As Exception End Try End Sub Public Function IsConnectionAvailable(ByVal oUri As Uri) As Boolean Dim objWebReq As System.Net.WebRequest objWebReq = System.Net.WebRequest.Create(oUri) Dim objResp As System.Net.WebResponse = Nothing Try objResp = objWebReq.GetResponse objResp.Close() objWebReq = Nothing Return True Catch ex As Exception Return False End Try End Function

.Net FrameWork 의 System 의 Net의 WebRequest 크래스
즉 objWebReq변수를 System.Net.WebRequest 크래스타입으로 선언하고
매개변수로 전달 받은 oUri 즉 Uri개체를 사용하여
objWebReq에 Sytem.Net.WebRequest.Create(oUri)
WebRequest개체를 만들어서 이 개체에게 확인을 시키는 것이다
개체내부적으로 어떤절차를 거쳐서 어떻게 만드는지는 우리는
알 필요는 없다..
그냥 이 개체가 하는 일을 잘 알고 일을 시키면 되는 것이다
oUri개체를 포함하고 있는
이개체에게 일을 시키는데 어떤 일을 시키냐 하면
objWebReq.GetResponse
즉 답을 받아 오는 것이다
이것을 어디에 받아들이냐하면
Dim objResp As System.Net.WebResponse 라는 개체타입으로 선언한
변수에 전달 받는 것이다
GetResponse는 답이 없으면 에러가 나게 된다
그래서 해당 시트가 없다면 Catch문으로 이동되게 되는 것이고
그래서 위의 Try문은 의도적으로 필요하게 되는 셈이다
이번주 주간강좌에서 이야기한 VBA의 에러브록을 설정하는 번거로움을
해소시키는 편리한 것이 이 Try~Catch문이라는 점 참고하시고..
에러가 나게 될 소질이 있는 작업인 것이다
GetResponse의 반응이 있으면 True이고 아니면 False인 것!!!

그런데 엑셀에서 HyperLink를 하려면 그냥 웹의 주소만 전달하면
되는데 왜 개체로 만들어서 보내고 받고 할까???
.Net FrameWork상에서 URI개체는 참 중요하다
우리가 생각하기에는 URI 는 그냥 웹주소정도만 생각할수 있는
문자열정보정도로만 생각하겠지만..
이 URI는 많은 정보를 재생산해내는 공장이라고 해도 과언이 아니다
Dim oUri As New Uri("http://www.google.com/intl/ko/googlecalendar/about.html")
위와 같이 하고
oUri가 갖고 있는 자원을 살펴보면 알것이다..
웹주소 하나 전달했는데 뭔 관련된 정보가 이렇게 많지??
아무튼 이렇게 모든 것이 개체지향적이다
세상은 어떤 개체이던지 단일정보 하나만 달랑갖고 있지 않은 것이다
이런 저런 다양한 관련정보를 갖고 있는 것이고
그래서 개체화시켜야 그런 다양한 정보를 관리할수 있게 되는 것이고
체계적올 관리가 될수 있는 것이다

도대체 웹주소하나 달랑받아서 .Net FrameWork가 재가공해주는 정보와
이와 관련된 작업을 해주는 것들은 얼마나 많은가??
이런것을 일일이 외우면 바보다..영어사전을 외우겠다고 드리대는 것과 같다
이것을 만든 사람들의 메뉴얼을 찾아가서 보면 된다
위의 URI개체가 하는 일을 보려면
아래의 주소를 가보면 된다

URI개체(크래스)가 갖은 자원보기

.Net FrameWork를 활용한다고 하는 것은 이런 자원을 활용하는 것이다

필요하면 관련개체를 만드는 크래스의 메뉴얼을 보면
사용예제와 설명과 메소드,속성등이 모두 나와있다
만든 사람들이 제공하는 것이니 세상에서 가장 정확한 정보다
어떤일을 할수 있니 없니 하는 것은 바보짓이다
만든사람들에게 물어보면 된다
개발자들은 또한 이렇게 사용하는 물건의 A/S와 추가정보제공이
확실한 회사들과 관계를 갖는 것이 좋은 것이다

개체..감이 잘 안오시면 그냥 엑셀의 Range개체를
생각하시면 된다
Range개체가 하는 일..보관하고 있는 정보들이 어떤 것들이
있는지..이미 여러분들은 엑셀에서 개체에 대한 컨셉을 다 잡은 것이다
그런데 환경이 좀바뀌면 약간은 어리뻘뻘해질수도 있지만
곧 감을 잡을 것이다..
이미 엑셀을 잘 진행하였다면 기본은 모두 갖춘 것이니까!!!

개체지향적으로 생각한다는 것..
조금만 더 생각해 보자
엑셀은 분석도구가 핵심이다
항상 시트에 테이블을 갖고 있다
테이블의 내용을 분석하기 위하여서는 기본적으로 항상
테이블의 범위를 알아야하고
테이블의 열머리를 알아야 하고
테이블의 순수한 정보가 있는 범위의 주소는 어떻게 되는가?
테이블은 대개가 날짜정보가 있으니까..마지막 날짜는 언제인가?
테이블의 시작되는 날짜는 언제인가?
테이블의 숫자만 들어 있는 열은 모두몇개의 열인가?
테이블의 각 항목은 그룹핑 될수 있는 열이라면 그룹핑하기 위한 유일한 값들은 무엇인가?
등등.. 공통의 작업이 항상 있게 마련이다
이것을 하나의 크래스로 작성하여 필요한 통합문서에서
이 크래스만 불러다가 사용하면 중복되는 코딩을 할필요도 없고
효율적인 방법이 될 것이다
크래스모듈을 하나 삽입하고
사용자가 전달하는 것은 테이블이 있는 시트명만 전달하면
분석에 필요한 테이블의 모든 정보를 쉽게 얻어낼수 있게 한번 만들어두면
두고 ..두고 이곳, 저곳에서 사용할수 있게 될 것이다

도움말 탭페이지를 하나 삽입하고
도움말 탭페이지에 콘트롤을 삽입하여 이곳에 무언가 표현을
해야하겠는데..
윈도우에서 제공하는 콘트롤로서는 재미가 없다
새로운 기술인 WPF(Window Presentation Foundation)으로 구현되는
WPF콘트롤을 삽입하여 사용하기로 했다
그런데 WPF Control은 일반 윈도우콘트롤과 종자가 다른 외계인이다
그래서 윈도우콘트롤과 WPF콘트롤 사이의 교량역할을 하는
ElementHost콘트롤(이것은 윈도우에서 외계인을 받아들일때 사용하는
콘트롤)을 탭페이지에 삽입하여 사용한다

엑셀에서 개체를 삽입할때 OLEObject를 중간에 사용하는 것과
같다고 생각하시면 된다
엑셀에서 외계인(외부프로그램)을 받아들이기 위해 외부프로그램을
통속에 쏙 넣어서 엑셀과 연결고리역할을 하는 개체가 OLEObject인 것이다
아무튼 엑셀만 개체지향적으로 잘 이해하고 있다면
다른 프로그램의 원리는 똑같으니까..버벅거리는 시간이 훨씬
단축된다..그러니 엑셀로 기본을 다지는데 열공하시면서..

WPF usercontrol을 열면 아래와 같이 희안한 창이 나타난다
이것이 WPF윈도우나 Silverlight 개발이나..
Window Phone7이나 모두 같은 형식의 개발환경이다



3개의 창으로 구획된다..하나는 엑셀의 UserForm이나 같은
디자인창과 디자인창에서 표현되는 모든 Control들을
XML형식의 문자열정보로 표현하는 XAML창..
능숙하게 되면 이곳에 그냥 자판질만 해도 콘트롤들이 만들어지게 된다
그러니 실실 마우스질을 해서 콘트롤을 심든가..
그냥 XAML문으로 자판질을 해서 콘트롤을 심든가..
빠르고 능숙한 쪽으로 하면 된다
테스트로 버튼개체를 하나 생성할때



더불어 그림에는 나타나지 않았지만 VB코드창(Behind Code)이 있어서
모두 3개의 창이 기본이다

맨위의 그림에서 보듯이 콘트롤을 하나도 그리지 않았다
물론 XAML에서 표현을 아지 하나도 하지 않았다..
여기에서는 우노의 습관대로 VB코드로 RunTime 에 심도록 한다
엑셀에서 UserForm에 실행되면서 콘트롤이 만들어지듯이!!
여러가지의 기능을 모두 보여드리고 싶으니까..!!

WPF콘트롤의 XAML문으로 문장을 표현하여도 되지만
이렇게 XAML문에 표현하는 것은 declarative syntax 라고 한다
(위의 그림의 XAML창의 표현된 XML문..)
그러나 여기에서는 WPF콘트롤이 로딩될때
프로그래밍적으로 표현하면 아래와 같이 할수 있을 것이다

Private Sub UserControl2_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded Dim textBlock1 As New Windows.Controls.TextBlock Dim oHyper As Hyperlink Dim oRun As Run With textBlock1 .TextWrapping = Windows.TextWrapping.Wrap .TextAlignment = Windows.TextAlignment.Left With .Inlines .Add(New Bold(New Run("이 소루션은?"))) .Add(New LineBreak) .Add(New LineBreak) oRun = New Run("UNO21.COM의 ") oHyper = New Hyperlink(oRun) oHyper.NavigateUri = New Uri("http://uno21.com/") .Add(oHyper) AddHandler oHyper.RequestNavigate, AddressOf Hyperlink_RequestNavigate .Add(New LineBreak) .Add(New Run("우노-프로그래밍워크샵교재로서")) .Add(New LineBreak) .Add(New Run("VSTO에 대한 컨셉를 설명하기")) .Add(New LineBreak) .Add(New Run("위하여 Visual Studio 의 VSTO활용한")) .Add(New LineBreak) .Add(New Run("소루션입니다")) .Add(New LineBreak) .Add(New LineBreak) .Add(New Windows.Documents.Bold(New Run("사용방법..."))) .Add(New LineBreak) .Add(New LineBreak) oRun = New Run("Google.com의 ") oHyper = New Hyperlink(oRun) oHyper.NavigateUri = New Uri("http://www.google.com/intl/ko/googlecalendar/about.html") .Add(oHyper) AddHandler oHyper.RequestNavigate, AddressOf Hyperlink_RequestNavigate .Add(New LineBreak) .Add(New Run("일정관리 Calendar를 사용하는")) .Add(New LineBreak) .Add(New Run("계정을 만드시고")) .Add(New LineBreak) .Add(New Run("구글카렌다에 아이폰이나 스마트폰으로")) .Add(New LineBreak) .Add(New Run("혹은 구글페이지에서 직접입력하거나")) .Add(New LineBreak) .Add(New Run("혹은 이 도구의 정보입력하기 기능으로")) .Add(New LineBreak) .Add(New Run("일정에 대한 사항을 저장하여")) .Add(New LineBreak) .Add(New Run("데이타가 어느 정도 확보된후 ")) .Add(New LineBreak) .Add(New Run("이 도구를 활용하면 구글의 정보를")) .Add(New LineBreak) .Add(New Run("각자의 데이크탑에서 ")) .Add(New LineBreak) .Add(New Run("엑셀화일에 체계적으로 ")) .Add(New LineBreak) .Add(New Run("일정을 관리할수 있습니다")) .Add(New LineBreak) .Add(New LineBreak) .Add(New LineBreak) .Add(New LineBreak) .Add(New LineBreak) .Add(New Run("개체지향적 思考")) .Add(New LineBreak) oRun = New Run("UNO-WEEKLY") oRun.Foreground = System.Windows.Media.Brushes.Olive oRun.FontSize = 30 oHyper = New Hyperlink(oRun) oHyper.NavigateUri = New Uri("http://uno21.com/admin/unoweekly/" & getCurrentWeeklyFile()) AddHandler oHyper.RequestNavigate, AddressOf Hyperlink_RequestNavigate .Add(New Bold(oHyper)) End With End With myGrid.Children.Add(textBlock1) End Sub

허..그것참..뭐가 이렇게 복잡한가??
그러나 가만히 개체지향적사고로 딜다 보면 논리적인 구성인 것이다
아니..vbCRLF라고 줄바꿈을 하면 될 놈의 것을
New LineBreak 이라는 개체를 생성한다니..LineBreak(줄바꿈)
죄다 개체인 셈이다
그래서 Weekly에서 죽기 살기고 개체지향적을 미친놈같이 떠드는 것이다
왜냐면 위와 같이 개체를 사랑하지 않고는 좀더 발전된
프로그래밍은 꿈깨야 하니까!!!
VBA에서 프로그래밍할때는 그냥 술술술..서술적 표현으로 낭만적(?)으로
표현해도 된다..그런데도 개체,개체 하고 우노는 떠든다
좀더 발전하시라는 의미다!!!

위의 문장을 구성하는 Run,Inline 크래스..개체는 .Net FrameWork의
System.Windows.Documents 라는 NameSpace하에 있는 크래스다
문자를 굻은체로 만드는 것 조차도
Dim oBold As New Bold(New Run("xx"))
와 같이 Run개체만들어서 이것을 다시 Bold개체를 만들고
이것을 또 상위개체에 추가시키고 ..원 뭐가 이렇게 번거롭나
이유는 딱 한가지 좀더 다양한 표현을 하기 위한것이고
그러러면 정보가 많아지고..
많아지다 보면 관리체계가 야무져야 하고
그래서 개체가 생기게 되는 것이다
아래의 그림과 같이 Bold개체하에 또 다양한 정보..속성과 메소드, 이벤트
정보들을 담고 있어야 하기 때문이다



예를 들어서
엑셀에서 Characters개체를 기억하실 것이다
셀속의 문장중의 일부분만 떼어낼수 있는 Characters개체
이것에 색상과 약간의 서식을 할수 있는 것이다
그런데 이 중에서 몇개의 문자에만 HyperLink를 달고 싶다는
욕구가 생긴다면 엑셀의 개체에서는 소화시키지 않는다
엑셀에서는 HyperLink개체가 Worksheet소속이고 셀하나단위로
추가시킬수 있을 것이다
그러나 위와 같이 복잡다단하게 하는 것은 문장의 일부분에만
HyperLInk나 다른 서식과 기능을 걸 수도 있게 섬세해 진다는 이야기다
엑셀을 알면 이것도 이해하기가 쉬워진다는 점..
위에서 이야기한 단순한 사이트링크주소만 있는 것같은 URI개체와
같은 이야기다

엑셀은 이미 다양한 개체로 구성된 아주 좋은 트레이닝장이다
엑셀의 개체와 비교하면서 보게 되는 눈을 갖으면
되는 것이다
그러니 엑셀기초를 확실하게 다지시기 바란다!!

프로그래밍적으로 TextBlock(TextBox와는 다른 콘트롤)을
만들어서 Grid콘트롤의 Children집합체에 쏙 끼어 넣는 것



***[LOG-IN]***