블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2804)
Unity3D (860)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

키다운 이벤트나, 키업 이벤트등에 키이벤트를 추가하면 된다.

예) 컨트롤+엔터 를 단축키 지정.


private void TextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)

{

      if (e.Modifiers == Keys.Controls)

      {

          if (e.KeyCode == Keys.Enter)

          {

                MessageBox.Show("컨트롤+엔터 눌렀음");

          }

       }

}

반응형
Posted by blueasa
, |

Win App 에서는 폼간의 전송이 빈번하게 발생하지요.

웹에서는 페이지간 또는 팝업등에서 유사한 경우입니다.


먼저 왜 부모와 자식이라는 단어를 쓰는가에 의미를 둬 봅시다.


원래부터 있던 메인을 부모라고 칭하고
그 폼에서 파생되어 나온 작은 폼을 자식이라고 합니다.

자식이 부모보다 키가 작으란 법은 없으니, 부모폼은 버튼 하나만 달랑 있어도

자식폼은 거대한 application이 될 수도 있습니다. ^^;


일단 부모는 폼이 있으면 메인이 되겠지요.

사용자 삽입 이미지

여기서 "자식에게" 버튼을 누르면
위에 있는 textbox에 넣은 글을 보낼 겁니다.

우선 자식을 생성해야겠죠?
폼로드때 자식을 하나만 생성해봅시다.
사용자 삽입 이미지

그리고 button1 이벤트에서 자식에게 메세지를 보낼겁니다.

예제이고, 간단한테스트니 자식폼에 있는 Label에 바로 입력하도록 합시다.

자식으로 객채 생성한 곳에
child.label1.text  이렇게 값을 주고 싶다면

자식폼에 있는 Label 속성을 변경해 줍니다.

private , public 을 변경해 주는 거지요.

사용자 삽입 이미지


자 그러면 바로 접근이 가능해 집니다.


이제 아래와 같이 코딩을 하고 실행해서

부모폼의 버튼을 누르면 자식에게 대화가 전달됩니다. 참 쉽죠?

사용자 삽입 이미지


그런데!

부모는 자식에게 일방적으로 말을 할수 있지만


자식이 부모에게 말을 할려면

"아버님 소자의 얘기좀 들어주시겠습니까?"

라고 허락을 받아야만 합니다.

그리고 부모는

"난 언제나 니 얘기를 들을 준비가 되었다" 라고 말을 해줘야만 대화가 가능합니다.

음, 부모 자식간의 좀 딱딱한가요? 뭐! 옛날엔 그랬쟎습니까 ㅎㅎ


그럼 이 과정을 코딩해 보겠습니다.

자식폼에게는 이벤트를 생성하고

부모는 이벤트를 연결합니다.



자식부터 시작합시다.

"부모님! 저도 말좀할께요!" 라는 이벤트를 만듭니다.
사용자 삽입 이미지


버튼을 누르면 이벤트가 발생되는 구조이지요. 내용은 텍스트박스꺼를 보냅니다.



그럼 부모는

니가 말하면 받아주마라는 이벤트 연결을 해줍니다.



사용자 삽입 이미지


자 이제 실행해서 자식이 말을 하면 부모는 이벤트를 전달받아 내용을 표시해 주겠지요!

사용자 삽입 이미지


잘 이해가 되셨는지요?

데브피아의 어떤분이 문의를 하셔서 예제 소스로 만들어 드리기는 좀 그렇고 해서

강좌형식으로 적어봤습니다.

깊이 들어갈려면

델리게이트, 이벤트 등등도 설명이 되어야 하지만 일단은 이걸로 공부하면서

부모와 자식간의 관계를 이해해 보시기 바랍니다.


[다이어리]

- Written by Angelma ( Microsoft C# MVP )


출처 : http://devangelma.tistory.com/229
반응형
Posted by blueasa
, |

C# 에서의 Enum

Programming/C# / 2010. 7. 6. 22:20

기껏해봐야 C++하다 JAVA혹은 C#하는 경우가 고작이지만
새로운 언어로 코딩하려다 보면 이런 기초적인 문법에서 막힐 때가 있다.
역으로 C++로 버닝하다 간만에 C를 하는데 BOOL을 선언하고 "왜 안되지?"하는 고민할때도 있고.
 
enum역시 쓸때마다 "C#에서는 뭔가 틀린 점이 있지 않았나?" 하고 매번 의구심을 갖지만 매번 까먹는다.
또 까먹을까 싶어서 이렇게 정리해둔다.
 
C#에서의 enum은 이전의 C, C++과 다를 바가 없다.
enum 키워드를 사용하여 괄호{} 안에 상수를 열거하는 것.
이때 열거된 상수들은 정수 계열 형식을 갖는다.
아무런 값을 초기화시키지 않았을 경우,
기본적으로 첫 번째 열거자의 값은 0, 그 이후로 열거자 값은 순서대로 1씩 증가한다.
 msdn의 예를 들면
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
 이때, Sat = 0, Sun = 1 ..... Fri = 6 을 값으로 갖는다는 말.
그런데 열거자의 값을 설정할 수도 있다. 위의 예를 변형하여 설명하면
enum Days {Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri};
이렇게하면 Sat의 값은 1이 되고 그 숫자 이후로 각 열거자들의 값이 설정된다.
즉, Sun = 2, Mon = 3, ... , Fri = 7 을 값으로 갖는다.
enum으로 선언한 상수들은 정수 계열의 형식을 갖지만 실제로 정수 계열의 형식으로 변환하기 위해서는
명시적 캐스트가 있어야 한다.
int x = (int)Days.Sun;
enum으로 선언한 상수들의 형식을 지정해 줄 수도 있다.
enum Days : float {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
위와 같이 선언하면 Days의 상수들은 전부 float형의 값을 가지게 된다.

[출처] C# 에서의 Enum|작성자 Triumph

반응형
Posted by blueasa
, |
- 컨트롤 위에 마우스 커서가 위치해 있는지 알기위해 찾던 중..힌트가 될만한 글..


컨트롤에 마우스 이벤트를 걸고 작업을 하던 중,

마우스 클릭 상태에서는 'MouseMove'이벤트를 제외한 발생가능 이벤트,

즉 'MouseLeave'와 'MouseEnter', 'MouseHover'이벤트가 일어나지 않는 다는 것을 발견했다.

 

 

클릭 상태에서도 컨트롤 위로 마우스가 올라오거나 벗어날때 이미지를 바꾸고 싶다면

'MouseMove' 이벤드 메서드에서 컨트롤 범위를 체크하여 원하는 작업을 해주면 된다.

컨트롤의 범위를 Rectagle클래스로 잡은 후에 마우스의 현재 위치를 Rectangle클래스의 Contains함수를 이용하여

컨트롤 위에 있는지 아닌지를 확인하면 된다.

 

 

예를 들면 다음과 같다.

 

 

        private void picturebox1_MouseMove(object sender, MouseEventArgs e)
        {
               if (e.Button == MouseButtons.Left)
               {
                      Rectangle rect = new Rectangle(picturebox1.Location, picturebox1.Size);

                      int x = picturebox1.Location.X + e.X;
                      int y = picturebox1.Location.Y + e.Y;
                      Point p = new Point(x, y);

                      if (rect.Contains(p))
                             picturebox1.Image = '원하는 이미지';   // 마우스 누른 상태에서 컨트롤 위에 올라왔을때

                      else
                             picturebox1.Image = '원하는 이미지';  // 마우스 누른 상태에서 컨트롤을 벗어났을때

               }
               else
               {
                       picturebox1.Image = '원하는 이미지';  // 마우스 누르지 않은 상태에서 컨트롤 위에 올라왔을때

                }
        }

         

반응형

'Programming > C#' 카테고리의 다른 글

폼과 폼간의 전송 (부모 자식간의 전송)  (0) 2010.07.07
C# 에서의 Enum  (0) 2010.07.06
Windows Forms FAQ - Windows Forms  (0) 2010.07.02
C# 싱글톤  (0) 2010.07.02
Singleton  (0) 2010.07.02
Posted by blueasa
, |

출처 : http://www.microsoft.com/korea/msdn/smartclient/community/wffaq/default.aspx


Stuart Celarier, Fern Creek, www.ferncrk.com (영문)
.NET/XML 컨설턴트, 교육 과정 개발자, 트레이너

의견이나 수정할 내용이 있으시면 faq@ferncrk.com으로 전자 메일을 보내주십시오.

이 문서를 작성하는 데 큰 도움이 되었던 syncfusion.com (영문)Windows Forms FAQ 저자인 George Shepherd (영문)에게 깊은 감사를 드립니다.

수정일: 2005년 1월 24일 6:12 PM 태평양 표준시

Windows Forms FAQ Pages

Windows Forms | 컨트롤 및 구성 요소(일반) | 컨트롤 및 구성 요소(특정) | 데이터 | .NET Framework | 도구 | Windows Forms 2.0

이 페이지의 내용

 모든 대답을 표시하려면 선택하십시오.

Windows Forms FAQ의 구성 방법

이 FAQ의 항목은 일련의 페이지로 구성되어 있습니다. 여러 페이지로 구성된 이러한 항목의 구성 방법과 항목 간의 관계는 다음과 같습니다.

Windows Forms

Windows Forms에서는 .NET Framework 1.0 및 1.1에서의 Windows Forms 응용 프로그램, System.Windows.Forms.Form 클래스, 공용 대화 상자, 일반적인 몇 가지 읽기 권장 사항을 다룹니다.

주요 관계. 폼은 컨트롤이고 컨트롤은 구성 요소입니다. 폼에 적용되지만 폼에 한정되지는 않는 정보는 컨트롤 및 구성 요소(일반)을 참조하십시오.

관련 섹션. Visual Studio와 기타 도구 및 유틸리티를 사용하여 Windows Forms를 개발 및 디버깅하는 방법은 도구를 참조하십시오.

Windows Forms 응용 프로그램과 관련된 System.Windows.Forms 네임스페이스 외부의 정보는 .NET Framework를 참조하십시오.

Visual Studio 2005 및 .NET Framework 2.0을 사용하는 Windows Forms에 대한 자세한 내용은 Windows Forms 2.0을 참조하십시오.

컨트롤 및 구성 요소(일반)

컨트롤 및 구성 요소(일반)에서는 클래스의 모양 및 동작(behavior)과 디자인 타임 문제를 비롯하여 System.Windows.Forms.Control 및 System.ComponentModel.Componen 클래스를 다룹니다. Internet Explorer에서 컨트롤을 호스팅하는 것에 대한 섹션이 포함되어 있습니다.

주요 관계. 컨트롤은 구성 요소이고 폼은 컨트롤입니다.

관련 섹션. 특정 컨트롤 및 구성 요소(예: 컨트롤 및 구성 요소에서 파생된 클래스)는 컨트롤 및 구성 요소(특정)를 참조하십시오.

모든 컨트롤에 적용되는 데이터 소스 및 데이터 바인딩은 데이터를 참조하십시오.

특정 컨트롤에 적용되는 데이터 소스 및 데이터 바인딩은 컨트롤 및 구성 요소(특정)를 참조하십시오.

컨트롤 및 구성 요소(특정)

컨트롤 및 구성 요소(특정)에서는 System.Windows.Forms.Control 및 System.ComponentModel.Component에서 파생된 클래스를 다룹니다.

주요 관계. 컨트롤은 구성 요소이고 메뉴는 구성 요소이며 ContextMenu는 메뉴입니다. 도구 설명은 구성 요소이지만 대부분의 도구 설명 질문은 특정 컨트롤과 관련됩니다.

예외. 폼은 컨트롤이지만 폼에 대한 자세한 내용은 Windows Forms를 참조하십시오. CommonDialog는 구성 요소이지만 CommonDialog에 대한 자세한 내용은 Windows Forms을 참조하십시오.

관련 섹션. 모든 컨트롤과 구성 요소에 적용되는 정보는 컨트롤 및 구성 요소(일반)를 참조하십시오.

모든 컨트롤에 적용되는 데이터 소스 및 데이터 바인딩은 데이터를 참조하십시오.

데이터

데이터에서는 모든 컨트롤에 적용되는 데이터베이스, 데이터 소스, DataSet 클래스 및 데이터 바인딩을 다룹니다.

관련 섹션. 컨트롤 및 구성 요소컨트롤 및 구성 요소(특정)를 참조하십시오.

.NET Framework

.NET Framework에서는 CLR(Common Language Runtim) 기능, System.Windows.Forms 네임스페이스 외부의 FCL(Framework Class Library), Windows Form 응용 프로그램에 제한되지 않고 모든 .NET Framework 응용 프로그램에 적용되는 문제 등을 다룹니다.

관련 섹션. System.Windows.Forms 네임스페이스 및 Windows Forms 응용 프로그램에 대한 자세한 내용은 Windows Forms, 컨트롤 및 구성 요소(일반)컨트롤 및 구성 요소(특정) 를 참조하십시오.

System.Data 네임스페이스 및 데이터 바인딩에 대한 자세한 내용은 데이터를 참조하십시오.

Visual Studio와 기타 도구 및 유틸리티를 사용하여 .NET Framework에서 소프트웨어를 개발 및 디버깅하는 방법은 도구를 참조하십시오.

Windows Forms 2.0 응용 프로그램과 관련된 .NET Framework 2.0에 대한 자세한 내용은 Windows Forms 2.0을 참조하십시오.

도구

도구에서는 Windows Forms 응용 프로그램 및 기타 .NET Framework 응용 프로그램을 일반적으로 개발 및 디버깅하는 데 사용되는 Visual Studio 및 다른 도구와 유틸리티를 다룹니다.

관련 섹션. 디자이너에서 작동하는 컨트롤을 개발하고 디자인 타임에 컨트롤 작업을 수행하는 방법은 컨트롤 및 구성 요소(일반)에서 디자인 타임 섹션을 참조하십시오.

디자이너에서의 데이터 바인딩에 대한 자세한 내용은 데이터를 참조하십시오.

Windows Forms 2.0

Windows Forms 2.0에서는 Visual Studio 2005를 사용하는 .NET Framework 2.0의 Windows Forms와 관련된 문제를 다룹니다.

관련 섹션. .NET Framework 2.0에서 계속 사용할 수 있는 .NET Framework

1.1의 Windows Forms에 대한 자세한 내용은 Windows Forms, 컨트롤 및 구성 요소(일반), 컨트롤 및 구성 요소(특정), 데이터, 및 도구를 참조하십시오.

Windows Forms (System.Windows.Forms.Form)

일반

  • Windows Forms에 대한 간략하고 정확한 소개를 어디에서 확인할 수 있습니까?

  • 폼을 위한 기본 단추를 설정하는 방법은 무엇입니까?

  • 폼에서 값을 반환하는 방법은 무엇입니까?

    공용 속성을 폼에 추가합니다. 그러면 폼의 인스턴스를 만드는 모든 개체에서 이러한 속성을 액세스할 수 있습니다.

    George Shepherd의 Windows Forms FAQ에서 발췌한 내용, #

    이 FAQ 항목의 경우 제품 버전이 지정되지 않았습니다. 상태가 업데이트될 경우 이곳으로 보고해 주십시오.

  • VB6과 다르게 여러 폼을 작업하는 방법은 무엇입니까?

  • 폼을 인쇄하는 방법은 무엇입니까?

  • PrintPreview를 최대화된 창으로 표시하고 확대/축소를 제어하는 방법은 무엇입니까?

  • 폼의 비트맵을 캡처하는 방법은 무엇입니까?

  • 특정 폼의 TextBox를 다른 폼에서 액세스하는 방법은 무엇입니까?

  • 폼을 활성화하지 않고 표시하는 방법은 무엇입니까?

  • Windows Forms 응용 프로그램의 임의 위치에서 발생하는 예외를 파악하는 방법은 무엇입니까?

  • 폼의 시스템 메뉴에 항목을 추가하는 방법은 무엇입니까?

  • 프로그래밍 방식으로 비트맵에서 폼의 아이콘을 설정하는 방법은 무엇입니까?

  • System.Windows.Forms.Application.CompanyName에 의해 반환되는 회사 이름을 설정하는 방법은 무엇입니까?

  • 장시간 작업 도중에 상태 대화 상자를 백그라운드로 표시하고 사용자가 이를 취소할 수 있게 하는 방법은 무엇입니까?

  • 폼의 컨트롤이 읽기 전용인지 아닌지를 쉽게 관리하는 방법은 무엇입니까?

  • 사용자가 모달 대화 상자에서 다른 창을 클릭했는지 감지하는 방법은 무엇입니까?

  • 폼이나 컨트롤을 위한 HWND를 얻는 방법은 무엇입니까?

  • 폼이 작업 표시줄에 표시되지 않게 하는 방법은 무엇입니까?

  • 폼이 항상 바탕 화면에 있게 하는 방법은 무엇입니까?

  • 항상 모든 응용 프로그램의 창 위에 표시되는 모달이 아닌 최상위 폼을 만드는 방법은 무엇입니까?

  • 내 응용 프로그램에 대해서만 'TopMost'이고 다른 응용 프로그램의 경우에는 'TopMost'가 아닌 폼을 만드는 방법은 무엇입니까?

  • 여러 컨트롤에서 공용 이벤트 처리기를 공유하는 방법은 무엇입니까?

폼 및 컨트롤 만들기

  • Form 클래스의 이름에서 Form 클래스의 인스턴스를 만드는 방법은 무엇입니까?

  • 시작될 때 표시되지 않는 폼을 만드는 방법은 무엇입니까?

  • 모덜리스 대화 상자의 인스턴스가 한 번에 하나만 작성되거나 열리도록 하는 방법은 무엇입니까?

  • 런타임에 컨트롤을 Windows Form에 추가하는 방법은 무엇입니까?

  • 어셈블리 또는 DLL에서 컨트롤을 동적으로 로드하는 방법은 무엇입니까?

  • 프로그래밍 방식으로 컨트롤을 폼에 추가하고 컨트롤이 표시되도록 하는 방법은 무엇입니까?

폼 닫기 및 응용 프로그램 종료

  • Windows Form 응용 프로그램을 강제로 종료하는 방법은 무엇입니까?

  • 시스템 메뉴에서 폼을 닫았는지 아니면 Form.Close를 호출하여 닫았는지 확인하는 방법은 무엇입니까?

  • 닫기 단추를 사용자가 클릭했을 때 폼이 닫히지 않게 하는 방법은 무엇입니까?

  • 폼의 제목 표시줄에서 닫기 단추를 제거하는 방법은 무엇입니까?

  • 폼을 사용자가 닫을 때 확인 대화 상자를 표시하는 방법은 무엇입니까?

모양

  • 테두리나 제목 표시줄이 없는 시작 화면 스타일의 폼을 만드는 방법은 무엇입니까?

  • 크기 조정 테두리가 있고 제목 표시줄은 없는 폼을 만드는 방법은 무엇입니까?

  • 폼을 투명하게 만드는 방법은 무엇입니까?

  • 사각형이 아닌 폼을 만드는 방법은 무엇입니까?

  • 테두리가 없는 폼을 만드는 방법은 무엇입니까?

  • Windows Forms에 대한 사용자 지정 스타일을 제공하여 CSS가 HTML에 제공하는 것과 비슷한 기능을 제공하는 방법은 무엇입니까?

  • Windows Forms에서 그리기 및 칠하기를 수행하는 최상의 실행 방법은 무엇입니까?

  • VB6의 선 명령 기능을 대체하는 선을 그리는 방법은 무엇입니까?

  • 모든 컨트롤이 초기화될 때까지 폼 그리기를 일시 중단하는 방법은 무엇입니까?

  • 응용 프로그램에서 XP 스타일을 지원하기 위해 EnableVisualStyles 메서드를 사용하는 방법은 무엇입니까?

  • .NET Framework 1.1을 사용하는 Windows Forms에서 XP 테마를 사용하는 방법은 무엇입니까?

  • .NET Framework 1.0을 사용하는 Windows Forms에서 XP 테마를 사용하는 방법은 무엇입니까?

레이아웃

위치, 크기 및 이동

  • 폼을 프로그래밍 방식으로 최대화 또는 최소화하는 방법은 무엇입니까?

  • 작업 표시줄을 비롯한 전체 화면을 폼으로 덮는 방법은 무엇입니까?

  • 폼을 처음 열었을 때 화면의 오른쪽 하단에서 시스템 트레이 위에 폼을 표시하는 방법은 무엇입니까?

  • 사용자가 폼을 이동할 수 없게 하는 방법은 무엇입니까?

  • 폼의 크기를 제한하거나 제어하는 방법은 무엇입니까?

  • 사용자가 폼의 크기를 조정할 수 없게 하는 방법은 무엇입니까?

  • 디자인 타임과 런타임 사이에 화면 해상도가 변경될 경우 폼의 크기를 자동으로 조정하는 방법은 무엇입니까?

  • 폼을 가운데에 놓는 방법은 무엇입니까?

  • 테두리 없는 폼을 이동하는 것을 지원하는 방법은 무엇입니까?

  • 영역 드래그 효과가 있는 테두리 없는 폼의 크기를 조정하는 방법은 무엇입니까?

커서

  • 컨트롤의 커서를 변경하는 방법은 무엇입니까?

  • Cursor 클래스를 커서(.cur) 파일로 변환하는 방법은 무엇입니까?

  • 리소스 매니페스트에서 커서를 로드 및 표시하는 방법은 무엇입니까?

  • 현재 커서를 대기 커서로 설정하는 경우는 언제이며 대기 커서가 원했던 것보다 빨리 되돌려지는 이유는 무엇입니까?

키보드

  • 키 입력을 응용 프로그램으로 보내는 방법은 무엇입니까?

  • 응용 프로그램 전체에서 키보드 메시지를 처리하는 방법은 무엇입니까?

  • 포커스를 가진 컨트롤에 상관없이 폼 수준에서 특정 키를 처리하는 방법은 무엇입니까?

MDI: 다중 문서 인터페이스

  • .NET Framework를 사용하여 MDI 응용 프로그램을 만드는 방법은 무엇입니까?

  • MDI 클라이언트 컨테이너의 배경을 변경하는 방법은 무엇입니까?

  • 자식(child) 폼을 최대화하지 않고 전체 MDI 클라이언트를 자식(child) 폼으로 채우는 방법은 무엇입니까?

  • MDI 응용 프로그램에서 자식(child) 폼이 활성화될 경우 Activated 이벤트가 일관되게 발생하지 않는 이유는 무엇입니까?

  • MinimumSize 및 MaximumSize 속성이 작동하지 않을 경우에 MDI 자식(child) 폼의 크기를 제한하는 방법은 무엇입니까?

  • 자식(child) 폼의 인스턴스가 여러 개 만들어지지 않게 하는 방법은 무엇입니가?

  • MDIContainer 폼에서 MDI 자식(child) 폼이 추가되거나 제거될 경우 사용자 지정 처리를 수행하는 방법은 무엇입니까?

  • MDI 컨테이너에서 사용자 지정 그리기(예: 로고)를 수행하는 방법은 무엇입니까?

공용 대화 상자(System.Windows.Forms.CommonDialog)

  • OpenFileDialog를 사용하는 방법은 무엇입니까?

  • FolderBrowser 인스턴스가 처음 열렸을 때 이 인스턴스의 경로를 지정하는 방법은 무엇입니까?

  • 폴더 브라우저 클래스를 구현하는 방법은 무엇입니까?

  • FontDialog 클래스를 사용하여 컨트롤의 글꼴을 설정하는 방법은 무엇입니까?

  • ColorDialog를 사용하여 색을 선택하는 방법은 무엇입니까?

리소스

  • Windows Forms 프로그래밍과 관련 주제에 대한 읽을 만한 책들에는 어떤 것들이 있습니까?

반응형

'Programming > C#' 카테고리의 다른 글

C# 에서의 Enum  (0) 2010.07.06
C#에서의 '마우스 클릭(mousedown) 상태'에서 '마우스 이벤트' 일어나지 않는 문제  (0) 2010.07.06
C# 싱글톤  (0) 2010.07.02
Singleton  (0) 2010.07.02
창크기 조절 막기  (0) 2010.07.02
Posted by blueasa
, |

C# 싱글톤

Programming/C# / 2010. 7. 2. 16:55

이 전략에서는 클래스의 임의 구성원을 처음으로 참조할 때에 인스턴스가 만들어집니다. 공용 언어 런타임이 변수 초기화를 담당합니다. 파생을 차단하기 위해 클래스가 sealed로 표시되며 이로 인해 인스턴스가 추가될 수 있습니다. 클래스를 sealed로 표시할 때의 장단점에 대한 설명은 [Sells03]을 참조하십시오. 또한 변수가 readonly로 표시됩니다. 이 표시는 정적 초기화 (여기서 표시된 것처럼) 중이나 클래스 생성자에서만 변수를 할당할 수 있음을 의미합니다. 여기서는 정적 초기화가 나타나 있습니다.

이 구현은 공용 언어 런타임을 사용하여 변수를 초기화한다는 점을 제외하면 앞의 예제와 유사합니다. 이 구현에서는 싱글톤(Singleton) 패턴이 해결하려고 하는 두 가지 문제 즉, 글로벌 액세스와 인스턴스화 제어에 대해 다룹니다. public static 속성은 인스턴스에 글로벌 액세스 포인트를 제공합니다. 또한 생성자가 private로 선언되기 때문에 클래스 외부에서는 싱글톤(Singleton) 클래스를 인스턴스화할 수 없습니다. 따라서 변수가 의미하는 것은 시스템에 존재할 수 있는 인스턴스만을 말합니다.

싱글톤(Singleton) 인스턴스는 private로 선언된 정적 구성원 변수에 의해 참조되므로 Instance 속성 호출이 클래스를 처음으로 참조한 후에야 비로소 인스턴스화가 수행됩니다. 따라서 이 솔루션은 싱글톤(Singleton)의 Design Patterns 양식에서처럼 지연 인스턴스화 속성 양식을 구현합니다.

이 방식의 유일한 단점은 인스턴스화 구성에 대한 제어가 약간 저하된다는 점입니다. Design Patterns 양식에서는 인스턴스화 이전에 비기본 생성자를 사용하거나 다른 작업을 수행할 수 있었습니다. 이 솔루션에서는 .NET Framework가 초기화를 수행하므로 이 옵션이 필요 없습니다. 대부분의 경우는 .NET에서 싱글톤(Singleton)을 구현하기 위해 정적 초기화가 더 선호됩니다.

멀티 스레드 싱글톤(Singleton)

대부분의 상황에는 정적 초기화가 적합합니다. 응용 프로그램이 인스턴스화를 연기해야 하고, 인스턴스화 이전에 비기본 생성자를 사용하거나 다른 작업을 수행해야 하고, 멀티 스레드 환경에서 작업해야 하는 경우는 다른 솔루션이 필요합니다. 하지만 정적 초기화 예제에서처럼 스레드 안정성을 보장하기 위해 공용 언어 런타임을 사용할 수 없는 경우가 존재합니다. 이러한 경우는 여러 개의 스레드에 대해 개체 인스턴스가 하나만 만들어지도록 특정한 언어 성능을 사용해야 합니다. 보다 더 일반적인 솔루션은 각각의 스레드가 싱글톤(Singleton) 인스턴스를 동시에 만들지 못하도록 막기 위해 이중 확인 잠금(Double-Check Locking)[Lea99] 관용구를 사용하는 것입니다.

참고:공용 언어 런타임은 다른 환경에서 흔히 나타나는 이중 확인 잠금(Double-Check Locking) 사용에 관련된 문제를 해결합니다. 이 문제에 대한 자세한 내용은 메릴랜드 주립대, 컴퓨터 사이언스 학과 웹 사이트(http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)에서 "The 'Double-Checked Locking Is Broken' Declaration" 을 참조하십시오.

다음 구현에서는 싱글톤(Singleton)의 인스턴스가 아직 만들어지지 않았을 때 한 개의 스레드만이 임계 영역(lock 블록에 의해 식별)에 들어갈 수 있습니다.

 

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}
 

이 방식에서는 인스턴스가 필요할 경우에만 인스턴스가 단 한 개만 만들어지도록 합니다. 또한 인스턴스 변수에 액세스할 수 있기 전에 인스턴스 변수 할당을 완료하도록 변수를 volatile로 선언합니다. 마지막으로 이 방식에서는 교착 상태를 방지하기 위해 유형 자체를 잠그지 않고 syncRoot 인스턴스를 사용하여 잠급니다.

이 이중 확인 잠금(double-check locking) 방식은 Instance 속성 메서드의 모든 호출에 대한 독점적인 잠금을 막으면서도 스레드 동시 발생의 문제를 해결합니다. 이 방식에서는 또한 개체가 처음으로 액세스될 때까지는 인스턴스화를 연기할 수 있습니다. 실제로 응용 프로그램에는 이러한 유형의 구현이 거의 필요 없습니다. 대부분의 경우는 정적 초기화 방식만으로 충분합니다.

결과

C#에서 싱글톤(Singleton)을 구현할 경우 다음과 같은 이점과 단점이 있습니다.

이점

  • .NET Framework에서는 정적 변수 초기화가 언제 어떻게 일어나는지를 명시적으로 정의하므로 정적 초기화 방식이 가능합니다.

  • 위의 "멀티 스레드 싱글톤(Singleton)"에서 이미 설명한 이중 확인 잠금(Double-Check Locking) 관용구가 공용 언어 런타임에서 올바로 구현됩니다.

    단점

    멀티 스레드 응용 프로그램에 명시적 초기화가 필요한 경우는 스레딩 문제를 예방하기 위해 미리 조치를 취해야 합니다.

    참고 자료

    [Gamma95] Gamma, Helm, Johnson 및 Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995.

    [Lea99] Lea, Doug. Concurrent Programming in Java, Second Edition. Addison-Wesley, 1999.

    [Sells03] Sells, Chris. "Sealed Sucks." sellsbrothers.com News. 다음 웹 사이트에서 구할 수 있습니다: http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=411

    참고: 제목과는 무관하게 "Sealed Sucks" 기사는 클래스를 sealed로 표시할 때의 장단점에 대해 실제로 설명합니다

    출처 : Tong - nicekiller77님의 C#통

  • 반응형
    Posted by blueasa
    , |

    Singleton

    Programming/C# / 2010. 7. 2. 16:53

    Definition

    Ensure a class has only one instance and provide a global point of access to it. 

    클래스는 오직 하나의 인스턴스만을 가질 수 있으며, 인스턴스에 접근할 수 있는 하나의 글로벌 포인터를 제공한다.

     

     UML Class Diagram

     

    Participants

    The classes and/or objects participating in this pattern are: Singleton   (LoadBalancer)

    • defines an Instance operation that lets clients access its unique instance. Instance is a class operation.
    • responsible for creating and maintaining its own unique instance.

    이러한 패턴으로 클래스들과 객체들이 참여하는것을 싱글톤(Singleton)이라 한다.

    • 클라이언트들이 유일한 인스턴에 접근하는 하나의 인스턴스 연산을 정의한다. 인스턴스는 클래스 연산(Operation)이다.
    • 자신의 유일한 인스턴스를 생성하고 유지하는 것에 대해 신뢰할 수 있다.

     

    < 글/ 이미지지/ C# 소스 출처 : http://www.dofactory.com/ >

     

    Example

    Singleton 패턴은 객체의 인스턴스가 유일한 즉, 단 하나의 인스턴스만을 생성한다. 그리고 전연 변수와 같이 어디서든지 유일한 인스턴스에 접근하여 사용하는 패턴이다. 단 하나의 유일한 인스턴스만을 가지고 있어 중요한 자원을 관리하는 객체의 경우 편리하다.

    사실 그냥 전역 변수를 사용해서 관리하는 것도 좋지 않나 라고 생각도 했지만, 전역 변수를 사용하는 목적이 어디에서든 접근 가능하다는 목적도 있는 반면에 중요한 자원을 관리함에있어 인스턴스를 이용하여 자원을 관리를 한다. 그래서 그 인스턴스가 유일하다는 것을 보장해 줄 때 사용할 수 있다. 다른 예로, 실생활에서는 대통령은 하나이며 그 유일한 대통령에 의해 임무가 수행된다. 하지만, 대통령 즉, 인스턴스가 여러군대 생성된다면 이것은 혼란을 야기시킬것이다. 이러한 문제를 미리 방지 하고자 Singleton을 사용한다.

     

    Singleton은 기본적으로 다음과 같은 구조로 되어있다.

    1. public class Singleton
      {
           private static Singleton singleton;
           private Singleton()
           {         
           }
    2.  
    3.      public static Singleton getInstance()
           {
    4.  if(Singleton == null)
    5. singleton = new Singleton();
    6.           return singleton;
           }
      }

     

    위 코드에서 생성자를 보자. public이 아닌 private 로 선언되었다.  보통 Singleton ex = new Singleton() 으로 인스턴스로 생성하지만, 이렇게 여러 곳에서 인스턴스가 생성되는 것을 막기 위해 private 로 선언되었다.

    그래서 다음과 같이 이 인스턴스를 사용할 수 있다.

    1. Singleton ex = Singleton.GetInstance();

     

    Sample Code In C#, C++Singleton.zip <- Click Here


    출처 : http://blog.naver.com/fish19?Redirect=Log&logNo=120051709260

    반응형

    'Programming > C#' 카테고리의 다른 글

    Windows Forms FAQ - Windows Forms  (0) 2010.07.02
    C# 싱글톤  (0) 2010.07.02
    창크기 조절 막기  (0) 2010.07.02
    파일 드래그&드롭  (1) 2010.06.30
    Form-Form 데이터 전달  (0) 2010.06.29
    Posted by blueasa
    , |

    먼저 데이터를 받을 폼이나 콘트롤의 AllowDrop 프로퍼티를 True 로 합니다.

    그런 다음 DragEnter Event에서 데이터를 확인하시고

    DragDrop event에서 실제 처리를 하시면 됩니다.

     

    이 예제는 다른 프로그램에서 파일을 드래그해서 리스트에 떨구면 파일을 추가하는 예제입니다.

     

            private void listBox1_DragEnter(object sender, DragEventArgs e)
            {
                    if (e.Data.GetDataPresent(DataFormats.FileDrop))
                    {
                        e.Effect = DragDropEffects.Copy;
                    }
                    else
                    {
                        e.Effect = DragDropEffects.None;
                    }
            }

            private void listBox1_DragDrop(object sender, DragEventArgs e)
            {
                try
                {
                    if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
                    {
                        string[] fileNames = (string[])e.Data.GetData(DataFormats.FileDrop);
                        foreach (string fileName in fileNames)
                        {

                            // 여기서 기타 파일에 대한 처리를 해주시면 됩니다.
                            listBox1.Items.Add(fileName);
                        }
                    }
                }
                catch (System.Exception ex)
                {
                    //예외
                }
            }

    출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=95686&ref=95686

    반응형

    'Programming > C#' 카테고리의 다른 글

    Singleton  (0) 2010.07.02
    창크기 조절 막기  (0) 2010.07.02
    Form-Form 데이터 전달  (0) 2010.06.29
    .NET CF에서 WndProc 사용법  (0) 2010.06.29
    C# 주의해야 할 문법(dispose,using,close)  (2) 2010.06.28
    Posted by blueasa
    , |

    데브피아 윤성님의 팁입니다.

    저는 보통 폼끼리 참조하여 사용해왔는데.. 이쪽이 훨씬 마음에 드네요.. :)

     

     

    ------------------- 이하 원문

     

    이글을 적게되는 이유의 하나는 지속되는 질답란의 질문들이며

    또 하나의 이유는 아래의 허접한 하나의 생성에 대해서 감사 댓글이 달렸기 때문이다.

     

    사실상 이걸 적어볼까 하고 생각한지가 일년은 훌쩍 넘은듯 싶다.

    귀찮기도 하고 별게 아닌거라서 뭐하자는 이야기인지 허접스럽기도 하고 말이다.

     

    사실상 아래의 "하나의 생성"인지.. 글에 대략 이건 옳지 못합니다. 클래스 생성이 낭비됩니다등의 댓글이 달릴것이라 예측했다.

    또는 openform 비교가 아닌 indexer적인 접근으로 null 비교를 하지 않는가 하는 의문이 달리지 않을까 했는데.. 적어놓은 시간이 짧아서인지 그런글은 없는듯싶다.

     

    -------------------------------

     

    Form collection 존재한다는 사실을 알고 있는이는 알고 있는데도 불구하고

    사람들은 이것을 이용하지 않는듯 싶다.

    (?)인지는 익숙하지 않아서 그런것이라.

    MS에서는 FromCollection ControlCollection Indexer까지 구현해서 만들어 두었음에도

    대부분의 경우 무식하게 Indexer 사용하지 않고 Loop 돌리거나 해서 찾는경우가 많다.

     

    아래의 ( 하나생성) 또한 그런 오류를 범한것중 하나이다.

    (과연 그럴까?.... 나름 이유가 있을까? 이유는 게을러서? 이지 않을까 싶다만.. 죽어도 잘난척이란..)

     

    Form Collection 있다는 사실 또는 이것을 이용할줄 모르는 사태로 인해서 가끔식은 FrameWork이라고 만든것들은 임의로 자신의 FormCollection 구현하고 이로인해서 오히려 쉬운길을 두고 어렵게 가기도 한다.

     

    기초적인것이면서 한줄짜리? 지식이라

    사실 이렇게 글을 적는게 오히려 민망하기도 하고 황망스럽기도 하나..

     

    몰라서 저지르는 실수들이 너무 많아서 이렇게 펜을 들어본다( 그러는 나는 알고 있을까나?)

     

    일단.. 기초과정을.. 밟아 보도록 하자..

     

    1. Indexer이용하기.

    이렇게.. 폼을 두개를 만들자.

     

    이런식으로.. 두개의 폼을.. 만들도록 하자.

    Form2 닫게 하려면 어떻게 하는가?

     

    Form2 닫지를 못하는 사람? 자진납세하자.(댓글함 적어다오 얼마나 많은지 파악이 안된다.)

    문제의 시작은 이것이다. Form2 생성했는데 어떻게 하질 못하겠다는것이다.

    Form2 생성은 이렇게 했다.

    결국 문제를 해결하기 위해서.. 어떤이는?...

     

    Form1 클래스의 변수로.. Xx 선언한다. 일종의 전역변수같은거 말이다.

    다른경우는 프로젝트의 자체 컬랙션에서 처리한다.

     

    두가지 나쁜 방법은 아니다.

    단지.. 내가 의문을 지니는것은 그럴까? 하는것뿐이다.

     

    Form2 닫는건 이렇게 적으면 된다.

     

    그렇다. 내가 그랬지… 한줄짜리 지식이라고..

    한줄 적어주고 어지간히 아는척이 많다.

     

    .. 이제는 FW 경우를 살펴보자.(FW FrameWork 준말로 사용한다. )

    솔류션을 이렇게 만들고 FW에서 기준폼으로 MyForm 만들고

    Form3 Myform 상속받았다고 치자.

     

    요렇게 상속받음..

     

    Myform 필요도 없지만.. 행여나 보여주자면..

    이런식이라고 보자.

     

    이런식이 될때 FormCollection.. 과연 Form3 가질까 하는것이다.

    대답은.. 모든 Form개체 상속받은것들은.. 무조건 Show할때.. FormCollection 들어간다.

    그럼 반대로 Hide하면 어떻게 될까? 사라질까?

    대답이 뭐일것 같은가? 귀찮아서 그냥 알려준다만.. 사라지기 전까지는 들어가 있다.

    hide 여전히 존재한다. Close 호출되어야 사라진다.

    다시 강조해서 말하자면.. Show할때 들어가고..(그냥 생성한다고 들어가진 않는다.)

    (여유되시면 reflection으로 show 까보면 좋겠다만.. 귀차니즘의 끝은 어디에 있는지 누가 해다오)

     

    하여간.. 위의 예제에서 말하고자 하는 이야기는

    FW 만들더라도 굳이 컬랙션을 만들지 마라.. 피곤하다.

    (말은 이렇게 하지만 대부분의 FW에서 필요하긴 하다. Form 경우 특정 영역성이 필요하게 되는데 일반적으로 기준 Form(위에서 말한 Myform) 에서 Show메세드의 오버로딩을 통해서 영역을 설정하곤 한다. / 또한 대부분의 경우 Dictionary같은 지네릭타입으로 해서 "as" 적지 않고 처리하길 원한다.)

     

    이제는 FW 사용하는 이들은 의문을 가질것이다. 그럼 Myform 상속받은것은 어떻게 구분하냐고?

    "is" 녀석은 그냥.. 있는게 아니다. 사용하면 될꺼 아닌가

    한줄이지만. 굳이 예제를 만들기도 귀찮은 관계로.. 패스다. 모른다고 누가 손든다면... 너무한거 아냐? 라고 말하고 싶다.

    안되면 확장메서드 하나 만들어 버리던지..

     

    . 이제 본론에 들어가야 하는데 폼에게 특정한 메시지를 전송한다는것 자체가 무의미한 수준까지 왔다.

    이미 눈치 코치 알아버렸듯이 할것이 없다.

     

    그래도 행여나 하는 맘으로 몇자 적어보자.

     

    나같은 경우는 Form에서 Form으로 특정메세지나 무시기를 전달하기 위해서 SendMessage같은 API 써본적은 없다. 물론 Domain 다른 Application이라면 어쩔수 없겠지만..

    그런경우만..WinProc override해서 처리하면 된다.

    이럴때도 광역인지 뭔가 방법이 있을법도 하다만.. 내가 모르는덕분에.. 이건 배워야 할듯 싶다.

     

    계속 주제를 어긋나는데 주제에 집중하자.

    하여간 나의 경우는 Interface 정의해서 사용한다.

     

    심풀하게 설명해서 이렇게 인터페이스를 만들어 보자.

     

     

    그럼.. 이걸 가지고.. Form2에게 이녀석을 구현하도록 해보자.

    이렇게 구현하고 나서..

     

    이지의 좌측 아래에 있는 버튼을 누르면.. 이렇게 실행이 된다.

    .. Form2 에게 궁극적으로 메시지를 보냈다.(물론 헛소리다.)

    .. From2 매서드를 단지 실행한것에 불과하다 args넣어서.

     

    소스야 앞서 이야기 했듯이 is 사용하면 된다.

     

    이렇게.. 물론 이것의 응용(?)으로 앞서 이야기 했듯이  Indexer 입력받아 바로.. Is 인터페이스 체크하고 실행하는 방법도 있겠다. (업무에 따라서..)

    응용은 알아서 하길 바란다. 계속 곁가지로 나가면.. 사실 적을게 너무 많다.

     

     

    위와 동일한 형태지만.. Myform 에서 가지고 하는걸 보자.

    (이건 필요 없을것 같다..... 그냥 대충 대충 진행하자.. 생략해도 좋다.)

    FW 경우에는 이렇게 해야될것이다.

    우리가 사용할 녀석에게 당연히 상속을 받아 구현하게 해야할것이다.

     

    여기서 주의깊게 봐야 하는것은 상속받고 구현하고.. 그리고 Virtual이라고 적어두는것이다.

    그래야… 이녀석을 다시 상속받는 녀석들에게.. Override 할수 있도록 하기 위함이다.

    아차차.. virtual앞에 public 붙쳐야되는데 얼른 적다보니 빠뜨렸다. 알아서 넣자.

     

    하여간..

     

    한줄짜리 기초가 이렇게 많은 글을 적어야 되는지는 .. 당연히 설명하는 능력의 부재이겠지만..

    이게 나름 적기 시작하면 무지 적을게 많기도 하다.( 뻥이다. 귀찮아서 적지 않을뿐이다.)

    여하튼 인터페이스에 정의하는것들로는  Clear같은거라든지.. 여타 몇몇개는 고정적으로 사용되는것들이 있는데 그런것들도 알아서 하도록 하자..

    반응형

    'Programming > C#' 카테고리의 다른 글

    창크기 조절 막기  (0) 2010.07.02
    파일 드래그&드롭  (1) 2010.06.30
    .NET CF에서 WndProc 사용법  (0) 2010.06.29
    C# 주의해야 할 문법(dispose,using,close)  (2) 2010.06.28
    Handling Application Events: On Idle  (0) 2010.06.28
    Posted by blueasa
    , |

    .NET 기반에서 C#으로 윈도우메세지를 핸들링하기 위해서는 WndProc를 오버라이드하여 사용하는 것으로 많이 알려져 있습니다. 하지만 .Net CF 에서는 Form클래스에 WndProc메소드가 기본적으로 존재하지 않습니다. 대신에 MessageWindow클래스를 이용하여 WndProc를 오버라이드하면 윈도우 메세지를 핸들링할 수 있도록 지원해줍니다.

     

    그럼, 간단하게 폼 위에서 마우스가 이동하면, 이때 마우스 좌표값을 윈도우 메세지 형태로 날려서

    이 값을 Form의 Text속성에 표시하는 예제를 함께 구현해 보도록 하지요.

     

    우선 MessageWindow 클래스 사용을 위해서는 다음과 같이 참조추가를 해주어야 합니다.

     

     

     

    사용하기 원하는 코드에서

     

    using Microsoft.WindowsCE.Forms;

     

    이제 MessageWindow를 사용할 수 있게 됩니다.

     

    아래는 기본적으로 프로젝트 생성시에 생성되는 폼(frmMain)에서

    MessageWindow를 상속받아 WndProc를 오버라이드한 클래스를 이용하는 코드입니다.

    굵은 부분을 참고하면 어떤식으로 윈도우메세지를 핸들링하는지 흐름을 파악할 수 있을 겁니다.

     

    frmMain 코드 - 프로젝트 생성시 생성되는 기본 폼

     

        public partial class frmMain : Form
        {
            MsgWindow MsgWin = null;

     

            public frmMain()
            {
                InitializeComponent();

                this.MsgWin = new MsgWindow(this);
            }

     

            //마우스 이동시에 메세지를 생성하여 날려주는 작업을 해주겠습니다.

            protected override void OnMouseMove(MouseEventArgs e)
            {
                Message msg = Message.Create(MsgWin.Hwnd, MsgWindow.WM_CUSTOMMSG,

                                                                (IntPtr)e.X, (IntPtr)e.Y);
                MessageWindow.SendMessage(ref msg);
                base.OnMouseMove(e);
            }

           

            //MsgWin을 통해 현재 폼에 접근할 수 있도록 메소드를 하나 정의합니다.

            public void RespondToMessage(int x, int y)
            {
                this.Text = "X = " + x.ToString() + ", Y= " + y.ToString();
            }
        }

     

     

     

     MesssageWindow를 상속받아 WndProc를 오버라이드

     

        public class MsgWindow : MessageWindow
        {
            public const int WM_CUSTOMMSG = 0x0400;

            private frmMain msgform;

     

            public MsgWindow(frmMain msgform)
            {
                this.msgform = msgform;
            }

     

            protected override void WndProc(ref Message msg)
            {
                switch (msg.Msg)
                {
                    case WM_CUSTOMMSG:
                        this.msgform.RespondToMessage((int)msg.WParam, (int)msg.LParam);
                        break;
                }
               
                base.WndProc(ref msg);
            }
        }

     

    반응형
    Posted by blueasa
    , |