请教一个简单的问题,关于目录选择对话框。(100分)

  • 主题发起人 叮叮当当
  • 开始时间

叮叮当当

Unregistered / Unconfirmed
GUEST, unregistred user!
有的程序给用户选择目录时会弹出一个Windows的目录选择对话框,请问是调用API么?好像没有这样的控件呀。
 
用OpenDialog控件就行。
 
看看Delphi/Demos/Imagview下得例子
你要得是不是那种效果?
 
To: shaohong.chen
不是,是要弹出一个目录选择对话框,象有些安装程序给你选目录时弹出的。
我想大家应该看到过这种目录选择对话框吧。

To: biyesheng
好像不行啊,我没找到只选目录的属性,它是用来选择文件的。
 
delphi有一个封装的函数,我记不清了,BU的控件包也有这样的控件
 
uses FileCtrl;

const
SELDIRHELP = 1000;
procedure TForm1.Button1Click(Sender: TObject);
var
Dir: string;
begin
Dir := 'C:/MYDIR';
if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then
Label1.Caption := Dir;
end;
 
To: LeeChange
非常抱歉,我知道可以这样做,但是我看到的目录选择对话框比这个漂亮,好像是Windows自带的风格的目录选择对话框。

也不要Delphi6自带的Samples组件面板里那个ShellTreeView控件,我要的就是对话框的效果,我没有窗体给它做容器。
 
那么你就下载一个psvDialogs吧。
其实就是SHBrowseForFolder的封装。
 
To: shenloqi
能说清楚些么?我记得SHBrowseForFolder很眼熟,好像就是它!
 
DIRDIALOG.ZIP TDirDialog 是封装 SHBrowseForFolder COM 组件之 Windows 95/98 式样的选取文件夹对话框,
以 Tree View 型态让使用者选取我的计算机、网上邻居中的目录,能够建立新的文件夹
( 附源码 ),作者 : 陈浩威。

http://www.vclxx.org/DELPHI/D32FREE/DIRDIALOG.ZIP
 
procedure FreePIDL; external shell32 index 155;
function SelectDir(const Cap: string; var Folder: string): Boolean;
var
BrowseInfo: TBrowseInfo;
ItemIDList: PItemIDList;
ItemSelected : PItemIDList;
NameBuffer: array[0..MAX_PATH] of Char;
WindowList: Pointer;
begin
itemIDList := nil;
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
BrowseInfo.hwndOwner := Application.Handle;
BrowseInfo.pidlRoot := ItemIDList;
BrowseInfo.pszDisplayName := NameBuffer;
BrowseInfo.lpszTitle := PChar(Cap);
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
WindowList := DisableTaskWindows(0);
try
ItemSelected := SHBrowseForFolder(BrowseInfo);
Result := ItemSelected <> nil;
finally
EnableTaskWindows(WindowList);
end;
if Result then
begin
SHGetPathFromIDList(ItemSelected,NameBuffer);
Folder := NameBuffer;
end;
Freepidl(BrowseInfo.pidlRoot);
end;
 
To: shenloqi
请问要use哪些库?ShellAPI好像要的,还有呢?
TBrowseInfo、PItemIDList、…… 都显示未定义。
 
有一个控件叫:PBFOLDERDIALOG,挺好用。
可以自定义标题,还可以新建文件夹....
 
TO: 易名烦
用google找过了,都无法下载……
 
用这个SHBrowseForFolder来改写,其实SelectDirectory就是实现SHBrowseForFolder
接口来实现的
 
我那個可以下載呵
要不你給個Email我發過去

我覺得TDirDialog比PBFOLDERDIALOG好用
1)TDirDialog可以指定默認目錄,而PBFOLDERDIALOG不可以
2)同都不可以新建目錄,雖然PBFOLDERDIALOG說可以,其實里面的新建按鈕為Disabled的
3)PBFOLDERDIALOG指定自定义标题不好,不美觀
 
TO: vine
pschen@21cn.com
谢谢!
 
To: vine
这个东东怎么用?是不是新建一个Package,然后把它的pas加进去再编译+安装?
可编译时提示缺少DsgnIntf.dcu,无法完成编译。
 
function SelectDirectory(const Caption: string; const Root: WideString;
var Directory: string): Boolean;
var
WindowList: Pointer;
BrowseInfo: TBrowseInfo;
Buffer: PChar;
RootItemIDList, ItemIDList: PItemIDList;
ShellMalloc: IMalloc;
IDesktopFolder: IShellFolder;
Eaten, Flags: LongWord;
begin
Result := False;
if not DirectoryExists(Directory) then
Directory := '';
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
begin
Buffer := ShellMalloc.Alloc(MAX_PATH);
try
RootItemIDList := nil;
if Root <> '' then
begin
SHGetDesktopFolder(IDesktopFolder);
IDesktopFolder.ParseDisplayName(Application.Handle, nil,
POleStr(Root), Eaten, RootItemIDList, Flags);
end;
with BrowseInfo do
begin
hwndOwner := Application.Handle;
pidlRoot := RootItemIDList;
pszDisplayName := Buffer;
lpszTitle := PChar(Caption);
ulFlags := BIF_RETURNONLYFSDIRS;
if Directory <> '' then
begin
lpfn := SelectDirCB;
lParam := Integer(PChar(Directory));
end;
end;
WindowList := DisableTaskWindows(0);
try
ItemIDList := ShBrowseForFolder(BrowseInfo);
finally
EnableTaskWindows(WindowList);
end;
Result := ItemIDList <> nil;
if Result then
begin
ShGetPathFromIDList(ItemIDList, Buffer);
ShellMalloc.Free(ItemIDList);
Directory := Buffer;
end;
finally
ShellMalloc.Free(Buffer);
end;
end;
end;
 
顶部