C++Builderで、ファイルを開くダイアログボックスを表示するにはTOpenDialog
クラスTFileOpenDialog
クラスを使用します。
この記事では、TOpenDialogの基本的な使い方を説明します。
TOpenDialog
TOpenDialogを使用したサンプルコードと、主なプロパティについて説明します。
サンプルコード
TOpenDialogのサンプルコードです。OptionsプロパティにofAllowMultiSelectをセットし、複数ファイル及を選択できるようにしています。
また、以下のプロパティの設定をしています。
- Title
- InitialDir
- Options
- Filter
OpenDialog->Title = "画像ファイルの読み込み";
OpenDialog->InitialDir = "D:\\画像\\";
OpenDialog->Options << ofAllowMultiSelect;
// ----------------
OpenDialog->Filter = (String)"画像ファイル|*.bmp;*.dib;*.jp*;*.gif;*.png;*.webp;*.ICO;*.TIF*;*.heic"
+ "|" + "JPEG|*.jp*"
+ "|" + "PNG|*.png*"
+ "|" + "webp|*.webp"
+ "|" + "BMP|*.bmp;*.dib"
+ "|" + "GIF|*.gif"
+ "|" + "TIFF|*.tif*"
+ "|" + "ICON|*.ico*"
+ "|" + "heic|*.heic*"
+ "|" + "全|*.*";
if (OpenDialog->Execute())
{
Memo1->Lines->Assign(OpenDialog->Files);
}
実行結果です。
主なプロパティ
主なプロパティの一覧です。
主なプロパティ | 種別 | 説明 |
---|---|---|
DefaultExt | published | デフォルトのファイル拡張子を指定します。 |
FileName | published | 最後に選択されたファイルの名前とそこへのディレクトリ パスを示します。 |
Files | public | 選択されたファイル名のリスト。 |
Filter | published | ダイアログボックスで使用できるファイルマスク(フィルタ)を指定します。 |
FilterIndex | published | ダイアログを開いたときに、デフォルトで選択されているフィルタを指定します。 |
InitialDir | published | ダイアログボックスが開いたときのカレントディレクトリを指定します。 |
Name | published | コードで参照されている、コンポーネントの名前を示します。 |
Options | published | ファイル選択ダイアログの外観と動作を決定します。 |
OptionsEx | published | Options プロパティを、ファイル選択ダイアログの外観と動作を決定する追加フラグで増加させます。 |
Owner | public | コンポーネントをストリーム化および解放する権限を持つコンポーネントを示します。 |
Tag | published | NativeInt 整数値をコンポーネントの一部として保持します。 |
Title | published | ダイアログボックスのタイトルバーに表示するテキストを指定します。 |
Filter
ダイアログボックスで使用できるファイルマスク(フィルタ)です。
ファイル選択用のダイアログボックスには,編集ボックスにファイルの種類を表示するドロップダウンリストがあります。ユーザーがリストからファイルの種類を選択すると,選択した種類のファイルだけがダイアログボックスに表示されます。
設計時にファイルマスクを作成するには,オブジェクトインスペクタで Filter プロパティの右側にある省略記号(…)をクリックします。これで Filter エディタが開きます。Filter エディタの左列の Filter 名の下に,実行時に使用できる各ファイルの種類の簡単な説明を入力します。右の列の Filter の下には,各説明に対応するファイルマスクを入力します。たとえば,マスク「*.txt」の左には「テキストファイル」という説明が表示され,「*.pas」の左には「Pascal のソースファイル」という説明が表示されます。実行時にはドロップダウンリストに説明が表示されるので,フィルタマスクを明示的に示す方が使用しやすくなります(たとえば「テキストファイル(*.txt)」など)。
プログラムコードでファイルマスクを作成するには,縦棒(パイプ)で区切られた説明とマスクで構成される Filter プロパティに値を代入します。縦棒の両側にはスペースを入れないでください。次に例を示します。
OpenDialog1->Filter = "Text files (*.txt)|*.TXT";
複数のフィルタは縦棒で区切らなければなりません。次に例を示します。
OpenDialog1->Filter = "Text files (*.txt)|*.TXT|Pascal files (*.pas)|*.PAS";
1 つのフィルタに複数のマスクを含めるには,マスクをセミコロンで区切ります。これはオブジェクトインスペクタとプログラムコードの両方で機能します。次に例を示します。
OpenDialog1->Filter = "Pascal files|*.PAS;*.DPK;*.DPR";
DefaultExt
デフォルトのファイル拡張子を指定します。
DefaultExt は,選択されたファイル名に登録されている拡張子が含まれていない場合に,選択されたファイル名に自動的に付けられるファイル拡張子を指定します。ユーザーが登録されていない拡張子を持つファイル名を選択した場合,DefaultExt プロパティが示すデフォルトの拡張子がその登録されていない拡張子に追加されます。
3 文字を超える拡張子はサポートされていません。ファイル名と拡張子を分けるピリオド(.)は入力しないでください。
#include <stdio.h> // For FILE
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *stream;
OpenDialog1->Options.Clear();
OpenDialog1->Options << ofAllowMultiSelect << ofFileMustExist;
OpenDialog1->Filter = L"Text files (*.txt)|*.txt|All files (*.*)|*.*";
OpenDialog1->FilterIndex = 2; // Start the dialog, showing all files.
if (OpenDialog1->Execute())
{
TStringList *Test = new TStringList;
Test->LoadFromFile(OpenDialog1->Files->Strings[0]); // Just a debugging experiment
for (int I = 0; I < OpenDialog1->Files->Count; I ++)
{
#define USE_ENCODING
#if defined(USE_ENCODING)
TBytes FirstLine; // A dynamic array of bytes
FirstLine.Length = 512;
stream = _wfopen(OpenDialog1->Files->Strings[I].c_str(), L"r");
fgets(&FirstLine[0], FirstLine.Length, stream);
Memo1->Lines->Append(TEncoding::UTF8->GetString(FirstLine));
fclose(stream);
#else
char FirstLine[512];
stream = _wfopen(OpenDialog1->Files->Strings[I].c_str(), L"r");
fgets(FirstLine, sizeof(FirstLine), stream);
Memo1->Lines->Append(UTF8String(FirstLine));
fclose(stream);
#endif
}
}
}
InitialDir
ダイアログボックスが開いたときのカレントディレクトリを指定します。
InitialDir プロパティは,ファイル選択用のダイアログボックスが開いたときに表示されるデフォルトのディレクトリを指定します。たとえば,WINDOWS\SYSTEM ディレクトリをデフォルトにする場合は,InitialDir プロパティの値を C:\WINDOWS\SYSTEM に設定します。
InitialDir プロパティに値が代入されていない場合,または指定したディレクトリが存在しない場合,初期ディレクトリはグローバルの ForceCurrentDirectory 変数で制御されます。ForceCurrentDirectory が true の場合,ダイアログに現在の作業ディレクトリが表示されます。それ以外の場合は,Windows のバージョンに応じて,現在の作業ディレクトリ(NT)または My Documents ディレクトリのどちらかが表示されます。
Options
TOpenOption および TOpenOptions により、ファイル選択ダイアログの動作が決まります。
TOpenOption の値により、ファイル選択ダイアログの外見と動作が決まります。TOpenOptions は TOpenOption の値の集合です。
取り得る値の一覧を次の表に示します。
値 | 意味 |
---|---|
ofReadOnly | ダイアログが開いたときに、[読み出し専用ファイルとして開く]チェック ボックスをデフォルトでオンにします。 |
ofOverwritePrompt | 既に使用されているファイル名をユーザーが選択しようとした場合には警告メッセージを生成し、既存のファイルを上書きするかどうかを尋ねます(保存ダイアログで使用)。 |
ofHideReadOnly | ダイアログから[読み出し専用ファイルとして開く]チェック ボックスを削除します。 |
ofNoChangeDir | ユーザーが[OK]をクリックしたら、現在のディレクトリを、ファイル選択ダイアログが開く前の状態にリセットします。 |
ofShowHelp | ダイアログに[ヘルプ]ボタンを表示します。 |
ofNoValidate | ファイル名に無効な文字が含まれていないかどうかの確認を行いません。無効な文字が含まれているファイル名を選択できるようになります。 |
ofAllowMultiSelect | ダイアログでユーザーが複数のファイルを選択できるようになります。 |
ofExtensionDifferent | このフラグは、実行時に DefaultExt と異なる拡張子を持つファイル名が選択されるたびにオンになります。アプリケーションでこのフラグを使用する場合は、必ずリセットします。 |
ofPathMustExist | 存在しないディレクトリ パスのファイル名をユーザーが選択しようとした場合、エラー メッセージを生成します。 |
ofFileMustExist | 存在しないファイルをユーザーが選択しようとした場合、エラー メッセージを生成します([ファイルを開く]ダイアログにのみ適用)。 |
ofCreatePrompt | 存在しないファイルをユーザーが選択しようとした場合には警告メッセージを生成し、指定の名前で新しいファイルを作成するかどうかを尋ねます。 |
ofShareAware | 共有エラーを無視し、共有違反が発生した場合でもファイルを選択できるようにします。 |
ofNoReadOnlyReturn | 読み取り専用ファイルをユーザーが選択しようとした場合、エラー メッセージを生成します。 |
ofNoTestFileCreate | ネットワーク ファイルが保護されているかどうかや、ディスク ドライブにアクセスできるかどうかの確認を行いません。作成可能で変更不能な共有ネットワーク ディレクトリにユーザーがファイルを保存しようとした場合にのみ適用されます。 |
ofNoNetworkButton | ([ネットワーク ドライブの割り当て]ダイアログを開く)[ネットワーク]ボタンをファイル選択ダイアログから削除します。ofOldStyleDialog フラグがオンになっている場合にのみ適用されます。 |
ofNoLongNames | 8.3 文字のファイル名のみ表示します。このオプションは、Options プロパティに ofOldStyleDialog も含まれている場合にのみ有効です。 |
ofOldStyleDialog | 以前のスタイルのファイル選択ダイアログを作成します。 |
ofNoDereferenceLinks | Windows ショートカットの逆参照を無効にします。ユーザーがショートカットを選択した場合は、そのショートカットにリンクしているファイルではなく、ショートカットそのもの(.LNK ファイル)のパスとファイル名を FileName プロパティに割り当てます。 |
ofEnableIncludeNotify | (Windows 2000 以降の場合のみ) ユーザーがフォルダを開いたとき、ダイアログに CDN_INCLUDEITEM 通知メッセージを送信します。新しく開かれたフォルダ内の項目ごとに、通知が送信されます。これらのメッセージを使用すると、フォルダの項目リストに表示される項目を制御できます。 |
ofEnableSizing | (Windows 98 以降の場合のみ)マウスやキーボードでエクスプローラ形式のダイアログをサイズ変更できるようにします。デフォルトでは、このオプションの値にかかわらず、ダイアログのこのようなサイズ変更が可能になっています。フック手続きやカスタム テンプレートを用意する場合にのみ、設定する必要があります(古い形式のダイアログではサイズを変更できません)。 |
ofDontAddToRecent | 最近開いたファイルのリストにファイルが追加されないようにします。 |
ofForceShowHidden | 隠しファイルが必ずダイアログに表示されるようにします。 |
PromptForFileName関数
C++BuilderのPromptForFileName
関数は、ファイル選択ダイアログを簡単に表示し、ユーザーが選択したファイル名を取得するための便利なユーティリティ関数です。この関数を使用すると、TOpenDialog
やTFileOpenDialog
コンポーネントを直接使用するよりも、簡潔なコードでファイル選択ダイアログを実装できます。
プロトタイプ宣言
PromptForFileName
関数のプロトタイプ宣言です。
bool PromptForFileName(System::UnicodeString &AFileName,
const System::UnicodeString AFilter = System::UnicodeString(),
const System::UnicodeString ADefaultExt = System::UnicodeString(),
const System::UnicodeString ATitle = System::UnicodeString(),
const System::UnicodeString AInitialDir = System::UnicodeString(),
bool SaveDialog = false);
以下、PromptForFileName
関数の引数の説明です。
- AFileName: 選択されたファイル名を格納するための変数(参照渡し)。
- AFilter: ファイルのフィルタ(例:”Text Files (.txt)|.TXT”)。
- ADefaultExt: デフォルトのファイル拡張子。
- ATitle: ダイアログボックスのタイトル。
- AInitialDir: ダイアログボックスを開くときの初期ディレクトリ。
- Options: ダイアログボックスのオプション設定(例:ofFileMustExist)。
- Save: trueに設定すると、ファイル保存ダイアログとして表示される。
サンプルコード
- インクルードファイル
#include <Vcl.Dialogs.hpp>
- サンプルコード
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String FileName;
if (PromptForFileName(FileName, "Text Files (*.txt)|*.TXT", "txt", "Select a text file"))
{
ShowMessage("Selected file: " + FileName);
}
else
{
ShowMessage("No file selected.");
}
}
- 実行結果