C++ Builder 10.2 Tokyo > Forms > Bug > 8개의 자식 폼을 부모 폼 아래에 4행 x 2열로 배치 > 공백이 뚫린다 > 10.2 Tokyo의 문제가 아닐 것

운영 환경
Rad Studio 10.2 Tokyo Update 2

c++ 빌더 XE4 > Forms > 8개의 하위 폼을 상위 폼 아래에 4x2 열로 배치

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에 의한 것인가.



XE4 + Windows 7 Pro



아래에서는 이상한 마진이 없었다.



관련



마찬가지로 다음과 같은 처리도 마진이 발생한다.
  • c++ builder XE4 > Form > 4개의 Form을 모니터 가득 정렬

  • Windows 8.1 Pro에서 동작(10.2 Tokyo에서 빌드)



    (추기 2018/01/09)

    10.2 Tokyo에서 빌드한 소프트웨어를 Windows 8.1 Pro에서 실행해 보았다.

    아래와 같이 문제는 발생하지 않았다.
    Windows 10 Pro로 동작했을 때에 좌표가 바뀌는 것일까.

    좋은 웹페이지 즐겨찾기