C++ Builder XE4, 10.2 Tokyo > TForm > 여러 폼의 생성자와 OnCreate() 실행 순서

운영 환경
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)

하나의 유닛의 처리가 미래의 유지 보수 용이성을 위해 복수의 유닛에서 처리되도록 변경된다.
그 작업의 결과, 이하의 에러가 나오게 되었다.



원인을 쫓자, 한 유닛의 생성자가 움직이기 전에 다른 유닛의 OnCreate()가 움직이고 변수의 초기화가 되기 전에 사용되고 있는 것을 알았다.

확인을 위해 세 가지 양식에 대해 생성자와 OnCreate()의 실행 순서를 살펴보자.

code



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)
{
    String msg = L"Form1 ctor " + Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz");
    OutputDebugString(msg.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    String msg = L"Form1 OnCreate " + Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz");
    OutputDebugString(msg.c_str());
}
//---------------------------------------------------------------------------

Unit2와 Unit3도 마찬가지로 구현했다.

결과


デバッグ出力: Form1 ctor 2017/11/07 18:26:07.829 プロセス Project1.exe (4824)
デバッグ出力: Form1 OnCreate 2017/11/07 18:26:07.830 プロセス Project1.exe (4824)
デバッグ出力: Form2 ctor 2017/11/07 18:26:07.835 プロセス Project1.exe (4824)
デバッグ出力: Form2 OnCreate 2017/11/07 18:26:07.836 プロセス Project1.exe (4824)
デバッグ出力: Form3 ctor 2017/11/07 18:26:07.843 プロセス Project1.exe (4824)
デバッグ出力: Form3 OnCreate 2017/11/07 18:26:07.844 プロセス Project1.exe (4824)

Form1의 OnCreate에서 Form2의 처리를 사용하는 구현을 한 경우, Form2의 생성자 앞에 실시되어, 처음의 에러가 된다.

OnCreate()의 처리를 재검토하거나, 생성자가 아닌 다른 초기화 처리를 최초로 콜하는 등의 대응은 하는 것이 좋을 것 같다.

실시한 대응



OnCreate()의 처리를 일부 그만두고 메인 화면의 OnShow()에서 호출하도록 변경했다.

숨겨진 폼은 OnShow()가 실시되지 않기 때문에 OnShow()가 실시되는 메인 화면에서 호출한다는 방법은 때때로 사용한다.

좋은 웹페이지 즐겨찾기