Design
debug
testing
cppBuilder
mistake

C++ Builder 10.2 Tokyo > TOpenDialog | TSaveDialog > FilterとFilterIndex > デザイン定義とコード定義 > ソフト変更時の失敗予防

動作環境
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_listFILTER_IDX_の定義が近い場所にあるため、片方だけの変更忘れを防止しやすいかもしれない。

将来変更しそうな処理は一か所にまとめる

「将来変更しそうな処理は一か所にまとめる」という趣旨の記載が過去読んだ本にあったと思う。
どの本であったかは定かではない。

一か所にまとめることで、「変更漏れ」を防ぎ、テストもしやすくなるだろう。