動作環境
RAD Studio 10.2 Tokyo Update 3
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
TOpenDialog > FilterとFilterIndex
http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/UsingDialogs_(Delphi)
http://docwiki.embarcadero.com/Libraries/Tokyo/en/Vcl.Dialogs.TOpenDialog.FilterIndex
TOpenDialog (TSaveDialog)には下記のプロパティがある。
- Filter: フィルタ文字列
- FilterIndex: デフォルトフィルタの指定
プロパティの設定 > デザイン? or コード?
FilterIndexをコードで設定する場合、どこまでをコードで実装するか。
- A. デザイン + コード
- Filterはデザイン上 (オブジェクトインスペクタでFilterプロパティ指定)
- FilterIndexはコードで代入
- B. コードのみ
- Filterをコードで代入
- FilterIndexをコードで代入
ソフト変更時の失敗予防
上記Aの場合、ソフト変更時にデザインとコードそれぞれを変更することになる。
デザインだけ変更して、コード変更忘れしないかどうか。
Bの場合、例として、以下のような実装になる。
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE で管理されるコンポーネント
TOpenDialog *OpenDialog1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // ユーザー宣言
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
// { 画像ファイルフィルタ設定
static const String kFilter_list = L"jpg|*.jpg|png|*.png|bmp|*.bmp";
enum {
FILTER_IDX_JPG = 1, // [Note] OpenDialogのFilterは1始まり
FILTER_IDX_PNG,
FILTER_IDX_BMP,
};
// } 画像ファイルフィルタ設定
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// ソフト起動時の画像ファイルフィルタ設定
OpenDialog1->Filter = kFilter_list;
OpenDialog1->FilterIndex = FILTER_IDX_PNG;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (OpenDialog1->Execute() == false) {
return;
}
ShowMessage(OpenDialog1->FileName);
}
//---------------------------------------------------------------------------
Bでの実装の場合、kFilter_list
とFILTER_IDX_
の定義が近い場所にあるため、片方だけの変更忘れを防止しやすいかもしれない。
将来変更しそうな処理は一か所にまとめる
「将来変更しそうな処理は一か所にまとめる」という趣旨の記載が過去読んだ本にあったと思う。
どの本であったかは定かではない。
一か所にまとめることで、「変更漏れ」を防ぎ、テストもしやすくなるだろう。