FileSelectDialog関数の働き・役割
FileSelectDialog関数は、ユーザーにファイルまたはフォルダーを選択させるためのダイアログウィンドウを作成する関数です。
この関数を使用することで、ファイルの読み込みや保存の際に、ユーザーに直接ファイルやフォルダーを指定させることができます。ダイアログウィンドウは、ファイルの拡張子フィルタや初期ディレクトリを設定でき、複数のファイルを選択するオプションも提供します。これは、ファイル操作を行うエキスパートアドバイザやスクリプトで非常に便利です。
FileSelectDialog関数の引数について
FileSelectDialog関数の引数構成は以下の通りです。
int FileSelectDialog(
string caption, // ウィンドウヘッダ
string initial_dir, // 初期ディレクトリ
string filter, // 拡張子フィルタ
uint flags, // フラグの組み合わせ
string& filenames[], // ファイル名の配列
string default_filename // デフォルトファイル名
);
caption
- ダイアログウィンドウのヘッダです。この文字列は、ダイアログのタイトルバーに表示されます。
initial_dir
filter
ファイル選択ダイアログウィンドウに表示されるファイルの種類を制限するために使用されます。つまり、ユーザーがファイルを選択する際に、特定の種類のファイルのみを表示するように設定できます。
例えば、テキストファイルだけを表示したい場合や、すべてのファイルを表示したい場合にフィルタを設定します。
フィルタの形式は以下のようになります。
"説明1|拡張子1|説明2|拡張子2|..."
「説明」とは、ファイル選択ダイアログでユーザーに表示される文字列のことです。これがユーザーに対して、どの種類のファイルがフィルタリングされているのかを示します。具体的に言うと、以下のようなものです。
具体的な例を挙げると、以下のようになります。
"Text files (*.txt)|*.txt|All files (*.*)|*.*"
この場合、フィルタには2つのオプションがあります。
- 「Text files (*.txt)」はテキストファイルのみを表示します。拡張子は「.txt」です。
- 「All files (.)」はすべてのファイルを表示します。拡張子は「.」です。
※この説明だけだと、まだまだピンとこない人が多いかもしれません。より具体的に説明します。
理解のポイント
- フィルタの説明部分 (|の前)
- これはダイアログに表示されるテキストで、ユーザーに対してどの種類のファイルが表示されるかを説明するためのものです。
- 例: Text files (.txt) や All files (.*)
- この部分は表示のための文字列であり、文法的な特別な意味はありません。説明文の中で拡張子がわかりやすいようにカッコで括られていることが多いです。
- 拡張子指定部分 (|の後)
- これは実際にダイアログで表示するファイルの種類を制限するための文法的な指定です。
- 例: *.txt や *.*
- この部分はファイルの拡張子を指定するためのもので、ワイルドカード(*)を使って特定のパターンに一致するファイルを指定します。
ワイルドカードとは
ワイルドカードとは今回の*のように文字列の一部を指定せずに、任意の文字や文字列を表す特別な記号の事をいいます。
具体例
フィルタの設定: “Text files (.txt)|.txt|All files (.)|.“
- Text files (*.txt)(フィルタの説明部分)
- ダイアログに表示される説明です。「テキストファイル (*.txt)」と表示されます。
- 文法的な特別な意味はなく、ユーザーにわかりやすくするための文字列です。
- *.txt(拡張子指定部分)
- 実際に表示されるファイルの種類を指定します。「.txt」拡張子を持つすべてのファイルを表示します。
- 文法的な意味を持ち、ファイルフィルタリングのために使用されます。
- All files (.)(フィルタの説明部分)
- ダイアログに表示される説明です。「すべてのファイル (.)」と表示されます。
- 文法的な特別な意味はなく、ユーザーにわかりやすくするための文字列です。
- .(拡張子指定部分)
- 実際に表示されるファイルの種類を指定します。すべてのファイルを表示します。
- 文法的な意味を持ち、ファイルフィルタリングのために使用されます。
flags
この引数は、ダイアログウィンドウの動作モードを定義するために使用されます。
- ダイアログウィンドウモードを定義するフラグの組み合わせです。主なフラグは以下の通りです。
- FSD_WRITE_FILE: ファイルを開くダイアログ
- FSD_SELECT_FOLDER: フォルダのみの選択を許可する
- FSD_ALLOW_MULTISELECT: 複数ファイルの選択を許可する
- FSD_FILE_MUST_EXIST: 選択したファイルは存在する必要がある
- FSD_COMMON_FOLDER: すべてのクライアント端末の共通フォルダ\Terminal\Common\Filesにファイルがある
filenames
default_filename
- デフォルトのファイルまたはフォルダー名です。指定されている場合、この名前が自動的にダイアログに追加されます。
FileSelectDialog関数の戻り値について
FileSelectDialog関数は、操作結果を戻り値として返します。戻り値は以下の通りです。
- 正常に完了した場合: 選択されたファイルまたはフォルダーの数を返します。
- ユーザーが選択をキャンセルした場合: 0を返します。
- 実行に失敗した場合: 0未満の値を返します。詳細なエラー情報はGetLastError関数で確認します。
FileSelectDialog関数を使う際の注意点
FileSelectDialog関数はユーザーの応答を待つ間、実行スレッドを中断します。このため、カスタムインジケータでの使用は避けるべきです。スクリプトやエキスパートアドバイザでの使用が推奨されます。
初期ディレクトリ(initial_dir)はMQL5\Filesディレクトリ内に設定する必要があります。フラグにFSD_COMMON_FOLDERを設定すると、初期ディレクトリは共通フォルダ\Terminal\Common\Filesに変更されます。
拡張子フィルタ(filter)は有効な形式で指定しないと、ダイアログが正しく機能しない可能性があります。
default_filenameを設定すると、ダイアログが開いた際にその名前が自動的に入力されますが、テスト時を除き、default_filenameはfilenames配列にコピーされません。
FileSelectDialog関数を使ったサンプルコード
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
// 選択されたファイル名を格納するための配列を宣言
string filenames[];
// ファイル選択ダイアログを表示し、選択されたファイル数を取得
int selectedFiles = FileSelectDialog(
"ファイルを選択してください", // ダイアログウィンドウのタイトル
NULL, // 初期ディレクトリ(NULLの場合、デフォルトのMQL5\Filesディレクトリ)
"Text files (*.txt)|*.txt|All files (*.*)|*.*", // ファイルフィルタ
FSD_ALLOW_MULTISELECT | FSD_COMMON_FOLDER, // 複数ファイル選択と共通フォルダを許可
filenames, // 選択されたファイル名を格納する配列
"default.txt" // デフォルトファイル名
);
// 選択されたファイルが1つ以上ある場合
if(selectedFiles > 0)
{
// 選択された各ファイルの名前を表示
int total = ArraySize(filenames);
for(int i = 0; i < total; i++)
{
Print(i, ": ", filenames[i]);
}
}
else
{
// ファイルが選択されなかった場合のメッセージ
Print("ファイルが選択されませんでした");
}
}
このサンプルコードでは、ファイル選択ダイアログを表示し、ユーザーが選択したファイルの名前を取得して表示します。選択されたファイルがない場合は、その旨を表示します。
サンプルコードに使われた関数や文法要素の簡単な解説
スクリプトの開始
void OnStart()
配列の宣言
string filenames[];
FileSelectDialog関数の呼び出し
int selectedFiles = FileSelectDialog(
"ファイルを選択してください",
NULL,
"Text files (*.txt)|*.txt|All files (*.*)|*.*",
FSD_ALLOW_MULTISELECT | FSD_COMMON_FOLDER,
filenames,
"default.txt"
);
- FileSelectDialog関数はファイル選択ダイアログを表示し、選択されたファイル数を返します。
- 第1引数はダイアログのタイトルです。ここでは「ファイルを選択してください」というタイトルを指定しています。
- 第2引数は初期ディレクトリです。NULLを指定すると、デフォルトのMQL5\Filesディレクトリが使用されます。
- 第3引数は拡張子フィルタです。このフィルタにより、ダイアログに表示されるファイルの種類を制限できます。
- 第4引数はフラグの組み合わせです。複数のフラグをビット単位の論理和で組み合わせて、ダイアログの動作を制御します。ここでは、複数のファイル選択と共通フォルダの使用を許可しています。
- 第5引数は選択されたファイル名を格納するための配列です。
- 第6引数数はデフォルトのファイル名です。ダイアログが開かれた際に、この名前が自動的に入力されます。
選択結果の処理
if(selectedFiles > 0)
{
int total = ArraySize(filenames);
for(int i = 0; i < total; i++)
{
Print(i, ": ", filenames[i]);
}
}
else
{
Print("ファイルが選択されませんでした");
}
- if(selectedFiles > 0)は、選択されたファイルが1つ以上あるかどうかをチェックします。
- ArraySize関数は、filenames配列の要素数を返します。
- forループは、選択された各ファイルの名前を順番に出力します。ループ内でPrint関数を使用して、ファイル名をエキスパートログに表示します。
- elseブロックは、ファイルが選択されなかった場合の処理です。この場合、「ファイルが選択されませんでした」というメッセージを表示します。
その他の重要な文法要素
- コメントアウト: コード内の説明を行うために使用されます。//で始まる行は、その行の残りの部分がコメントとみなされます。
- 変数の宣言: 変数は特定のデータ型を持ちます。ここでは、int型のselectedFilesとtotal、string型の配列filenamesが使用されています。
- 条件文: if文とelse文を使って条件に基づく処理を行います。
- ループ: forループを使って、配列の各要素に対して繰り返し処理を行います。
このように、サンプルコードではMQL5の基本的な文法要素を組み合わせて、ファイル選択ダイアログを表示し、その結果を処理する方法を示しています。