티스토리 뷰

반응형



이번에는 윈도우 프로그래밍의 꽃

(내맘대로..)


이라 할 수 있는......

CommonDialog(공통대화상자)에 대해 알아보자.

※ 번역상 Common이 공통보다는 범용 정도가

더 어울리긴 하지만 다들 공통이라고 사용하니

여기서도 공통대화상자, 앞으로는 편의상 줄여서 '공대상자'이라 지칭하겠다.

(이것도 내맘대로..)






                               (어이..... 잠깐.....)
            
.
.
.

본론으로 돌아가서....



우선 공대상자를 사용하기 위해서는

SDI 개발환경에서 구성요소 컨트롤을 추가해야 한다.


Ctrl+T를 누르거나 메뉴의 프로젝트(P)의 구성요소를 찾아들어가면 된다.


(구성요소에서 공대상자 컨트롤을 추가. 실제로는 system32 폴더의 VSFLE3.OCX를 참조한다)

컨트롤을 추가했다면




여기까지 왔다면 준비는 끝.

프로젝트를 열고 폼을 하나 추가한 후 컨트롤을 끌어다 폼에 올려놓아 보자.

참고로 공대상자는 일반 컨트롤과는 달리 크기조정이 불가능하게 되어있다.













여기까지가 공대상자를 사용하기위한 기초단계까지의 설명이다.

그럼 이제부터 본격적인 파일열기를 파헤쳐 보기로 하자(팍팍!!)


파일열기는 윈도우에서 보통 단축키 Ctrl+O를 사용하고 있고 각종 문서작업을

할때나 저장해 놓은 파일을 찾아서 열기 위한 대화상자라고 할 수 있다.

vb상에서 대화상자 열기의 명령어는 다음과 같다.

CommonDialog1.ShowOpen 또는

CommonDialog1.Action = 1

위 명령어를 사용하면

한살 어린애부터 300살 먹은 어른까지 누구나 파일열기 대화상자를 열 수가 있다. -_-;;;;

흠..흠

ShowOpen과 관련된 속성들은 다음과 같다.

 속성  내 용
 CancelError  대화상자의 [취소]버튼 선택시 오류를 발생시킬지 여부 설정
 Flags  대화상자의 옵션을 설정
 Name  CommonDialog 개체의 이름을 설정
 DefaultExt  대화상자의 파일 기본확장자를 설정
 DialogTitle  대화상자의 제목 문자열을 설정
 FileName  대화상자에서 선택한 파일이름(※경로도 포함)
 Filter  대화상자에 나타낼 파일의 종류를 설정
 InitDir  대화상자가 나타낼 초기 디렉토리(폴더) 설정
(표. 공대상자 컨트롤의 주요 속성과 의미)


주요 속성의 사용법의 예를 들면


CancelError  :  CommonDialog1.CancelError = False 혹은 True

Filter   :   CommonDialog1.Filter = "엑셀파일(*.xls)|*.xls|모든파일(*.*)|*.*"
(열기 원하는 모든 파일 형태를 계속 해서 "|" 기호로 구분해 주면 된다.)

InitDir   :   CommonDialog1.InitDir = App.Path & "\..\작업폴더"
 ''(경로는 프로젝트 파일보다 작업폴더가 상위에 존재 할 경우임)


그리고...
 
위에서 언급한 속성들 중에서 중요하게 짚고넘어가야 할 속성이 

바로 Flags속성이다.

파일열기, 파일저장하기, 색상설정, 글꼴 옵션, 인쇄 등의

윈도우 도움말을 제외한 모든 대화상자에 각각 다른 속성이 있는데

이들 Flags속성에 따라서 여러 기능들이 따라오며
 
Flags속성을 제대로 사용하지 않으면 우리눈에 익숙한 공대상자의 모습이 나오질 않기 때문에
이 속성은 잘 알아둘 필요가 있다.

아,
 
그리고 이번에 소개할 파일 열기와
 
다음 파트에 이야기할 저장은 Flags 속성을 공유하기 때문에 한꺼번에 정리하기로 한다.

밑의 속성들은 주요 Flags속성을 정리해 놓은 것이다.

그 외의 속성은 알아서 검색 크리 ㄱㄱㅅ~~ ㅎㅎㅎㅎ



(순서)
속성 : 상수
설명 :

cdlOFNAllowMultiselect : &H200&
이 속성을 지정하지 않으면 파일 열기 대화상자에서 열 수 있는 파일이 하나밖에
선택되지 않는다. 말 그대로 멀티셀렉트가 가능하게 해줌.

cdlOFNFileMustExist : &H1000&
파일을 열 때 선택한 파일이 존재하는지 여부를 체크하는 속성. 만약 열고자 하는 파일
이 존재하지 않을 경우 에러 메세지를 발생시킨다.

cdlOFNHelpButton : &H10&
대화상자에 도움말단추를 표시한다.

cdlOFNOverwritePrompt : &H2&

선택한 파일이 이미 있을 경우 다른 이름으로 저장 대화상자를 표시하도록 한다.
파일을 덮어쓸 것인가의 여부를 물어봄

cdlOFNPathMustExist : &H800&
FileExist와 비슷한 의미로 보면 된다. 선택한 경로가 유효할 경우에만 에러를 발생시키지
않음. 유효하지 않은 경로를 선택한 경우 경고메시지를 띄움

cdlOFNReadOnly : &H1&
대화상자를 만들 때, 읽기전용으로 열 것인지를 체크하는 부분이 보이도록 혹은
안보이도록 설정할 수 있다.

cdlOFNExplorer : &H80000&
멀티셀렉트를 선택할 때 보통 이 속성도 같이 해주는데,

                  (cdlOFNExplorer 속성을 지정하지 않았을 때 파일 열기창 모습)

                        (cdlOFNExplorer 속성을 지정했을 때 파일 열기창 모습)

위와 같이 창의 모습이 달라지게 된다. 뭐 취향에 맞게 설정하면 되겠지만

아무래도 눈에 익숙한건 cdlOFNExplorer 속성을 지정한 모습이 아닐까 싶다. ㅎㅎㅎ

참고로 여러개의 속성을 같이 지정하고 싶을 땐

CommonDailog1.Falgs = cdlOFNAllowMultiselect + cdlOFNExplorer + cdlOFNHideReadOnly

위와같이 설정하면 된다.



그럼 여기까지 설정을 해서 파일을 선택하고 난 다음의 처리를 살펴보자.

파일을 선택하고 나면

FileName속성을 사용해서 선택한 파일의 '전체경로+파일이름'을 가져올 수가 있다.

그럼 또 적절한 타이밍에 떠오르는 질문...

파일이름만 알고 싶을땐 어떻게 하면 될까... 파일이름만을 알 수 있는 함수는 없을까...

답은 아쉽게도 "파일이름만 반환하는 함수는 없다" 임.

하지만 ㅎㅎㅎㅎ 안되는 게 어딨냐..

역시나 그것이 파일이름만 골라 내는 방법이 없다는 얘기는 아니다.

다음 코드를 보자.

Split(commonDailog1.FileName, "\", -1)
(함수에 대한 설명은 제일 아래의 설명을 참고할 것.)


Split함수는 1차원 배열을 반환하기 때문에


dim test() as string

test = Split(xlsFullFileName, "\", -1)
xlsFileName = test(UBound(test))

이렇게 간단한 몇 줄 코드로 파일명만 가져오는 것이 이제 가능해졌다. 으흐흐~~

                                 (소주잔으로 건배하고 병나발을 불어보자)




자...

그럼 길었던 공대상자 파일열기편 대미를 장식할

멀티셀렉트를 가능하게 지정하고 파일을 여러개 선태하고 열었을 경우에 대해

알아보고 이번 파트는 마치도록 하겠다.


멀티셀렉트를 설명하기 전에 재미삼아
 
파일을 한 개 선택했을 경우와 여러개를 선택했을 때 다른 점을 잠깐 보도록 하자.

먼저. 브레이크 포인트를 지정하고, 파일을 하나만 선택한 후

msgbox CommonDailog1.FileName

메세지박스에 FileName을 띄워보자.

당연히 선택한 파일의 풀패스(FullPath)가 보일 것이다.

그럼 이제 멀티셀렉트를 한 후 동일하게 메세지 박스를 띄워보자.

결과는 어떻게 나올까.

파일명은 안보이고 path까지만 보일 것이다.

아마도 파일이 여러개 선택되어서 헷갈리니 그냥 파일명은 빼버린게 아닌가 싶다.

그래도 파일은 선택된 것이니 전혀 긴장탈 필요는 전혀 없다. ㅎㅎ


다시 본론으로 돌아가서...

기본적으로,
 
멀티셀렉트된 파일들은 공백문자로 구분되어 있다.

그렇기 때문에

아래 코드처럼 Split함수를 한 번 더 사용해서 배열의 크기만큼 반복을 하면

파일명을 골라낼 수가 있다.

dim test() as string

''// 여기서 1차로 경로를 걸러내 주고
test = Split(xlsFullFileName, "\", -1)
xlsFileName = test(UBound(test))

''// 여기서 2차로 파일명을 걸러낸다.
For i = 1 To UBound(test)
    a = test(i)            
    MsgBox a
Next

(실험결과 멀티셀렉트를 할 경우 경로의 구분자 "\" 마지막에 들어오지 않는관계로
  for문의 i는 0 이 아닌 1부터시작했다....)


.
.
.
.
.
.
.


아....

드디어 공대상자의 파일열기 편이 끝났다.

컨트롤에 대한 속성이라든지

코드작성 팁에 대해서 지금껏 써본적이 없어서

의미전달이 제대로 이루어 졌는지도 모르겠고 하고싶은 얘기는 많은데 정리는 잘 안되고

괜히 본문내용만 길어지는 것 같아서 조급해지기도 했었다. ㅎㅎㅎㅎ

.
.
.

뭐 차차 나아지겠지 ㅎㅎ

다음에는 공대상자 파일저장하기 편을 작성해 보도록 하겠다.




- 끗 -






(참고)

Split 함수

설명

지정된 하위 문자열의 개수를 포함하는 0을 기수로 하는 1차원 배열입니다.

구문

Split(expression[, delimiter[, count[, compare]]])

Split 함수 구문은 다음과 같은 구성 요소로 되어 있습니다.

구성 요소 설명
expression 필수. 하위 문자열과 구분 기호를 포함하는 문자식. expression이 길이가 0인 문자열("")이면 Split는 빈 배열, 즉 요소와 데이터가 전혀 없는 배열을 반환합니다.
delimiter 선택. 하위 문자열의 한계를 식별하기 위해 사용되는 문자열. 생략하면 공백 문자(" ")가 구분 기호로 가정됩니다. delimiter가 길이가 0인 문자열이면 전체 문자열을 포함하는 단일 요소가 반환됩니다.
count 선택. 반환할 문자열 수로 –1은 모든 하위 문자열이 반환됨을 의미합니다.
compare 선택. 하위 문자열을 평가할 때 사용할 비교 종류를 나타내는 숫자값. 값에 대한 설명은 아래 설정을 참조하십시오.

설정

compare 인수의 값은 다음과 같습니다.

상수 설명
vbUseCompareOption –1 Option Compare문의 설정을 사용하여 비교를 수행합니다.
vbBinaryCompare 0 이진 비교를 수행합니다.
vbTextCompare 1 텍스트 비교를 수행합니다.
vbDatabaseCompare 2 Microsoft Access 전용. 데이터베이스의 정보를 기반으로 비교를 수행합니다.


















 
반응형
댓글
반응형
02-19 07:24
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함