c++ builder XE4, 10.2 Tokyo > TForm > 1つのフォームをベースに複数のフォームのインスタンスを作る


動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)

やりたいこと

複数台のRS-232C通信処理を実装する。

通信処理はメインのユニットとは分離して、再利用性を高める。
分離する処理の実装は「TThreadにする」か「別ユニットのフォームにする」かなどが考えられる。別ユニットのフォームとして実装してみる。その前段階として1つのフォームを作り、そのフォームを複数個インスタンス生成してみる。

手順

構成としては以下とする。

  • Main.cpp : メインフォーム
  • UnitComm.cpp : 通信処理のフォーム (Name: FormComm)
  1. UnitCommを新規作成する
  2. プロジェクト > オプション > フォーム にて「自動生成フォーム」の欄からFormCommを「使用可能フォーム」に移動して自動生成を防止する
  3. Main.hにてUnitComm.hをincludeする
  4. Main.hにてTFormComm *m_commForms[10];のように宣言する
  5. Main.cppの処理で以下のようにインスタンス生成する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    for(int idx=0; idx<4; idx++) {
        m_commForms[idx] = new TFormComm(this);
        m_commForms[idx]->Show();
    }
}

上記にて4つのフォームが生成される。

TFormComm()のコンストラクタにてidxを引数として渡すなどして、それぞれ異なる処理を実装できる。

newで生成するのでMain終了時は適宜delete処理が必要。

TThreadでなくFormで処理する利点としては、FormにはTMemoなどを含めることができる。通信内容のデバッグなどがしやすくなる。TThreadでない短点としては、プライオリティの調整ができないこと。