반응형



중국 광저우 아시안게임 보느니라 정신을 놓고 있네요.

선수들 전부 다 잘 해줄 것이니 …

각설하고, 오늘 해볼 것은

프로젝트가 다른, 다시 말해 네임스페이스를 달리하는 Class Library  사용법을 해 보도록 하겠습니다.

별거 없지만… 그래도 모르는 분도 있을 것이며,

이게 능수 능란하지 않으면 공개 소스들 보고도 귀찮은 상황이 벌어지기도 합니다.

자 그럼 따라 해 볼까요?

일단 새 프로젝트를 만들고




현재 솔루션 탐색기는 이런 모양입니다.




솔루션 탐색기에서 아래 그림을 따라 실행 하세요




솔루션(Solution ‘ClassLibrary2) > 추가(Add) > 새 프로젝트(New Project) 랍니다.

프로젝트 추가 창이 뜨면  Windows Phone Class Library 템플릿으로 새로운 프로젝트를 만들어 봅시다.





그리고 솔루션 탐색기에 새로운 프로젝트가 추가 된 것을 볼 수 있을 겁니다.




testClassLibrary 라는 프로젝트가 하나 추가 되었죠?




Class1.cs 파일을 열어보면 public class Class1 이라는 클래스가 생성되어있고

해당 클래스는 testClassLibrary 라는 네임스페이스로 묶여 있습니다.

정리하자면 testClassLibrary.Class1 이라는 클래스로 불러오게 될 구성이 만들어진 것이죠

참고로, Class1.cs파일을 파일명을 바꾸셔도, 그렇지 않으셔도 됩니다.

Class1 이라는 클래스명과는 관계가 없으나 코딩을 하다 보면 명시적으로 명칭을 정하는 게 더 보기 좋기는 하죠.

그럼 public class Class1 을 구성해 봅시다. 저번 포스트처럼 !



namespace testClassLibrary
{
    public class Class1
    {
        #region Instant Difinition
        /// <summary>
        /// Class1의 property
        /// string type : returnString
        /// </summary>
        private string returnString = null;                                           // 1
        #endregion

        #region public string getString
        /// <summary>
        /// getString method 를 정의 한다.
        /// 현재 날짜/시간을 returnString 에 할당 후 그 값을 반환한다.
        /// </summary>
        /// <returns>this.returnString</returns>
        public string getString()                                                     // 2
        {
            this.returnString = DateTime.Now.ToString();                     // 2-1
            return this.returnString;                                                  // 2-2
        }
        #endregion
    }
}



일단 간략하게 설명부터 하겠습니다.

testClassLibrary 이라는 네임스페이스의  Class1 클래스

1. Member Property 선언 (.NET API에선 variable 이라 하지 않고 property 라고 하더군요)

  - private 접근 지정어의 string 형 변수 returnString을 선언하고 null 값으로 초기화

  - private 접근 지정어 때문에 Member Method로만 취급가능.

2. Member Mehotd 정의

  - public 접근 지정어의 string 형 값을 반환하는 getString Method

  - public 접근 지정어를 사용한 이유는 다른 namespace에서 사용 할 것이기 때문.

  2.1 Class1의 Member Property 인 returnString에 현재날짜와 시간을 string형으로(ToString Method) 할당.

  2.2 Class1의 Member Property 인 returnString을 반환.

좀 중복되는 이야기가 많아서 그렇지 이해는 될 겁니다. 저번 포스트랑 차이가 없으니까요.


참고)

#region … 아래에  /// <summary> 는 제가 직접 타이핑 한 것이 아닙니다.

코드 헬퍼가 자동으로 만들어주는데요 거기에 데이터만 추가 한 것이죠.

사용 방법은 다음과 같습니다.

#region blah blah … 에서 한 줄 내리고  /// 를 치면 자동으로 생성 됩니다.

한번 해보세요? 잘 되죠? 팁입니다. (알 사람은 다 아는 팁)


자 그럼 클래스가 다 구성되었으니 원래 프로젝트로 돌아가죠!


여느 때와 다름없이 저는 또 이렇게 구성합니다!

그리고 Button을 더블 클릭하여 이벤트 핸들러가 취급할 메서드를 자동으로 생성합시다.





일단 namespace가 다른 것을 확인 하셔야 합니다.



자 우리가 만든 testClassLibrary namespace를 사용하려면 선언을 해 주어야 하는데요.

using testClassLibary;


코드를 추가해보죠




에러가 뜹니다.

해당 클래스의 참조가 없어서 네임스페이스를 사용 할 수 없어서 인데요.

방법은… 다시 또 따라 해봅시다. 한번 행하는 게 더 빠르게 이해됩니다. 이건 상용적인 행위니까요.




해당 솔루션 > 프로젝트에서 Reference > Add Reference... (Reference : 참조 란 뜻이죠..어?!)




Add Reference 창이 뜨는데 Projects Tab을 여시면 솔루션 이하 프로젝트가 뜹니다. 그리고 OK!


그럼 시술 전과 시술 후 추가된 Reference 항목이 보일 겁니다.


   ->  


그럼 더 이상의 에러메시지는 나타나지 않게 됩니다.

그럼 이제 또 코드를 구성해 봅시다.




namespace ClassLibrary2
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        #region private void button1_Click
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            testClassLibrary.Class1 tmpClass = new testClassLibrary.Class1();   // 1
            string msg = tmpClass.getString();                                                  // 2
            MessageBox.Show(msg);                                                             // 3
        }
        #endregion
    }
}



뭐 쉽죠?

1. testClassLibary 네임스페이스의 Class1 타입의 인스턴스 tmpClass 을 동적으로 생성.

2. string형 지역변수 msg에 tmpClass의 getString 메서드의 반환 값(현재 날짜와 시간) 할당
3. msg를 메세지 값으로 하는 메시지박스 출력.


디버그 버튼을 눌러 마지막 확인 해보실까요?



  ->


역시나 잘 되는군요.

네임스페이스가 다른 클래스 라이브러리 사용법은 이것으로 끝입니다.




다음 포스팅 내용은 대충 정리가 되어가고 있습니다.

http://www.charlespetzold.com/phone/index.html

제가 아잉폰을 구매한 후 출퇴근 시마다 짧게 보고 있는 pdf책입니다.

여기서 쉽게 설명 가능한 부분을 예제를 이용하여 ( 책의 예제는 보는 이에 따라선 쌩뚱 맞을 수도 있으니까요)

해보도록 해보겠습니다.

내용이 중요한 게 많아서 그냥 개개인더러 보라 넘길 수가 없더군요.

반응형
반응형




정말 오래간만에 포스팅 합니다 ㅎㅎㅎ

다름이 아니라 제가 요즘 아잉폰이 와서 좀 가지고 논다고 -ㅅ-

하지만 맥이 없어서 앱 개발은 못해보는군요 물론 개발자 등록도 안되어있지만 ㅋㅋ

오늘 아잉폰 덕에 찰스 페졸드 아저씨의 프로그래밍 윈도우즈 폰 7 pdf를 보고 있습니다.

찰스 페졸드 아저씨 다들 아시죠?

제가 아저씨라고 쉽게 말 하고 있지만 이 분은 Microsoft Press류 책 좀 보신 분들은 아실 겁니다. 꽤 유명하신 분입니다.

이분야 에선 진정한 고수반열에 오르신 분이죠. … (하지만 사진으로라도 뵌 적은 없습니다)


제가 공부하고 있는 상황을 알려드리자면 (아직 15페이지 밖에 못 봤습니다. 올 영문이라 -ㅅ-)

1. 초기에 나오는데 일단 우리가 만드는 프로젝트 자체를 실버라이트 어플리케이션이라고 부르시더군요.

그래서 혹시나 하고 봤더니 프로젝트 선택에 실버라이트 어플리케이션 템플릿을 선택해도 같더군요! (너무 썰렁한가)

2. XAML 을 자멜 이라고 부른다고 하더군요 -ㅅ-. 사멜? 자멜? …뭐 그렇답니다.

부가적으로 폼 디자인에 들어가는 XAML과 관련 XAML파일들은 WPF(Windows Presentation Foundation)을 따른다고 합니다.

뭐 지금까지 본건 이정도 네요. 물론, 지금은 화면해상도가 어쩌고, 픽셀은 포인트로 바뀔 때 이렇게 계산된다 이 부분을 보고 있습니다. 영어 해석은 잼병이라 좀 걸리네요 ~_~.


관련 자료는 다른 블로그에 누군가 직역 + 의역으로 해석해주시는 분이 계신 거 같던데 거길 참조해주세요 ~_~.

저는 그냥 느끼듯이 읽어 내려가서 설명하기 어려운 부분이 많군요.

이럴 줄 알았으면 20대 초에 번 돈 노는데 쓰지 말고 어학연수나 다녀 올걸…



자 오늘은 Class Library 사용법에 대해서 잠깐 써볼까 합니다.

언제나 같이 따라 하면서 익히세요.

VS.NET 에서 제공하는 언어들의 Class Library 만드는 법과 동일합니다. 혹 알고 계신 분은 패스~

우선 테스트도 해야 하니 기본 어플리케이션 템플릿으로 프로젝트를 만드세요




지금부터 잘 보세요




푸른색 화살표가 가르키는 항목은 “솔루션” 이라고 합니다.

붉은색 화살표가 가르키는 항목은 “프로젝트”라고 합니다.

눈에 익혀두시길…

클래스라이브러리는 만드는 방식이 프로젝트 단위로 가져올 수 도, 동일 프로젝트 내에 둘 수도 있습니다.

엄밀히 따지자면 동일한 네임스페이스 아니냐 이지만, 동일 프로젝트 내에서 파일을 만들어서 네임스페이스를 따로 둘 상황이라면 초보 거나 조금 특이한 상황일겁니다.

오늘 해 볼 것은 동일한 프로젝트 내, 다시 말해 동일한 네임스페이스 내에서 클래스를 만들어 사용 해 보겠습니다.

(다음시간엔 뭘 해야 할지 나와버리는군요! ㅎㅎ)

이 녀석입니다.



저는 이렇게 했습니다.





그리고 Add 누르셔서 만드시면.




추가 된 것을 확인 하실 수 있을 겁니다.

자 네임스페이스가 동일한지 확인 해 봐야겠죠?

   


당연히 동일 해야죠 ~_~..

자 그럼 우리는 HelloClass.cs 에 멤버 메서드를  추가 해 봅시다.



#region public string HelloString
public string HelloString()
{
    return "Hello Class";
}
#endregion



추가한 멤버 메서드는 위와 같고 설명을 드리겠습니다.

public 의 string값을 반환하는 HelloString이라는 메서드가 되겠습니다.

public 은 접근 지정어로 모든 곳에서 접근, 사용이 가능하다 라는 의미로 받아들이면 되겠습니다.

참고로 쓰지 않으며 private로 디폴트로 설정이 됩니다.

private는 상속받은 클래스나, 동일 클래스만 사용가능이 되겠습니다. (기타 세세한 건 찾기 귀찮으므로 패스~)

그리고 해당 메서드의 리턴값은 “Hello Class”가 되겠군요.

참고로 #region ~ #endregion 은 보기 좋게 묶을 때 사용하는 매크로성 예약어 입니다.

코드작성 하는 곳 좌측에 열림 표시 보이죠? 저걸 마우스로 클릭하게 되면





이렇게 됩니다. 좋은 기능이죠. 코드 짤 때, 이전 코드 반영시켜가면서 새로 짤 때 쓰면 상당히 좋습니다.

그냥 보기도 좋고 … ~_~

자 그럼 클래스를 만들었으니 사용해 봅시다.

디자이너로 돌아와서 Button 하나를 올리고 이벤트 등록을 합시다. (버튼 더블클릭!)




코드를 저는 이렇게 구성합니다.

 

private void button1_Click(object sender, RoutedEventArgs e)
{
    ClassLibrary.HelloClass hc = new ClassLibrary.HelloClass(); // 1
    string str = hc.HelloString();                                                 // 2
    MessageBox.Show(str);                                                     // 3
}



아까 이야기한 접근지정어 private이 나왔군요!

설명들어갑니다.

1. ClassLibrary 네임스페이스의 HelloClass 의 객체 인스턴스 hc에 동적으로 만들어서 할당.

-> 참고로 네임스페이스는 동일하기에 ClassLibary라는 부분은 빼도 상관없습니다.

     다음 포스트에서 볼 것이랑 길이가 다르면 헷갈릴 테니 그러는 것 뿐입니다.

2. string형 변수 str에 hc의 HelloString() 메서드의 결과 값 할당.

3. MessageBox.Show(string ..) 메서드로 str값 출력. (그냥 str값이 출력되는 메시지 박스가 뜹니다)


자 그럼 우리가 좋아하는 디버그로 결과를 보죠!



에뮬레이터가 뜨면 버튼을 클릭.

     


어떤가요? 참 쉽죠잉~

단순히 string값만 처리 했지만 원래는 다른 컨트롤 변수도 똑같이 제어가 가능하답니다.

어흑 벌써 12:30분 ~

저는 잘 시간입니다. 다음 포스트 최대한 빨리 올릴게요 ^-^

반응형
반응형



아 그냥 자기 뭣해서 바로 포스팅 합니다.

오늘 할 것은 Media Player 만들기 2번째

MediaPlayer 라는 녀석을 써 보려 합니다.


- MediaPlayer

좋은 자료를 찾았습니다. 우리가 할게 이것을 응용한 것이죠 ~_~.
http://msdn.microsoft.com/ko-kr/library/ff634558.aspx


백문이 불여일코딩 입니다. 따라 해 보시죠~

일단 프로젝트를 만듭시다. 템플릿은 기본으로오~




디자이너에서 TextBox를 이렇게, 그리고 버튼을 놓습니다.

TextBox 컨트롤의 명은 textBox1 일 텐데 Text Propertie 를 수정합니다

http://www.robtowns.com/music/blind_willie.mp3

요 녀석으로 !

그럼 아래와 같이 되겠죠?




자 바로 MediaPlayer를 생성했는데 없다고 하네요?

MediaPlayer 라는 타입 또는 이름의 네임스페이스가 없다는 메시지입니다 (해석 어렵지 않죠?)

그럼 그 녀석이 있는 걸 참조로(Reference) 추가를 해야겠군요. 이건 C#, 아니 VS.NET의 기본이죠!





제가 다 찾아놨습니다. 아래와 같이 따라 하시면 되겠습니다.

[시술 전]



[시술 과정 1]



[시술과정 2]



[시술 과정 3 - 그냥 넘어갑시다… 피곤해서 ㅎㅎ]



[시술 후]



자 참조를 추가했으면 네임스페이스를 선언해야 합니다

아래와 같이 선언 ㄲㄲ




추가되는 텍스트는 아래에서 긁으셔도 됩니다.

익숙하신 분은 using 스페이스 Microsoft. 찍어서 찾아서 하시겠지요. 코드 헬퍼 짱 입니다요~

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Media;

그리고 이렇게 button1 을 더블 클릭하여 클릭 메서드를 만든 후

다음과 같이 코드를 추가합니다.



private void button1_Click(object sender, RoutedEventArgs e)
{
     FrameworkDispatcher.Update();                          // 1

     Uri uriStreaming = new Uri(this.textBox1.Text);        // 2
     Song song = Song.FromUri("StreamingUri", uriStreaming);// 3

     MediaPlayer.Play(song);                                // 4

}



또 간략한 설명!



1. 파워의 상태나 미디어가 업데이트 되면 호출해줘야 한다는 군요.

    msdn코드샘플엔 없던데, 에뮬레이터 오류인지 모르겠군요. 일단 넣어야 예외가 발생하지 않으므로 추가

2. Uri의 객체 uriStreaming 에 textBox의 Text Propertie 의 값을 인자로 하는 Uri객체를 동적으로 만들어 할당

3. Song의 객체 song에 Song 클래스의 멤버 메서드  FromUri에 위와 같은 두 인자를 넣은 리턴 결과를 할당.

   - 말은 어렵지만 Song을 생성한 후 우리가 원하는 Uri값으로 된 Song을 만들어 할당한 겁니다.-

4. MediaPlayer.Play 호출 인자는 우리가 만든 지역변수  song




MediaPlayer는 왜 변수화 하지 않느냐라는 질문을 하실 수도 있는데,

MediaPlayer를 찍고 go to Difinition 해보시면 Static Class로 정의 되어 있는 것을 보실 수 있을 겁니다.




현재 API상으로는 MediaPlayer 클래스는 음악 파일만 재생이 되는 거 같군요.

VS9.0 에서의 MediaPlayer와 차이가 있는가 봅니다.

Reference를 잘 찾아보질 않아서 대충 말하는 겁니다. 정답은 아니에요~_~




그럼 디버그로 확인해보죠

 




뭐 당연히 됩니다

에뮬레이터를 종료할 때 문제가 생기는 것을 제외하고는요.




제가 에뮬레이터의 문제라고 생각하는 이유가

http://msdn.microsoft.com/ko-kr/library/ff634558.aspx 

위 자료를 찾은 곳이

http://msdn.microsoft.com/ko-kr/library/microsoft.xna.framework.media.mediaplayer.aspx

이곳의 하위 인데 말이죠.

문서 하단을 보시면


Platforms


Xbox 360, Windows 7, Windows Vista, Windows XP, Windows Phone 7



이 보입니다.

ㅎㅎ 버그가 아니라면 되야 정상이란 거죠 ~_~

그러니 에뮬레이터 문제로 치부 ㄲㄲ





그럼 이제 뭘 포스팅 할지 내일 또 고민해 봐야겠습니다.

여러분 다음 포스트에서 만나요~~~


ps. 너무 피곤해서 대충 썼으니 이해 바래요 ㅠㅠ

반응형
반응형



오늘 대박 늦잠을 잤네요.

춥기도 하고 … 밤새 좀 포스팅 쓴다고 바빴더니… ㅎㅎ


오늘은 코드샘플을 뒤져서 간략한 예제 프로그램을 만들어 볼까 합니다.

너무 이른 듯 하지만!!!!

Media Player!!!!!!!!!!!!!!!!!!!!!!!!!

뭐 거창하게 말해도 이건 그냥 MP3플레이어 라 보시면 됩니다. ㅎㅎㅎ

자 이제 제 스타일을 아셨을 테니 그냥 따라 하시면 됩니다.

빈 프로젝트를 생성합니다. 이름은 그냥 MediaPlayer





일단 빈 프로젝트가 열리면 우리는 사용할 컨트롤이 어느 라이브러리에 속해 있는 지 알아봐야겠습니다.

왜냐?  Toolbox에는 미디어 플레이어가 없거든요

… 네? 있습니다! 졸고 계신 분 있지 않나 해서 한번 테스트 해봤습니다.

아래 보시다시피 MediaElement 가 그런 녀석이죠.




하지만 모두가 아시다시피 마이크로소프트 개발도구에 딸려온 기본 컨트롤은 이상하게 제약이 많았더라…

네! 그래서 찾아봤습니다. VS9.0 기준으로 두 가지로 분류가 나뉘더군요

http://msdn.microsoft.com/ko-kr/library/aa970915(VS.90).aspx

그냥 보세요. ~.~ 다음 포스트에서 두 번째 것을 해볼 테니까요.

MSDN을 따르자면 다음과 같습니다.

오디오 비디오 각각 또는 둘 다 재생하는 도구로는 MediaElement 클래스 와 MediaPlayer 클래스가 사용이 됩니다.

두 클래스는 유사점을 을 가지고 있고 서로 응용해서 쓸 수 있다고 하는군요.

(여기서부터 제 생각 입니다)

하지만 역시나 MediaPlayer 클래스가  MediaElement  클래스보다는 조금 더 동적인 것 같군요.

그래서 두 가지 다 해보겠지만 오늘은 시간상 (벌써 10시 52분 오후!) MediaElement예제를 간단히 해보겠습니다.


MediaElement


MediaElement 컨트롤을 툴 박스에서 디자인으로 드래그엔 드롭, 그리고 동작을 시키기 위한 버튼 을 드래그 앤 드롭.





MediaElement 컨트롤을 좀 키워봤습니다.

이런 모습이네요.

제가 여러 동영상과 음악 링크를 구했습니다.

검색엔진에서 sample avi, movie, mp3 등 쳐보시면 구해 질 수 있는 것 입니다.

http://www.jhepple.com/support/SampleMovies/WindowsMedia.wmv

http://www.jhepple.com/SampleMovies/niceday.wmv

http://www.jhepple.com/SampleMovies/niceday.asf

http://www.robtowns.com/music/blind_willie.mp3


테스트 해 볼 녀석들 입니다.

XAML 파일은 따로 건드리지 않을 거니 바로 비하인드 코드로 가봅시다.
그럼 버튼을 더블 클릭하여 해당 메서드로 이동 고고싱~ 싱나게~!




간단하게 코드를 구성 해 보았습니다.

private void button1_Click(object sender, RoutedEventArgs e)
{
    this.button1.IsEnabled = false;                                                                            // 1

    Uri u = new Uri("http://www.jhepple.com/SampleMovies/niceday.asf");     // 2
    this.mediaElement1.Source = u;                                                                          // 3
    this.mediaElement1.Volume = 100;                                                                       // 4
    this.mediaElement1.Play();                                                                                 // 5
}



간략한 설명!

1. 버튼의 상태를 사용할 수 없게 만들기

2. Uri 객체 u를 생성합니다. 웹에 있는 파일을 로드 하게 되는데 그 주소는

http://www.jhepple.com/SampleMovies/niceday.asf

3. mediaElement1 객체의 Source 라는 Propertie 에 위에 생성한 u를 할당.

4. 혹시나 재생이 되는데 소리가 안 나올까 mediaElement1 객체의 Volume 이라는 Propertie 값을 100 으로!

5. mediaElement1 객체의 재생 메서드 Play();

그리고 디버깅으로 확인 해 보시져~




 


어플리케이션 구동 후 Button을 누르면 사용 불가능 상태로 바뀌는군요. 여기까진 OK!

하지만 재생이 안되네요. 아닙니다. 로딩이 긴 겁니다. 기다려봐요~

여러 번 Button을 눌러 혼선을 줄 사용자를 위해서 첫 코드를 버튼 비활성화 시켰지요.





짠 나왔죠?

사실 약간의 불안함이 있습니다.

에뮬레이터라 그런 것 같기도 하고 프로그래스 바를 만들어 확인해보지도 않아서 자세히는 알 수가 없죠.

그래서 제가 준비해온 mp3링크를 가지고 해보시면 잘 나옴을 알 수 있을 겁니다.

다음 포스트에서는  MediaPlayer 클래스를 사용해 봅시다


반응형

+ Recent posts