Delphi の色選択がそろそろ限界だったので、実用的なカラーピッカーを作った
Delphi(VCL)には標準で TColorDialog が用意されていますが、
- UI がかなり古い
- RGB / HSV を直感的に操作できない
- スポイト機能が弱い(実用上つらい)
- フレームとして埋め込めない
といった点に、以前から不満を感じていました。
そこで今回、
「今どき普通に使える色選択 UI」 を目的として
VCL 向けのカラーピッカー一式を自作しました。
配布場所
ソースコードはこちらです。
👉 https://github.com/vramwiz/ColorPicker
VCL 標準コンポーネントのみで構成しており、
外部ライブラリ等は不要です。
何ができるのか
- RGB 数値入力
- Hue(色相)バー
- Saturation / Value(彩度・明度)エリア
- 画面スポイト機能
- すべての操作が相互に同期
さらに、
- モーダルダイアログとして使える
- フレームとしてフォームに埋め込める
- 各パーツを単体コンポーネントとして使える
という点を重視して設計しています。
なぜ Delphi 標準の色選択では足りないのか
Delphi の TColorDialog は、
- 基本的に「色一覧から選ぶ」前提
- HSV の概念が表に出てこない
- 数値入力と視覚操作の行き来がしづらい
という特徴があります。
実際のアプリ開発では、
- 数値で微調整したい
- Hue だけを素早く変えたい
- 既存画面の色をスポイトで拾いたい
といったケースが多く、
標準ダイアログではどうしても物足りません。
スポイト機能について
本実装のスポイトは、少し変わった方式を採用しています。
- 画面全体を一度キャプチャ
- その画像を 最前面の疑似フルスクリーンフォームに表示
- その上で色を取得
という方法です。
この方式の利点は、
- 他アプリに入力を送らない
- OS フックを使わない
- モーダルダイアログ中でも安全に動作する
という点です。
操作は以下の通りです。
| 操作 | 動作 |
|---|---|
| 左クリック | 色確定 |
| 右クリック | キャンセル |
| ESC | キャンセル |
| フォーム非アクティブ | 即キャンセル |
スポイト中は画面は静止画像になりますが、
「色を拾う」用途では十分実用的です。
ダイアログとして使う場合
もっとも簡単な使い方は、
モーダルダイアログとして利用する方法です。
uses ColorPickerDialog;
procedure TFormMain.Button1Click(Sender: TObject);
var
Form : TFormColorPickerDialog;
begin
Form := TFormColorPickerDialog.Create(nil);
try
Form.Color := Panel1.Color;
if not Form.Execute then Exit;
Panel1.Color := Form.Color;
finally
Form.Free;
end;
end;
フレームとして埋め込む場合
内部では
TFrameColorPickerDialog
というフレームに UI をまとめています。
そのため、
- 設定画面に常時表示したい
- 独自レイアウトに組み込みたい
といった用途でも、そのまま流用できます。
各パーツを単体で使うことも可能
このカラーピッカーは、以下のコンポーネントに分かれています。
TColorPickerHueBarTColorPickerSVArea- RGB 編集用フレーム
- スポイト(
TColorPickerPick)
必要なものだけを取り出して使うこともできます。
設計方針
- VCL の素直な使い方を優先
- OS フック等の危険な仕組みは使わない
- 拡張性よりも 分かりやすさと安定性 を重視
おわりに
Delphi は今でも十分強力な開発環境ですが、
標準 UI が時代に追いついていない部分も多くあります。
このカラーピッカーが、
UI 改善の一助になれば幸いです。
