C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[942] [Dialog] OpenDialog시작폴더 내 마음대로 하기
장성호 [nasilso] 20928 읽음    2009-12-10 02:25
[Common Dialog란?]
TOpenDialog  ,  TSaveDialog , TPictureOpenDialog 등..
comdlg32.dll에 있는  api로 여는 모든 dialog를 말한다.

   TOpenDialog,TPictureOpenDialog  --> GetOpenFileName
   TSaveDialog,TPictureSaveDialog   -->  GetSaveFileName
   TFontDialog                   -->  ChooseFont
   TColorDialog                -->  ChooseColor
   TFindDialog                   -->  FindText
   TReplaceDialog             --> ReplaceText
   TPrintDialog                   -->  PrintDlg
   TPrinterSetupDialog              -->  PageSetupDlg



위 Dialog들은 모두 VCL(Delphi 또는 CBuilder)에서 만들어 지원하는게 아니라
Windows시스템에서 지원해주는 dialog이죠

windows의 notepad에서 파일열기 클릭했을때나 TOpenDialog를 Execute로 열었을때나
똑같은 화면을 볼수가 있죠


[OpenDialog의 시작폴더는 어떻게 정해지나?]
    다음 링크에 보면 API  GetOpenFileName에서 쓰는 OPENFILENAME구조체에 대한 설명이 잘 나와있습니다.
   http://www.winapi.co.kr/reference/Structure/OPENFILENAME.htm

   시작 폴더는 OPENFILENAME구조체의 lpstrInitialDir  과  lpstrFile에 의해 결정되는데..

▶lpstrFile : 파일 이름 에디트에 처음 나타낼 파일명을 지정하되 필요없을 경우는 NULL로 지정한다. 또한 이 멤버는 사용자가 최종적으로 선택한 파일의 이름(완전 경로)을 리턴하는 용도로 사용된다. 즉 파일 대화상자가 종료된 후 이 멤버를 통해 사용자가 어떤 파일을 선택했는지를 알게 된다. 반드시 충분한 길이의 버퍼를 제공해야 한다.
  
▶lpstrInitialDir : 파일 찾기를 시작할 디렉토리를 지정한다. 대화상자가 열릴 때 이 멤버가 지정하는 디렉토리를 현재 디렉토리로 사용한다. 운영체제 버전에 따라 이 멤버를 사용하는 방법이 약간씩 다르다. 2000의 경우 lpstrFile에 경로가 포함되어 있으면 이 멤버보다 lpstrFile의 경로가 우선이나 98은 이 멤버가 NULL이고 lpstrFile에 경로가 있을 경우만 lpstrFile의 경로가 사용된다. 이 경로가 NULL이면 현재 디렉토리 또는 최후 사용한 디렉토리가 시작 디렉토리가 된다.

경로가 NULL인 경우 최후 사용한 디렉토리가 시작 디렉토리가 된다는 내용이 이상하게 동작하더군요
process를 종료하고 다시 시작해도 그 exe가 최후로 열었던  디렉토리가 시작디렉토리가 되더군요
프로세스를 종료했는데.. 그걸 어떻게 기억하는지 도무지 종잡을수가 없네요..

그리고 또 OS버젼에 따라 조금씩 다르기도 하구요
http://msdn.microsoft.com/en-us/library/ms646839(VS.85).aspx



여튼 시작폴더는  OPENFILENAME 구조체의 lpstrInitialDir 와 lpstrFile 에 의해 결정되는데
이는 TOpenDialog로 보면  InitialDir 과 FileName 프로퍼티가 됩니다.


[OpenDialog 시작폴더 내 마음대로 하기]
 
  1. 위 lpstrInitialDir설명을 보면 알겠지만
     lpstrInitialDir 와 lpstrFile 중 시작폴더 우선권은  lpstrFile 에 있습니다.
     즉 FileName을 정해주면 File의 폴더가 시작폴더가 됩니다.
     
     그런데 이경우 FileName에 폴더명까지만 정해서 줄경우 Dialog가 Open되지 않으며
     또 Dialog창에 시작파일명이 default로 정해져 나옵니다.
     default파일명이 필요한 경우는 사용하면 좋겠지만 아닌경우는 좀 그렇죠...

2. lpstrInitialDir 즉 TOpenDialog에서 InitialDir 프로퍼티를 정해줍니다.
     이경우 맨처음에 Dialog를 열때는 정상적으로 원하는 folder에서 open되나
     그 다음부터는 이전에 open한 폴더에서 열립니다.

     왜냐하면 앞에 설명했듯이 InitialDir보다 FileName이 우선하기 때문이죠


항상 특정 폴더에서 Dialog가 열려면?
     항상 특정 폴더에서 Dialog가 열려면
     -InitialDir를 정해주고
     -FileName을 Dialog를 Open하기 전에 NULL로 설정해주면 됩니다.
    
     OpenDialog1->InitialDir="C:\";
     OpenDialog1->FileName="";
     if(OpenDialog1->Execute())
     {
         //...
     } 
     

  </pre>

3.   또 한가지 Dialogs유닛에는 ForceCurrentDirectory 라는 전역변수가 있습니다.
      이 변수는 모든 TOpenDialog , TPictureOpenDialog에 적용되는 설정으로써
      InitialDir 가 없을경우 exe가 있는 폴더에서 Dialog가 열립니다.


그럼...

+ -

관련 글 리스트
942 [Dialog] OpenDialog시작폴더 내 마음대로 하기 장성호 20928 2009/12/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.