2025/05/25 電子書籍「Markdown記法大全+Pandoc変換マスター: 初心者から脱却!HTML・PDF・電子書籍を自在に出力する方法」を出版

TControlListコントロール(VCL)

C++Builder

C++Builderの TControlList は、RAD Studio 10.4 Sydneyから導入された比較的新しいコンポーネントです。数千、数万といった大量の項目を、メモリを節約しつつ高速に表示するために設計されています。

イメージとしては、「1つのアイテムのデザイン(ひな形)を作り、それを動的に使い回してリストを表示する」という仕組みです。

サンプルプロジェクトの作成

サンプルプロパティを作成してみましょう。

雛形のプロジェクトの作成

TControlListコンポーネント内に、TImage、TLabel、TControlListButtonコンポーネントを配置してみましょう。

  1. メニューの「ファイル」-> 「新規作成」-> 「Windows VCL アプリケーション C++Builder」を選択し実行し、空のVCLアプリケーションを作成します。プロジェクト名を、「ControlList1」として保存しておきます。
  2. TControlListコンポーネントを、FormにDropします。
  3. TImageコンポーネントを、TControlListコンポーネント上にDropし、Height、Widthを32とします。
  4. TLabelコンポーネントを2個、TControlListコンポーネント上にDropします。
  5. 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できます。

TControlListのサンプルプロジェクト

参考URL

以下、参考URLです。

タイトルとURLをコピーしました