C++ Builder XE4, 10.2 Tokyo > TForm > 여러 폼의 생성자와 OnCreate() 실행 순서
4049 단어 TFormtimerEventcppBuilder
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()가 실시되는 메인 화면에서 호출한다는 방법은 때때로 사용한다.
Reference
이 문제에 관하여(C++ Builder XE4, 10.2 Tokyo > TForm > 여러 폼의 생성자와 OnCreate() 실행 순서), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/cceb14b255913d4837e4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)