[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가 열립니다.
그럼...