0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

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

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

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

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?