用TOpenDialogselect一个目录

我真的很想知道我可以用TOpenDialogselect一个目录的各种方法,无论是下载一个新组件还是使用Delphi提供的组件,但最好使用Delphi提供的组件。

在此之前,我一直在使用SelectDirectory命令,但是我认为对于我的程序的用户来说,查找指定的目录会有困难。

我认为SelectDirectory是'弱',因为它可能是一个漫长的过程,当你search你想要的目录。 比如说,你想导航到Application Data目录。 在那里导航需要多长时间? 最终,用户甚至可能无法到达他们想要的目录。

我需要这样的地方,用户可以复制和粘贴目录到顶部的目录地址栏中。

在这里输入图像说明

谢谢你的答案。

您可以使用TFileOpenDialog (在Vista +上):

 with TFileOpenDialog.Create(nil) do try Options := [fdoPickFolders]; if Execute then ShowMessage(FileName); finally Free; end; 

就个人而言,我总是使用Vista +上的TFileOpenDialog ,并使用TFileOpenDialog上的TFileOpenDialog (好的!) TFileOpenDialog退,如下所示:

 if Win32MajorVersion >= 6 then with TFileOpenDialog.Create(nil) do try Title := 'Select Directory'; Options := [fdoPickFolders, fdoPathMustExist, fdoForceFileSystem]; // YMMV OkButtonLabel := 'Select'; DefaultFolder := FDir; FileName := FDir; if Execute then ShowMessage(FileName); finally Free; end else if SelectDirectory('Select Directory', ExtractFileDrive(FDir), FDir, [sdNewUI, sdNewFolder]) then ShowMessage(FDir) 

你知道两个重载的函数FileCtrl.SelectDirectory生成完全不同的对话框,对吗?

 SelectDirectory(s, [], 0); 

截图oldseldir.png

 SelectDirectory('Select a directory', s, s, []); 

截图newseldir.png

只是发现下面的代码似乎在XP和Vista,Win7的罚款。 它提供了一个用户界面供用户select一个目录。 它使用了TOpenDialog,但为了select一个目录发送一些消息来清理外观。

在受到Windows本身提供的有限function之后,能够给我的用户一个熟悉的用户界面,他们可以舒适地浏览和select文件夹 ,这是一种乐趣。

我一直在寻找这样的东西很长一段时间,所以我想在这里发布,让其他人可以从中受益。

以下是Win 7中的样子:

屏幕截图

 //*********************** //** Choose a directory ** //** uses Messages ** //*********************** //General usage here: // http://www.delphipages.com/forum/showthread.php?p=185734 //Need a class to hold a procedure to be called by Dialog.OnShow: type TOpenDir = class(TObject) public Dialog: TOpenDialog; procedure HideControls(Sender: TObject); end; //This procedure hides de combo box of file types... procedure TOpenDir.HideControls(Sender: TObject); const //CDM_HIDECONTROL and CDM_SETCONTROLTEXT values from: // doc.ddart.net/msdn/header/include/commdlg.h.html // CMD_HIDECONTROL = CMD_FIRST + 5 = (WM_USER + 100) + 5; //Usage of CDM_HIDECONTROL and CDM_SETCONTROLTEXT here: // msdn.microsoft.com/en-us/library/ms646853%28VS.85%29.aspx // msdn.microsoft.com/en-us/library/ms646855%28VS.85%29.aspx CDM_HIDECONTROL = WM_USER + 100 + 5; CDM_SETCONTROLTEXT = WM_USER + 100 + 4; //Component IDs from: // msdn.microsoft.com/en-us/library/ms646960%28VS.85%29.aspx#_win32_Open_and_Save_As_Dialog_Box_Customization //Translation into exadecimal in dlgs.h: // www.koders.com/c/fidCD2C946367FEE401460B8A91A3DB62F7D9CE3244.aspx // //File type filter... cmb1: integer = $470; //Combo box with list of file type filters stc2: integer = $441; //Label of the file type //File name const... cmb13: integer = $47c; //Combo box with name of the current file edt1: integer = $480; //Edit with the name of the current file stc3: integer = $442; //Label of the file name combo var H: THandle; begin H:= GetParent(Dialog.Handle); //Hide file types combo... SendMessage(H, CDM_HIDECONTROL, cmb1, 0); SendMessage(H, CDM_HIDECONTROL, stc2, 0); //Hide file name label, edit and combo... SendMessage(H, CDM_HIDECONTROL, cmb13, 0); SendMessage(H, CDM_HIDECONTROL, edt1, 0); SendMessage(H, CDM_HIDECONTROL, stc3, 0); //NOTE: How to change label text (the lentgh is not auto): //SendMessage(H, CDM_SETCONTROLTEXT, stc3, DWORD(pChar('Hello!'))); end; //Call it when you need the user to chose a folder for you... function GimmeDir(var Dir: string): boolean; var OpenDialog: TOpenDialog; OpenDir: TOpenDir; begin //The standard dialog... OpenDialog:= TOpenDialog.Create(nil); //Objetc that holds the OnShow code to hide controls OpenDir:= TOpenDir.create; try //Conect both components... OpenDir.Dialog:= OpenDialog; OpenDialog.OnShow:= OpenDir.HideControls; //Configure it so only folders are shown (and file without extension!)... OpenDialog.FileName:= '*.'; OpenDialog.Filter:= '*.'; OpenDialog.Title:= 'Chose a folder'; //No need to check file existis! OpenDialog.Options:= OpenDialog.Options + [ofNoValidate]; //Initial folder... OpenDialog.InitialDir:= Dir; //Ask user... if OpenDialog.Execute then begin Dir:= ExtractFilePath(OpenDialog.FileName); result:= true; end else begin result:= false; end; finally //Clean up... OpenDir.Free; OpenDialog.Free; end; end; 

只包括

 FileCtrl.pas var sDir:String; begin SelectDirectory('Your caption','',sDir); end; 

如果想要查看包括桌面在内的所有目录,请将第二个参数留空。 如果您将第二个参数设置为任何有效的path,那么您的对话框将具有到顶层文件夹的path,并且不能超出该path。

例如:

SelectDirectory('Your caption','C:\',sDir)不会让您selectC:\之外的任何内容,如D:\E:\

所以把它留空是件好事。

如果您使用JVCL ,则可以使用TJvSelectDirectory。 有了这个,你可以通过设置属性来切换新旧风格。 例如:

 Dlg := TJvSelectDirectory.Create(Self); try Dlg.Title := MyTitle; Dlg.InitialDir := MyStartDir; Dlg.Options := Dlg.Options + [sdAllowCreate, sdPerformCreate]; Dlg.ClassicDialog := False; //switch style if Dlg.Execute() then NewDir := Dlg.Directory; finally Dlg.Free; end;