C++Builderの TControlList は、RAD Studio 10.4 Sydneyから導入された比較的新しいコンポーネントです。数千、数万といった大量の項目を、メモリを節約しつつ高速に表示するために設計されています。
イメージとしては、「1つのアイテムのデザイン(ひな形)を作り、それを動的に使い回してリストを表示する」という仕組みです。
サンプルプロジェクトの作成
サンプルプロパティを作成してみましょう。
雛形のプロジェクトの作成
TControlListコンポーネント内に、TImage、TLabel、TControlListButtonコンポーネントを配置してみましょう。
- メニューの「ファイル」-> 「新規作成」-> 「Windows VCL アプリケーション C++Builder」を選択し実行し、空のVCLアプリケーションを作成します。プロジェクト名を、「ControlList1」として保存しておきます。
- TControlListコンポーネントを、FormにDropします。
- TImageコンポーネントを、TControlListコンポーネント上にDropし、Height、Widthを32とします。
- TLabelコンポーネントを2個、TControlListコンポーネント上にDropします。
- TControlListButtonコンポーネントを、TControlListコンポーネント上にDropします。Captionプロパティを”Test”とします。

TControlListコンポーネントの表示
作成したプロジェクトをコンパイルしても、TControlListコンポーネントは表示されません。TControlListコンポーネントを表示するには、 ItemCount プロパティに、表示したいデータの総数(アイテム数)を設定する必要があります。
表示するデータの準備
- ヘッダー内に、以下のコードを追加しLabelに表示するデータを定義します。
#include <vector>
// ヘッダーファイル等で定義
struct TMyData{
String Name;
String Status;
};
std::vector<TMyData> FDataList;- コンストラクタ内で、データの初期値、及び表示するアイテム数を設定します。
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
FDataList =
{
{L"タスク1", L"完了"},
{L"タスク2", L"進行中"},
{L"タスク3", L"未着手"}
};
// 2. リストの件数を設定
ControlList1->ItemCount = FDataList.size();
}- ControlList1のBeforeDrawItemイベントを追加
- BeforeDrawItemイベントは、描画の直前に呼ばれるイベントです。

- BeforeDrawItemイベント内に、以下のコードを追加します。
- 表示データが、”完了”とそれ以外で文字の色を変えています。
void __fastcall TForm1::ControlList1BeforeDrawItem(int AIndex, TCanvas *ACanvas, TRect &ARect,
TOwnerDrawState AState)
{
// AIndex は現在描画しようとしている行番号
if (AIndex < 0 || AIndex >= (int)FDataList.size()) return;
// 現在描画対象となっている行のデータを取得
TMyData data = FDataList[AIndex];
// 雛形として置いたラベルに値をセット
// これにより、各行ごとに異なるテキストが表示される
Label1->Caption = data.Name;
Label2->Caption = data.Status;
// 特定の条件で色を変えるなどの処理もここで行う
if (data.Status == L"完了")
{
// LabelStatus->Font->Color = clGreen;
Label1->Font->Color = clGreen;
Label2->Font->Color = clGreen;
} else {
// LabelStatus->Font->Color = clRed;
Label1->Font->Color = clRed;
Label2->Font->Color = clRed;
}
}- 上記のコードの実行結果です。

画像の表示
次は、TImageに画像を表示表示します。ImageListを利用して、画像を表示しますので、TImageListコンポーネントをコンポーネントパレットからフォームにDropします。
画像サイズを64☓64としています。(Height,Widthプロパティを64にセット)

画像の登録
TImageListコンポーネントをダブルクリックして開いたダイアログの「追加」ボタンを押して画像を登録します。

登録した画像
画像は、古いC++Builderに含まれていた ”Borland Shared\Images\Splash\256Color”内の画像を使用しています。

画像を表示するコードの追加
ControlList1BeforeDrawItemイベント内に、以下のコードを追加します。
先程TImageListコンポーネントに登録した画像を順番に表示しています。
void __fastcall TForm1::ControlList1BeforeDrawItem(int AIndex, TCanvas *ACanvas, TRect &ARect,
TOwnerDrawState AState)内に、
// ImageListの0番目の画像を描画
ImageList1->Draw(
Image1->Picture->Bitmap->Canvas,
0, 0, // 描画位置
AIndex // ImageIndex
);
- 上記のコードの実行結果です。

プロジェクのソースコード
プロジェクのソースコードは、以下からD/Lできます。
参考URL
以下、参考URLです。

