C++ Builder XE4 > ダイアログ > 独自のダイアログをShowModalで表示する > v0.1, v0.2

```txt:動作環境
C++ Builder XE4
```

## 概要

- 4K UHD対応ソフトを実装するとShowMessage()の文字列が小さくなる
- 独自のダイアログ(OKボタンのみ)を実装する

## 構成

- Form1: Buttonのみ
- Form2: OKボタンのみ
    - スケールを150%に拡大したもの

Form2のデザイン。

![2018-11-06_10h50_09.png](https://qiita-image-store.s3.amazonaws.com/0/32870/203100c6-fbdf-d4c6-5069-fbfad51333f1.png)



## 実装 v0.1

### ダイアログのフォーム

```Unit2.h
//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TLabel *L_message;
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
	void __fastcall FormCreate(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	void __fastcall ShowWithMessage(String message);
	__fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif
```

```Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

/*
このフォームは[位置]>[スケール]にて150%に拡大したもの
4K UHDなどの画面でShowMessage()だと文字が小さいことへの対応
*/

void __fastcall TForm2::ShowWithMessage(String message)
{
	L_message->Caption = message;
	this->Show(); // デフォルトではモーダルになる
}

void __fastcall TForm2::Button1Click(TObject *Sender)
{
	Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm2::FormCreate(TObject *Sender)
{
	// デザインで以下のL_messageプロパティを設定しておくこと
	//  WordWrap = true;
	//  AutoSize = false;
	//   コードで代入すると改行がおかしくなった
	//
	// BorderStyle = bsDialog;
	//   コードで変更すると、L_messageの幅調整が別途必要になるため

	this->Position = poOwnerFormCenter;

	// タイトルは実行ファイル名の.exeを取ったもの
	String appName = ExtractFileName(Application->ExeName);
	appName = StringReplace(appName, L".exe", L"", TReplaceFlags()<<rfReplaceAll);
	this->Caption = appName;


}
//---------------------------------------------------------------------------
```

### 呼出しフォーム

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	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"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String msg = L"Hello, folks. This is a software designed for 4K UHD Monitor."
				L" If you find it difficult to read the strings, please contact to XXXX"
				L"\r\n"
				L"\r\n"
				L"PS. I have your dinner cooked in the refrig.";
	Form2->ShowWithMessage(msg);
}
//---------------------------------------------------------------------------
```

### 結果

Project1.exeを実行してボタンを押下した結果。

![2018-11-06_10h17_08.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ac64c6f2-ab92-c745-b224-8ff448494b94.png)

### 備考1

同じ目的の他の方法はあると思う。
「こうあるべき」にとらわれず、柔軟な思考で実装すればいいと思う。

## 実装v0.2

v0.1の実装の場合、ShowModalで表示したフォーム(例: Form3)から上記のダイアログを呼出すと、そのダイアログ表示はモーダルではなくなる (Form3をクリックすると、Form3の後ろに隠れてしまう)。

ダイアログのフォームを以下の実装する。

```Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm2::ShowWithMessage(String message)
{
    L_message->Caption = message;
	this->ShowModal();
}

void __fastcall TForm2::Button1Click(TObject *Sender)
{
	Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
	// デザインで以下のL_messageプロパティを設定しておくこと
	//  WordWrap = true;
	//  AutoSize = false;
	//   コードで代入すると改行がおかしくなった
	//
	// BorderStyle = bsDialog;
	//   コードで変更すると、L_messageの幅調整が別途必要になるため

	this->Position = poOwnerFormCenter;

	// タイトルは実行ファイル名の.exeを取ったもの
	String appName = ExtractFileName(Application->ExeName);
	appName = StringReplace(appName, L".exe", L"", TReplaceFlags()<<rfReplaceAll);
	this->Caption = appName;
}
//---------------------------------------------------------------------------
```