2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

君たちはまだTTabControlを使っているのか?

Posted at

はじめに

いつもの煽り文句系の投稿です

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;

実行結果

image.png


注意点

TTabListBox は内部的には TListBox を継承して実装されています。
描画は OwnerDraw モードで行っているため、スタイルやテーマとの互換性が必要な場合は調整が必要です。

また、タブの構造は外部からは Tabs.Add() のみを使ってシンプルに操作できます。


まとめ

  • 複数行タブが必要な UI に最適
  • TTabControl の制限を超えるカスタマイズが可能
  • ListBox ベースなので導入も簡単

ダウンロード・配布場所

ライセンス

MIT ライセンスです 。
このコンポーネントは商用・個人プロジェクト問わず自由に使用・改変いただけます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?