在BCB中使用选择文件夹对话框

By jingzhongrong

编程时的需要,我封装了一个类。由于BCB有些头文件中的结构定义与微软Windows.h中有些结构的定义相同,所以在使用的时候应该在文件最前的地方加上一句

#define NO_WIN32_LEAN_AND_MEAN 

下面是类的头文件

 

#define NO_WIN32_LEAN_AND_MEAN
#ifndef CommonH
#define CommonH
#include 
<shlobj.h>
#include 
<vcl.h>
//---------------------------------------------------------------------------
class  FolderBrowseDialog
{
 
//
for user
 
//
usage:
 
//
declare:
 
//
   FolderBrowseDialog fd;
 
//
set properties:
 
//
   fd.Title = "选择目录";
 
//
   fd.Execute(Application->Handle);
 
//
result:
 
//
   fd.FolderName
 
//   fd.FolderPath


private :
   BROWSEINFO FInfo;

protected
:
   
char FFolderName[260];        /**保存返回的目录名称*/

   AnsiString FFolderPath;       
/**保存路径名*/
   AnsiString __fastcall GetDialogTitle(
void );
   
void
 __fastcall SetDialogTitle(AnsiString title);
   AnsiString __fastcall GetFolderPath(
void
);
   AnsiString __fastcall GetFolderName(
void
);

public
:
   
/*
*初始化调用句柄
   @HwndOwner 调用者句柄
   
*/

  FolderBrowseDialog(HWND HwndOwner);
  FolderBrowseDialog();    
//如果没有指定句柄,则需使用带参数的Execute函数
  void __fastcall SetBrowseInfoFlags(UINT ulFlags);     /**提供对FInfo的自定义*/
  
bool __fastcall Execute(void);       //打开对话框
  bool  __fastcall Execute(HWND HwndOwner);
   __property AnsiString Title
={read=GetDialogTitle, write=
SetDialogTitle};
   __property AnsiString FolderName
={read=
GetFolderName};
  __property AnsiString FolderPath
={read=
GetFolderPath};

};

 

使用方法如下:

 FolderBrowseDialog fd;
 set properties:
 fd.Title = "选择目录";
  fd.Execute(Application->Handle);
获取结果
 fd.FolderName
  fd.FolderPath

 

下面是类的实现文件:

 

#include "Common.h"   //上面头文件的名字
#define INFO_BUFFER_SIZE 32767

FolderBrowseDialog::FolderBrowseDialog(HWND HwndOwner)
{
   memset(
&FInfo,0,sizeof (BROWSEINFO));
  memset(FFolderName,
0,260
);
   FInfo.hwndOwner 
=
 HwndOwner;
   FInfo.pszDisplayName 
=
 FFolderName;
   FInfo.lpszTitle 
= "请选择目录"
;
   FInfo.ulFlags 
=
 BIF_RETURNONLYFSDIRS;
}
//---------------------------------------------------------------------------

FolderBrowseDialog::FolderBrowseDialog()
{
   memset(
&FInfo,0,sizeof
(BROWSEINFO));
   memset(FFolderName,
0,260
);
   FInfo.pszDisplayName 
=
 FFolderName;
   FInfo.lpszTitle 
= "请选择目录"
;
   FInfo.ulFlags 
=
 BIF_RETURNONLYFSDIRS;
}
//---------------------------------------------------------------------------

void  __fastcall FolderBrowseDialog::SetBrowseInfoFlags(UINT ulFlags)
{
   FInfo.ulFlags 
=
 ulFlags;
}
//---------------------------------------------------------------------------

bool  __fastcall FolderBrowseDialog::Execute()
{
   LPITEMIDLIST ItemID;
   
char
 SelectDir[INFO_BUFFER_SIZE];
   memset(SelectDir,
0
,INFO_BUFFER_SIZE);
   ItemID 
= SHBrowseForFolder(&
FInfo);
   
if
(ItemID)
   {
      SHGetPathFromIDList(ItemID,SelectDir);
      GlobalFree(ItemID);
      FFolderPath 
=
 AnsiString(SelectDir);
      
return true
;
   }
   
else

   {
      
return false ;
   }
}
//---------------------------------------------------------------------------

bool  __fastcall FolderBrowseDialog::Execute(HWND HwndOwner)
{
   FInfo.hwndOwner 
=
 HwndOwner;
   
if
(Execute())
   {
      
return true
;
   }
   
else

   {
      
return false ;
   }
}
//---------------------------------------------------------------------------

AnsiString __fastcall FolderBrowseDialog::GetDialogTitle()
{
   
return
 FInfo.lpszTitle;
}
//---------------------------------------------------------------------------

AnsiString __fastcall FolderBrowseDialog::GetFolderName()
{
   
return
 AnsiString(FFolderName);
}
//---------------------------------------------------------------------------

void  __fastcall FolderBrowseDialog::SetDialogTitle(AnsiString title)
{
   FInfo.lpszTitle 
=
 title.c_str();
}
//---------------------------------------------------------------------------

AnsiString __fastcall FolderBrowseDialog::GetFolderPath()
{
   
return
 FFolderPath;
}
//
---------------------------------------------------------------------------

 

添加到工程中便可以使用了


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值