2009년 11월 20일 금요일

TabIndex 꼬일 때 설정하는 법

TabIndex 꼬일 때 설정하는 법




 이 방법을 알기 전에는 말 그대로 TabIndex 가 꼬여서 정신을 못차리더라. 아무리 Property 의 TabIndex 를 순서대로 먹여도 지맘대로 왔다갔다 한다. 하지만.. 알고보니 꼬인게 아니라 내가 막 설정한 것이였다. ㅠㅠ

 TabIndex 설정값에 따라 컨트롤들의 이동이 무조권 TabIndex 값 순서에 따라 이동하는게 아니다. MSDN 에 있는 TabIndex 설명을 빌리자면,

" TabIndex 는 0 보다 크거나 같은 모든 유효 정수로 구성될 수 있으며, 숫자가 낮을수록 TabIndex 에서 앞에 온다.
  같은 부모 컨트롤에 있는 여러개의 컨트롤이 같은 TabIndex 를 가질 경우 해당 컨트롤의 Z 순서가
 컨트롤의 순환을 결정한다.
"


■ 방법.
아마 많은 컨트롤을 담은 폼에서 문제가 발생할 것이다. 여기선 간단한 것으로 테스트로 간단하게.
일반적으로는 속성창을 이용해서 TabIndex 를 설정한다.


하지만 이것 만으로는 한계가 있다는 것...




1. Visual Studio 2008 에서 "보기 → 탭 순서" 를 선택한다.
cfile29.uf.1766F83550AEC2D81E19A5.bmp


아래와 같이 설정된 TabIndex 값이 컨트롤 위로 출력 된다.





2. 원하는 순서대로 컨트롤을 클릭하여 TabIndex 를 변경할 수 있다.


위와 같이 선택한 대로 순서가 결정된다.


2009년 11월 13일 금요일

Text 파일 읽기

Text 파일 읽기




 WinForm 에서 텍스트 파일을 읽어와서 TextBox 에 출력시켜 주는 기능을 구현했다. 물론 많이 편해졌지만 새로운 사실 몇가지를 알게되어 정리해 본다.


■ 파일 읽기

 파일을 읽기위해 FCL 에서 제공해 주는 기능은 많다. 파일을 Byte 배열로 읽을 수 도 있고 string(문자열) 으로도 읽을 수 있다. 






1. FileStream 클래스를 이용하여 파일을 연다.
FileStream 클래스는 파일에 대해 Stream 을 제공하여 동기 및 비동기 읽기/쓰기 작업을 할 수 있게 도와준다.
cf) MSDN : FileStream 클래스

2. StreamReader
StreamReader 클래스를 이용하여 Stream 을 쉽게 조작할 수 있게 한다. 여기서 주의해야 할 것은 StreamReader 생성자의 Encoding 매개변수 이다.

처음 이 매개변수 값을 System.Text.Encoding.UTF8 로 하였다. 그 결과 영문자를 읽는데는 문제가 없었으나 한글은 깨져서 보인다.



UTF8 이라...  예전 유니코드 공부하면서 나온 단어인데..

UTF8 은 유니코드가 아닌 문자 집합을 유니코드로 인코딩 하는 하나의 방법이다. 이런 방법으로 UTF16, UTF32 가 있다.
UTF8 은 인코딩 방법은 문자에 따라 1, 2, 3, 4Byte 로 인코딩을 수행한다.

그렇다면 StreamReader 생성자에서 Encoding 매개변수가 의미하는 것은 ??
읽을 Stream 이 어떤 인토딩 방법으로 인코딩 되어 있는지 정보를 넘겨주는 것이다.
그래야 Stream 을  우리가 원하는 문자열로 읽을 때 해당 인코딩 방법을 사용하여 우리에게 알려줄게 아닌가.

여기서 또 한가지!! UTF8 로 했을 때 왜 한글이 깨질까??
이건 우리가 읽을 파일에 따라 다르다. 해당 파일이 UTF8로 인코딩 되었다면 UTF8로 읽어도 한글이 제대로 보여질 것이다. 하지만 지금 내 환경은 Windows Vista 에서 작성한 txt 파일을 읽는 것이다. Windows Vista 는 UTF16 을 사용한다. 그러니 UTF8 로 지정해 주니 제대로 읽지 못하는 것.
위와 같이 Default 로 해주면 시스템에 지정된 인코딩 방법을 넘겨주게 된다.



■ 개행 - "\r\n"

 아마 파일의 문자열을 읽어와 TextBox 에 출력시키면 개행이 하나도 적용되어 있지 않을 것이다. TextBox 에서 Text 프로퍼티 말고 AppentText 를 이용해 주었다. "\n" 을 넣어주어도 이상하게 출력이 된다. 정말 기본적인 지식으로 넘어가면,
Windows 는 개행문자를 두개 사용한한다. 바로 "\r\n"





이제 제대로 읽어졌다.





■ 참조

1. About Unicode
2. 멀티바이트 - 유니코드 서로변환 함수 표 [스크랩]
3. 유니코드에 대비한 프로그램을 작성하는 여섯가지 원칙 [스크랩]

2009년 11월 5일 목요일

Registry 다루기

Registry 다루기



 보통 지금까지 많은 윈도우즈 응용프로그램들이 자신의 정보를 저장하기 위하여 ini 파일 및 레지스트리를 사용하였다. 레지스트리는 응용프로그램, 사용자 및 기본 시스템 설정 정보에 대한 저장소 역할을 수행한다.
 .Net Framework 플랫폼에서의 응용프로그램은 어셈블리에 그 정보를 저장하기도 하고, WPF 에서는 응용프로그램 설정 이라고 하여 따로 파일을 하나 사용한다. 개인 적으로 레지스트리에 정보를 저장하는 방법을 별로 좋아하지는 않지만 알아 두어야 할 것 같다.



■ Namespace

using Microsoft.Win32;

Microsoft.Win32 네임스페이스를 사용한다. 이 네임스페이스 안에는 두가지 유형의 클래스들이 정의되어 있다.
- 운영체제(OS) 에서 발생시킨 이벤트를 처리하는 클래스
- 시스템 레지스트리를 관리하는 클래스

cf) MSDN : Microsoft.Win32 네임스페이스



■ Registry, RegistryKey  Class
Registry

Windows 기반 컴퓨터의 레지스트리에 있는 표준 루트 키 집합을 제공한다.

즉, 요 놈들을 말한다.

MSDN 을 보니 PerformanceData, DynData 루트 키도 있다고 하는데 난 보질 못했다...

사용 방법은 다음과 같다.

이미지 출처 : MSDN

Registry.Users 값을 할당해 줌 으로써 rk 는 HKEY_USERS 하위의 레지스트리 키에 접근/조작 가능하다.


RegistryKey

Windows Registry 의 키 수준 노드를 나타 낸다고 MSDN에 써 있는데... 첨엔 몬소린가 했다. ㅋㅋㅋ
즉, Registry 클래스를 통하여 레지스트리의 트리 구조에 접근하고, RegistryKey 클래스 인스턴스를 통하여 레지스트리 키 값을 추가/삭제/수정 할 수 있다는 것이다. "키 수준의 노드" 란 말이 레지스트리 트리에서 레지스트리 키를 지칭하는 것 같다.

사용 방법은 다음과 같다.


Registry.SetValue() 메소드를 통해서 키 값을 설정하고 있다.
여기서 알 수 있는 것은 레지스트리 경로를 궂이 Registry 클래스를 통해서 얻지 않아도 된다.



■ 사용 예











또한 레지스트리의 HKLM 의 경우 관리자 권한의 응용프로그램만이 쓰기 권한이 가능하다.
따라서 Windows Vista 에서는 UAC 에 의해 접근 실패할 것이다. 응용프로그램의 메니페스트를 수정하여 응용프로그램이 항상 관리자 권한으로 수행될 수 있게 권한을 상승시키자.
참조) Windows Vista 이상 OS 에서 응용프로그램 권한 상승

Form Border Style - None

Form Border Style - None




 오왕 오왕 오왕~

기본적인 Winform 윈도우 화면은 이렇다.





1. Group Box 를 추가하여 기존 컨트롤 들을 Group Box 에 넣는다.





2. Form 의 몇가지 설정을 해주자

- Form 의 시작 위치 설정



- Border Style 을 None으로 설정




3. Group Box 의 몇가지 설정을 해주자

- Dock 은 Fill 로 설정



- Font 는 1pt 로 설정




4. 실행 결과




오왕 오왕 오왕~ ㅎㅎ

2009년 11월 3일 화요일

Ping Test

Ping Test



.Net 에서 Ping Test 하는 MSDN 의 예제이다.

Ping, PingOptions, PingReply 클래스를 이용하며, 이 들의 네임스페이스는 System.Net.NetworkInformation 이다.

using System.Net.NetworkInformation;