2024/06/03 電子書籍「電子書籍出版・技術文書作成を劇的に加速!秀丸エディタ + Markdown + Pandocの驚異」を出版

SelectDirectoryの使い方

C++Builder

SelectDirectoryは、ディレクトリ(フォルダ)を入力または選択できる[ディレクトリの選択]ダイアログ ボックスを開きます。

この記事では、SelectDirectoryの使い方を説明します。

SelectDirectory

SelectDirectoryの概要です。

  • プロトタイプ
extern DELPHI_PACKAGE bool __fastcall SelectDirectory(System::UnicodeString &Directory, 
							TSelectDirOpts Options, 
							System::LongInt HelpCtx)/* overload */;
extern DELPHI_PACKAGE bool __fastcall SelectDirectory(const System::UnicodeString Caption, 
							const System::WideString Root, 
							System::UnicodeString &Directory, 
							TSelectDirExtOpts Options = (TSelectDirExtOpts() << TSelectDirExtOpt::sdNewUI ), 
							Vcl::Controls::TWinControl* Parent = (Vcl::Controls::TWinControl*)(0x0))/* overload */;
#ifndef _WIN64
extern DELPHI_PACKAGE bool __fastcall SelectDirectory(const System::UnicodeString StartDirectory, 
		/* out */ System::DynamicArray<System::UnicodeString> &Directories, 
		TSelectDirFileDlgOpts Options = TSelectDirFileDlgOpts() , 
		const System::UnicodeString Title = System::UnicodeString(), 
		const System::UnicodeString FolderNameLabel = System::UnicodeString(), 
		const System::UnicodeString OkButtonLabel = System::UnicodeString(), HWND ParentWnd = (HWND)(0x0))/* overload */;

#else /* _WIN64 */
extern DELPHI_PACKAGE bool __fastcall SelectDirectory(const System::UnicodeString StartDirectory, 
		/* out */ System::DynamicArray<System::UnicodeString> &Directories, 
		TSelectDirFileDlgOpts Options = TSelectDirFileDlgOpts() , 
		const System::UnicodeString Title = System::UnicodeString(), 
		const System::UnicodeString FolderNameLabel = System::UnicodeString(), 
		const System::UnicodeString OkButtonLabel = System::UnicodeString(), 
		HWND ParentWnd = (HWND)(0ULL))/* overload */;
#endif /* _WIN64 */
  • ヘッダファイル
#include <Vcl.FileCtrl.hpp>			// for SelectDirectory
#include<stdint.h>					// uint64_t

Directory パラメータに渡す値は、このダイアログ ボックスが表示されたときに、現在選択されているディレクトリとして表示されます。SelectDirectory メソッドでは、新しく選択されたディレクトリを Directory に入れて返します。Options パラメータは、[ディレクトリの選択]ダイアログ ボックスのカスタム応答を指定します。それぞれの構文に応じて Options の取り得る値を確認してください。

  • Options は TSelectDirOpt の集合です。HelpCtx パラメータはヘルプのコンテキスト ID 番号です。

SelectDirectory メソッドでは、ユーザーがディレクトリを選択し[OK]をクリックした場合は True を返し、ユーザーが[キャンセル]をクリックしたり、ディレクトリを選択せずにダイアログ ボックスを閉じた場合は False を返します。

Vcl.FileCtrl.SelectDirectory - RAD Studio API Documentation

サンプルコード:SelectDirectory (C++)

以下、Embaacderoが公開しているサンプルコードです。

VCL

#include "FileCtrl.hpp"

const SELDIRHELP = 1000;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String Dir = "C:\\Program Files\\CodeGear";
  if (SelectDirectory(Dir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt,
     SELDIRHELP))
  {
	 Label1->Caption = Dir;
  }
}

FMX

#include <FileCtrl.hpp>
#include <IOUtils.hpp>
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String Dir;
  if (SelectDirectory("Select document folder", System::Ioutils::TPath::GetDocumentsPath(), Dir))
  {  
    Label1->Text = Dir;
  }
}

オプション設定

SelectDirectoryのオプション設定について説明します。

TSelectDirOpts

TSelectDirOptsTSelectDirOpt を使用すると、存在しないディレクトリをユーザーが入力したときに[ディレクトリの選択]ダイアログがどう応答するかを決定できます。

  • TSelectDirOpt は、以下のように定義されています。
typedef System::Set<TSelectDirOpt, TSelectDirOpt::sdAllowCreate, 
    TSelectDirOpt::sdPrompt> TSelectDirOpts;
  • オプション セットに追加可能な値は以下のとおりです。
意味
sdAllowCreateユーザーは、存在しないディレクトリの名前を編集ボックスに入力できます。このオプションでは、ディレクトリは作成されません。アプリケーションで、選択されたディレクトリの名前を読み取り、必要であればディレクトリを作成する必要があります。
sdPerformCreate必ず sdAllowCreate と組み合わせて使用します。存在しないディレクトリ名を入力すると、[ディレクトリの選択]ダイアログでそのディレクトリが作成されます。
sdPrompt必ず sdAllowCreate と組み合わせて使用します。入力したディレクトリが存在しない場合に、その旨を知らせ、ディレクトリを作成するかどうかを尋ねるメッセージ ボックスを表示します。ユーザーが[OK]をクリックした場合、オプション セットに sdPerformCreate が含まれていれば、ディレクトリが作成されます。オプション セットに sdPerformCreate が含まれていないと、ディレクトリは作成されません。アプリケーションでディレクトリ名を読み取って、作成しなければなりません。
Vcl.FileCtrl.TSelectDirOpts - RAD Studio API Documentation

TSelectDirExtOpts

TSelectDirExtOpts は、SelectDirectory の呼び出しで表示される[ディレクトリの選択]ダイアログ ボックスをカスタマイズするためのオプションの集合型です。

TSelectDirExtOpts は、以下のように定義されています

typedef System::Set<TSelectDirExtOpt, TSelectDirExtOpt::sdNewFolder, 
    TSelectDirExtOpt::sdValidateDir> TSelectDirExtOpts;

SelectDirectory 関数の Options パラメータは TSelectDirExtOpts 型の集合です。このパラメータでは、作成する[ディレクトリの選択]ダイアログ ボックスの種類を指定します。

TSelectDirExtOpts 型の集合の要素に使用できる値を次の表に示します。

オプション意味
sdNewFoldersdNewUI オプションが有効な場合、[新しいフォルダーの作成]ボタンを表示します。
sdShowEdit現在選択中のフォルダ/ファイルが記載されている編集ボックスを表示します。これを使用して、選択するフォルダ/ファイルの名前を入力することもできます。
sdShowShares[ディレクトリの選択]ダイアログ ボックス内にリモート システム上の共有リソースも表示します。これにより、sdNewUI オプションが自動的に有効になります。
sdNewUIこのオプションを使用すると、サイズ変更可能で[新しいフォルダーの作成]ボタンの付いた新しい種類のダイアログ ボックスを表示できます。このダイアログ ボックスでは、フォルダまたはファイルに対して、ドラッグ アンド ドロップおよびコンテキスト メニューも使用できます。
sdShowFiles[ディレクトリの選択]ダイアログ ボックスにファイルも表示します。
sdValidateDirsdShowEdit オプションが有効な場合、編集ボックスに挿入されたフォルダ/ファイルの名前を検証します。この検証により、TBrowseForFolderCallbackEvent 型のイベントがトリガされます。
Vcl.FileCtrl.TSelectDirExtOpts - RAD Studio API Documentation

サンプルコード2

筆者の作成したサンプルコードです。

OpenFolder1

    // 呼び出し例
	OpenFolder1("D:\\画像\\");


// ----------------------------------------------------------------------------
/**
 * @brief		フォルダ選択用のダイアログを開く
 *
 * @param[in]	String dir : [ディレクトリの選択]ダイアログ ボックスが表示された時点で選択されているディレクトリを指定します。
 * @return		String : ディレクトリを選択し[OK]をクリックした場合は True を返します
 */
// ----------------------------------------------------------------------------
String __fastcall TSDIAppForm::OpenFolder1(String dir)
{
	String Dir			= dir;
	TSelectDirOpts opt = TSelectDirOpts() << sdAllowCreate << sdPerformCreate;
	if(SelectDirectory(Dir, opt, 0))
	{
		// Edit1->Text = Dir;
	}                 
	return Dir;
}
  • 実行結果

OpenFolder2

サイズ変更可能で[新しいフォルダーの作成]ボタンの付いた新しい種類のダイアログ ボックスを表示できます。このダイアログ ボックスでは、フォルダまたはファイルに対して、ドラッグ アンド ドロップおよびコンテキスト メニューも使用できます。

    // 呼び出し例
	OpenFolder2(L"画像ファイルを保存するフォルダを選択してください", "", "D:\\画像\\");

// ----------------------------------------------------------------------------
/**
 * @brief		フォルダ選択用のダイアログを開く
 *
 * @param[in]	String	caption	: ダイアログのタイトル (キャプションではない)
 * @param[in]	String	root	: ルートディレクトリ
 * @param[in]	String	dir		: [ディレクトリの選択]ダイアログ ボックスが表示された時点で選択されているディレクトリを指定します。
 *
 * @return		String : 選択したフォルダ名
 */
// ----------------------------------------------------------------------------
String __fastcall TImgCont1::OpenFolder2(String caption, String root, String dir)
{
	String Dir			= dir;
	TSelectDirExtOpts options = TSelectDirExtOpts() << sdNewUI << sdShowEdit << sdNewFolder;

	if (SelectDirectory(caption,  root, Dir, options))
	{
		// Edit1->Text = Dir;
	}
	return Dir;
}
  • 実行結果

OpenFolder3

複数のフォルダを選択できりダイアログを表示します。

	呼び出し例
    String Dir			= "D:\\画像\\";
	int count = OpenFolder3((TStringList*)Memo1->Lines,
                        Dir, //  String StartDir
						(String)"画像ファイルをを選択するフォルダを選択してください",
						_TEXT("画像ファイルフォルダー:"),		// String FolderName,
						"画像の選択"							// String BtnCaption

// ----------------------------------------------------------------------------
/**
 * @brief		Folder3を開く
 *
 * @param[in,out]	TStringList*	FileList	: 取得したフォルダ名を格納するストリングリスト
 * @param[in]		String			StartDir	: ダイアログ表示開始時の選択フォルダ名
 * @param[in]		String			Title		: ダイアログのタイトル
 * @param[in]		String			FolderName	: フォルダ名入力欄のラベル
 * @param[in]		String			BtnCaption	: [OK] ボタンのキャプション
 *
 * @return		int : 取得したフォルダの数
 */
// ----------------------------------------------------------------------------
int __fastcall TImgCont1::OpenFolder3(TStringList *FileList, String StartDir, 
							String Title,
							String FolderName,
							String BtnCaption)
{
	int fileNum			= 0;
	String  LStartDir	= StartDir;
	String  LTitle		= Title;
	String  LFolderName	= FolderName;
	String  LBtnCaption	= BtnCaption;
	System::DynamicArray<System::UnicodeString> LDirArray;

	// -------------------------------------
	TSelectDirFileDlgOpts Options = TSelectDirFileDlgOpts() << sdAllowMultiselect;
	// -------------------------------------
	if( SelectDirectory(LStartDir,
						LDirArray,
						Options,
						LTitle,
						LFolderName,
						LBtnCaption ) )
	{
		for (int i=LDirArray.Low; i<=LDirArray.High; i++)
		{
			FileList->Add( (String)LDirArray[i] );
			fileNum++;
		}
    }
	
	return fileNum;
}
  • 実行結果
タイトルとURLをコピーしました