cppBuilder
listOperation

C++ Builder XE4, 10.2 Tokyo > 複数コンポーネントの登録と使用 > TObjectList の使用

動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)

処理を外部ソース化する時、フォーム上の多数のコンポーネントのポインタをどう渡すか。

TObject *型で渡す例を実装してみた。

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE で管理されるコンポーネント
    TEdit *Edit1;
    TCheckBox *CheckBox1;
    TComboBox *ComboBox1;
    TButton *B_register;
    TButton *B_use;
    void __fastcall B_useClick(TObject *Sender);
    void __fastcall B_registerClick(TObject *Sender);
private:    // ユーザー宣言
    void __fastcall doRegister(TObject *objs[], int numObj);
public:     // ユーザー宣言
    __fastcall TForm1(TComponent* Owner);
    __fastcall ~TForm1();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

static TObjectList *s_list;
static int s_numObject;

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    s_list = new TObjectList();
    s_numObject = 0;
}
__fastcall TForm1::~TForm1()
{
    delete s_list;
    s_list = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::doRegister(TObject *objs[], int numObj)
{
    for(int idx=0; idx < numObj; idx++) {
        s_list->Add(objs[idx]);
    }
    s_numObject = numObj;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_useClick(TObject *Sender)
{
    for(int idx=0; idx < s_numObject; idx++) {
        TObject *objPtr = (TObject *)s_list->Items[idx];
        TComponent *cmpPtr = (TComponent *)objPtr;
        OutputDebugString(cmpPtr->Name.c_str());
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_registerClick(TObject *Sender)
{
    TObject *objs[] = {
        Edit1,
        CheckBox1,
        ComboBox1,
    };
    int numObj = sizeof(objs) / sizeof(objs[0]);

    doRegister(objs, numObj);
}
//---------------------------------------------------------------------------

備考

TObject *でなく、TComponent *で登録するかは用途に依存する。

TObjectListというのは初めて意識した。
http://docwiki.embarcadero.com/Libraries/XE4/en/System.Contnrs.TObjectList