C++ Builder XE4 > Forms > Form1からForm2を生成した時、Form1が常にForm2の後ろに隠れる問題の対処 > CreateParams()のオーバライド

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

### 概要

- Form1からForm2をnewで生成
- Form2をShowした後、Form1が常に後ろに隠れる

下記のようにForm1をクリックしても、Form2が前面に出たままとなります。

![2018-11-06_18h55_16.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4625ad1b-6ef7-2e13-368b-19a063de4a66.png)

### 参考

色々調べて下記の２つを見つけた。

- [PopupModeプロパティの動作の謎](http://d.hatena.ne.jp/au2010/20110616/1308233783) by au2010 様
- [BorderStyleがbsNoneのフォームのサイズを変更できるようにする](http://www.gesource.jp/programming/bcb/107.html) by 山本隆 様

情報感謝です。

CreateParams()をオーバーライドしてParams.WndParentを書換える方法をC++ Builderで実装します。

## 実装

### newされるフォーム > CreateParams()のオーバライド

```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 で管理されるコンポーネント
private:	// ユーザー宣言
public:		// ユーザー宣言
	void __fastcall CreateParams(Controls::TCreateParams &Params);
	__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)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::CreateParams(Controls::TCreateParams &Params)
{
	TForm::CreateParams(Params);
	Params.WndParent = Application->Handle;
}
```

### newするフォーム

こちらでは特別な処理は入れていない(newしてShowするだけ)。

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include "Unit2.h"

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
	TForm2 *aform2;
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;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	aform2 = new TForm2(NULL);
	aform2->Show();
}
//---------------------------------------------------------------------------
```

### 結果

クリックしたフォームが前面に来るようになりました。

![2018-11-06_18h59_44.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ef95cb2d-0cdf-dafc-766f-f469ecf60a8a.png)

![2018-11-06_18h59_57.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3bb0a79c-38a1-e23c-01a6-3716ec0d233e.png)


### 試したけどしっくりこなかった情報

- [Delphi - Create form behind another form](https://stackoverflow.com/questions/2680231/delphi-create-form-behind-another-form)

### 備考 > fsStayOnTop

fsStayOnTopをFormStyleに指定すると、そのフォームは常に前面に出るようになります。
ただ、その場合、クリックしたウィンドウも背面のままなので、希望の動作ではありませんでした。



### 検索用キーワード

- override