怎么设置opendialog打开目录

hyz_cs 2010-06-25 02:49:54
默认是打开文件,怎么改成可以选择目录.
...全文
745 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzbinfo 2010-06-25
  • 打赏
  • 举报
回复
妖哥说的是,我这是囫囵吞枣,呵呵,当时一个软件里面用到我就用vc的一段代码给改成这样能在bcb6里面用的了,今天看到楼主我就贴出来了,实在是一直没有深究过具体实现,之前也不知道SelectDirectory这个函数可以重载
ccrun.com 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zzbinfo 的回复:]
调用系统的选择目录,

C/C++ code
void __fastcall TForm2::Button3Click(TObject *Sender)
{
AnsiString Dir = SelectFolder("请选择数据包文件目录:");
if(!Dir.IsEmpty())Edit2->Text = Dir;

}
AnsiString __fastc……
[/Quote]

我在11楼的回复中说的SelectDirectory第二种重载形式,本质上就是调用API:ShBrowseForFolder实现的,VCL中已经封装好了,无需再那么麻烦的调用ShBrowseForFolder来实现了。除非你是用纯SDK写代码。

并且,如果你是用CB6做开发,由于这个ShBrowseForFolder函数声明在shlobj.h头文件中,CB6包含这个头文件还需要多做一些工作,需要将以下三行代码放到单元的最开始才能正常编译:
#define NO_WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#include <shlobj.h>
#include <vcl.h>


何必这么受罪呢?
hyz_cs 2010-06-25
  • 打赏
  • 举报
回复
你这个也太复杂了
zzbinfo 2010-06-25
  • 打赏
  • 举报
回复
我一瞌睡就给我排到14楼了,唉,
zzbinfo 2010-06-25
  • 打赏
  • 举报
回复
调用系统的选择目录,
void __fastcall TForm2::Button3Click(TObject *Sender)
{
AnsiString Dir = SelectFolder("请选择数据包文件目录:");
if(!Dir.IsEmpty())Edit2->Text = Dir;

}
AnsiString __fastcall TForm2::SelectFolder(AnsiString Caption)
{

BROWSEINFO bi; //控制Browse对话框上属性的结构体

LPITEMIDLIST ItemID;

char sDir[MAX_PATH]; //MAX_PATH:系统常量,指最大路径长度

char FolderName[MAX_PATH];

memset(&bi, 0, sizeof(BROWSEINFO)); //清零

memset(sDir, 0, MAX_PATH);

bi.hwndOwner = this->Handle;//Application->Handle; //父窗口句柄
bi.pszDisplayName = FolderName; //存放路径的缓冲区

bi.lpszTitle = Caption.c_str(); //对话框标题

bi.ulFlags = BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE; //只显示文件系统文件夹

ItemID = SHBrowseForFolder(&bi);

if(ItemID==NULL)

return "";

SHGetPathFromIDList(ItemID, sDir);

GlobalFree(ItemID);

AnsiString PathName=String(sDir);

if(PathName.IsEmpty())

return "";

if(strcmp(PathName.AnsiLastChar(),"\\")!=0)

PathName+="\\"; //添加路径符

return PathName;

}
//--------------------------------------------------------------
ccrun.com 2010-06-25
  • 打赏
  • 举报
回复
函数重载的本质就是允许函数重名,根据参数的类型,位置,个数的不同,来决定调用具体的那一个定义。

如果还没有理解,google "函数重载"
hyz_cs 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ccrun 的回复:]
我在5楼说过了,SelectDirectory函数有两种重载形式,

一种是
bool __fastcall SelectDirectory(AnsiString &Directory, TSelectDirOpts Options, int HelpCtx);
显示出来是VCL的自建窗口

另一种是
bool __fastcall SelectDirectory(const……
[/Quote]

但两个函数名字是一样的,难道他是根据参数选决定最终用哪种方式的吗?
ccrun.com 2010-06-25
  • 打赏
  • 举报
回复
我在5楼说过了,SelectDirectory函数有两种重载形式,

一种是
bool __fastcall SelectDirectory(AnsiString &Directory, TSelectDirOpts Options, int HelpCtx);
显示出来是VCL的自建窗口

另一种是
bool __fastcall SelectDirectory(constAnsiString Caption, const WideString Root, AnsiString &Directory);
这个显示出来是系统提供的选择目录窗口。

根据你的需求,调用不同形式的函数就可以了。
个人建议用第二种,也就是我在5楼举的例子。
hyz_cs 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ccrun 的回复:]
CBuilder6需要手工添加vclx.lib,2010看来是默认已经加载了这个库。
[/Quote]

同样是这个函数,为什么你的和1楼的会不一样?

SelectDirectory("请选择文件", L"", strDir))
SelectDirectory(AnsiString &Directory, TSelectDirOpts Options, int HelpCtx);
ccrun.com 2010-06-25
  • 打赏
  • 举报
回复
CBuilder6需要手工添加vclx.lib,2010看来是默认已经加载了这个库。
hyz_cs 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hyz_cs 的回复:]
引用 6 楼 ccrun 的回复:
补充一下,SelectDirectory函数声明在FileCtrl.hpp头文件中,但是实现部分是在vclx.lib中,所以,需要将vclx.lib加入到工程,可以在设计时通过Project-->Add to project-->找到$(BCB)\lib\vclx.lib加入,也可以参照我在5楼的回复中用代码来搞定。


用的是bcb2010, lib目……
[/Quote]

bcb2010只要加入这个头文件(#include <FileCtrl.hpp>)就可以了.谢谢妖哥.
hyz_cs 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ccrun 的回复:]
补充一下,SelectDirectory函数声明在FileCtrl.hpp头文件中,但是实现部分是在vclx.lib中,所以,需要将vclx.lib加入到工程,可以在设计时通过Project-->Add to project-->找到$(BCB)\lib\vclx.lib加入,也可以参照我在5楼的回复中用代码来搞定。
[/Quote]

用的是bcb2010, lib目录下没有vclx.lib
ccrun.com 2010-06-25
  • 打赏
  • 举报
回复
补充一下,SelectDirectory函数声明在FileCtrl.hpp头文件中,但是实现部分是在vclx.lib中,所以,需要将vclx.lib加入到工程,可以在设计时通过Project-->Add to project-->找到$(BCB)\lib\vclx.lib加入,也可以参照我在5楼的回复中用代码来搞定。
ccrun.com 2010-06-25
  • 打赏
  • 举报
回复
OpenDialog只提供一个选择文件的窗口,不能选择目录。

要选择目录,可以用VCL提供的SelectDirectory函数就可以了,不过需要注意,这个函数有两个重载形式,一种是VCL的自建窗口,另一种是调用系统的打开目录窗口:

#include <FileCtrl.hpp>
#pragma link "C:\\Program Files\\Borland\\CBuilder6\\Lib\\vclx.lib"

void __fastcall TForm1::Button1Click(TObject *Sender)
{
String strDir = "";

if (SelectDirectory("请选择文件", L"", strDir))
ShowMessage(strDir);
else
ShowMessage("没有选择文件");
}
hyz_cs 2010-06-25
  • 打赏
  • 举报
回复
利用OpenDialog1来选择目录.只有1楼理解对了
tinki 2010-06-25
  • 打赏
  • 举报
回复
OpenDialog1->InitialDir ="F:\\3860\\" ;
周药师 2010-06-25
  • 打赏
  • 举报
回复

//默认打开F盘3860目录
OpenDialog1->InitialDir ="F:\\3860\\" ;
OpenDialog1->Execute();
我不懂电脑 2010-06-25
  • 打赏
  • 举报
回复
选择目录用
Builder提供的函数SelectDirectory可实现目录名的选择,它显示的是类似“打开”/“保存”的对话框,但其优点是可使用/不使用键盘输入目录名,并允许创建新目录,缺点是界面为英文。其原形定义如下:

extern PACKAGE bool __fastcall SelectDirectory(AnsiString &Directory, TSelectDirOpts Options, int HelpCtx);

下面的例程SelectDir允许您选择目录:

#include < FileCtrl.hpp >

AnsiString SelectDir(AnsiString Dir)

{

if(SelectDirectory(Dir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt,0))

return Dir;

else return "";

}

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧