はじめに
いつもの煽り文句系の投稿です
Delphi の標準 TTabControl
ではタブの表示が一列のみで、長いタブ名や多数のタブを扱うのが非常に不便です。
例えば以下のような制限があります:
- タブが1行にしか並ばない(長いタブ名で折り返されず、はみ出す)
- スクロールバーが表示されないためタブが隠れる
- タブの表示スタイルや色分けのカスタマイズがしづらい
こうした制限を解決するために、自作コンポーネント TTabListBox
を開発しました。
本記事ではその特徴と使い方を紹介します。
TTabListBox とは?
TTabListBox
は、タブ名の長さに応じて複数行に自動折り返しすることができるカスタムUIコンポーネントです。
以下のような特長があります:
- 複数行タブに自動折り返し(横幅に収まらないと自動で改行)
- ホバー/選択状態/奇数行/偶数行で色を変えられる
- 背景色に応じて文字色(白/黒)を自動判定
- 既存の
ListBox
ベースなので導入が簡単
実装イメージ
FTabListBox := TTabListBox.Create(Self);
FTabListBox.Parent := Self;
FTabListBox.Align := alClient;
// タブの追加
FTabListBox.Tabs.Add('設定');
FTabListBox.Tabs.Add('これはかなり長いタブタイトルです');
FTabListBox.Tabs.Add('★特別なタブ');
タブは
Tabs.Add()
で追加できます。内部的なAddTab
は非公開メソッドです。
色のカスタマイズ
背景色は以下の4種類に分けて設定できます:
プロパティ名 | 説明 | デフォルト値 |
---|---|---|
TabColorEven |
偶数行タブ | clBtnFace |
TabColorOdd |
奇数行タブ | clWindow |
TabColorHot |
マウスオーバー時 | clHighlight |
TabColorSelected |
選択中のタブ | clHighlight |
文字色は背景に応じて自動的に白または黒に調整されるため、特別な設定は不要です。
タブ選択とイベント処理
選択されたタブは TabIndex
で取得できます。たとえばクリックされたときの処理は以下の通り:
procedure TFormMain.OnTabClick(Sender: TObject);
begin
Caption := FTabListBox.Tabs[FTabListBox.TabIndex];
end;
表示サンプル
ランダムな長さのタブを複数追加すると、以下のように自動で折り返されて表示されます:
for i := 0 to 49 do
begin
case Random(5) of
0: s := '短';
1: s := '中くらい';
2: s := 'ちょっと長めのタブ';
3: s := 'これはかなり長いタブタイトルです';
4: s := '★特別なタブ ' + IntToStr(i);
end;
FTabListBox.Tabs.Add(s);
end;
実行結果
注意点
TTabListBox
は内部的には TListBox
を継承して実装されています。
描画は OwnerDraw
モードで行っているため、スタイルやテーマとの互換性が必要な場合は調整が必要です。
また、タブの構造は外部からは Tabs.Add()
のみを使ってシンプルに操作できます。
まとめ
- 複数行タブが必要な UI に最適
-
TTabControl
の制限を超えるカスタマイズが可能 -
ListBox
ベースなので導入も簡単
ダウンロード・配布場所
ライセンス
MIT ライセンスです 。
このコンポーネントは商用・個人プロジェクト問わず自由に使用・改変いただけます。