0
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?

DelphiでDPI対応したSVGツールバーを作る ― ToolBarの代替としての「ToolSvgButton」

Posted at

🎉 はじめに

Delphi の TToolBar / TToolButton は高DPI環境に完全対応していません
特に 150%・200% スケール環境では、

  • アイコンがボケる
  • サイズが合わない
  • レイアウトが崩れる
  • PNG では拡大縮小が汚い

といった問題が発生しやすく、現代的な UI を構築するには限界があります。

そこで本記事では、ToolBar の代替として利用できる
DPI 対応・SVG ベースの軽量ツールバーコンポーネント
「ToolSvgButton」
を紹介します。

Skia4Delphi の SVG 描画機能を活用し、
モダンで高解像度でも崩れないツールボタンを簡単に構築できます。


📘 ToolSvgButton とは?

Delphi(VCL)で SVG を使ったツールバーを構築するために作った
軽量コンポーネントユニットです。

  • SVG のくっきりした描画
  • DPIスケールに強い
  • Hover / Press / Disabled の自動反映
  • セパレーター(区切り)対応
  • 全ボタンの自動整列

が簡単に実現できます。


🔧 特徴

✔ SVG アイコンを綺麗に描画(Skia4Delphi)

TSkSvg の Svg プロパティを内部コピーして使用するため、
フォーム上のオブジェクトを破壊せず安全です。

✔ Hover / Press / Disabled を自動反映

Windows 標準に近い自然な視覚効果です。

✔ ToolBar のように整列管理できる

TToolSvgButtonList で以下が自動化:

  • AddButton(ボタン追加)
  • AddSeparator(区切り追加)
  • Clear(クリア)
  • 自動整列(Left計算)

ToolBar のように「並べただけで整列する」操作が可能です。

✔ DPI に強い

アイコンが SVG のため、
200%・300% でも破綻しません。


🧱 クラス構成

TToolSvgButton

SVG + キャプションを持つ1ボタン。

  • Hover / Press / Disabled に応じた背景色
  • SVG の Opacity 調整
  • パネルや SVG どこをクリックしても OnClick が発火
  • Enabled=False の見た目も自動調整

TToolSvgButtonList

ToolBar のように複数ボタンを並べて管理。

  • AddButton / AddSeparator
  • Buttons と Separators を完全分離管理
  • Left 位置は GetTotalWidth() で自動計算
  • Clear / Destroy で安全破棄

🚀 使用例(フォームに TSkSvg を配置するだけ)

フォームに SkSvg1SkSvg2 を貼り付け、
以下のコードを記述するだけで動作します。

procedure TFormSample.FormCreate(Sender: TObject);
begin
  FToolButtons := TToolSvgButtonList.Create(Self, Self);
  FToolButtons.OnClick := OnToolButtonClick;
end;

procedure TFormSample.FormShow(Sender: TObject);
begin
  FToolButtons.Clear;
  FToolButtons.AddButton(SkSvg1, '1の画像');
  FToolButtons.AddSeparator(32);
  FToolButtons.AddButton(SkSvg2, '2の画像');
end;

procedure TFormSample.OnToolButtonClick(Sender: TObject);
var
  Btn: TToolSvgButton;
begin
  Btn := TToolSvgButton(Sender);
  Caption := IntToStr(Btn.Tag);
end;

SVG はフォームに貼り付けた状態で OK。
内部で安全にコピーされます。


実行結果

image.png

配置されたクラスの縦幅に応じて自動的に計算されます


📜 ライセンス(MIT)

MIT License のため、
商用・個人問わず自由に利用可能です。


🔗 GitHub(ソースコードはこちら)

👉 https://github.com/vramwiz/ToolSvgButton

0
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
0
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?