C++ Builder 10.2 Tokyo > Forms > Bug > 8個の子フォームを親フォームの下に4行 x 2列で配置する > 空白があいてしまう > 10.2 Tokyoの問題ではなさそう

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

[c++ builder XE4 > Forms > 8個の子フォームを親フォームの下に4行 x 2列で配置する](https://qiita.com/7of9/items/30339b416c99e7ace306)

XE4で実装したコードは10.2 Tokyoではどう動作するか。

### code 

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.ComCtrls.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.Series.hpp>
#include <VclTee.TeeGDIPlus.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>

#include "Unit2.h"
//---------------------------------------------------------------------------

// hogehoge

class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TButton *B_createChild;
	TButton *B_matrix;
	void __fastcall B_createChildClick(TObject *Sender);
	void __fastcall B_matrixClick(TObject *Sender);
private:	// ユーザー宣言
	static const int kNumChild = 8;
	TForm2 *m_childForms[kNumChild];
	void __fastcall putChildrenInMatrix();
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <DateUtils.hpp>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TForm1::B_createChildClick(TObject *Sender)
{
    for(int idx=0; idx < kNumChild; idx++) {
        m_childForms[idx] = new TForm2(this);
        m_childForms[idx]->Show();
    }
}
//---------------------------------------------------------------------------

static void calcLeftTopOfChildren(int parentTop, int parentHeight, int childIdx, int childWidth, int childHeight, int *dstTop, int *dstLeft)
{
    int topSize, leftSize;

    if (childIdx < 4) {
        topSize = childIdx * childHeight;
        leftSize = 0;
    } else {
        topSize = (childIdx - 4) * childHeight;
        leftSize = childWidth;
    }

    int marginTop = parentTop + parentHeight;

    *dstTop = marginTop + topSize;
    *dstLeft = leftSize;
}

void __fastcall TForm1::putChildrenInMatrix()
{
    TForm2 *formPtr;
    int topPos, leftPos;

    for(int chlIdx=0; chlIdx < kNumChild; chlIdx++) {
        formPtr = m_childForms[chlIdx];

        calcLeftTopOfChildren(this->Top, this->Height, chlIdx, formPtr->Width, formPtr->Height, &topPos, &leftPos);
        formPtr->Top = topPos;
        formPtr->Left = leftPos;
    }
}
void __fastcall TForm1::B_matrixClick(TObject *Sender)
{
    putChildrenInMatrix();
}
```

## 結果

### 10.2 Tokyo + Windows 10 pro

おかしなマージンが入るようになっている。
Windows 10によるものか、10.2 Tokyoによるものか。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/110df07c-fbcb-7cb5-14fe-515f8891db19.png)

### XE4 + Windows 7 Pro

下記ではおかしなマージンはなかった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5a6c4023-d1d1-ae46-7c8d-5ba46ad325cf.png)

### 関連

同じように下記の処理もマージンが発生する。

- [c++ builder XE4 > Form > 4つのFormをモニタいっぱいに並べる](https://qiita.com/7of9/items/b858ea2f947629f47810)

### Windows 8.1 Pro上での動作 (10.2 Tokyoでビルド)
(追記 2018/01/09)

10.2 TokyoでビルドしたソフトをWindows 8.1 Proで実行してみた。

下記のように問題は発生しなかった。
Windows 10 Proで動作した時に座標が変わるのだろうか。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ce1d4a6d-b7ff-87ad-654c-36800408dce2.png)