現在精鋭開発中の i4 Portable ですが、ちょっとした遊び心から見た目を Win8 モダンUI アプリっぽく作っていたのですが、いつの間にかコンポーネント作りの方が本格化していたりします。
似たようなコンポーネント群で TMS Software という海外の会社から販売されているコンポーネントもあります。
(Delphi 2010 の特典でついていました。)
これが使えればよかったのですが、奈何せん Win32 アプリは殆ど Delphi 2007 で開発しているので Delphi 2007 でも使いたい!ってこともありまして、相変わらず無い物は作れを地でイッテイマス(笑)
かなり特殊な ListView もどきです。
通常の ListView のように Items / SubItems でのアイテム管理が出来るのですが、TImageList の指定ができて画像の埋め込みのほかに、pixel 単位でアイテムの表示位置が指定できます。
よくある ListView と違い1アイテムの高さは決まっていますが、横のカラムの表示位置は全て制御可能です。
var
LI:TListItem;
begin
//初期化
ListView1.Items.Clear;
ListView1.Items.BeginUpdate; //途中更新を停止
LI:=ListView1.Items.Add;
LI.Captiont:='ABCDE';
LI.SubItems.Add('FGHI')
ListView1.Items.EndUpdate; //更新開始
end;
なんて書くのですが、これは
var
II:TImgItem;
SI:TImgSubItem;
begin
//初期化
ListView1.Items.Clear;
//アイテムを追加してから各種プロパティを設定
II:=ListView1.Items.Add;
II.Text:='ABCDE';
II.x:=10;
II.y:=5;
II.Color:=clRed;
//サブアイテムを追加してから各種プロパティを設定
SI:=II.SubItems.Add;
SI.Text:='FGHI';
SI.x:=50;
SI.y:=5;
SI.Color:=clBlue;
//サブアイテムを追加して ImageList の画像を指定
SI:=II.SubItems.Add;
SI.ImageIndex:=3;
SI.x:=100;
SI.y:=2;
//座標とフォントサイズを指定して追加
ListView1.Items.Add(50,5,16,'ABCDE');
ListView1.RefreshItem; //全て更新
end;
なんて記述ができます。
BeginUpdate / EndUpdate の扱いが違いますが、いつも BeginUpdate はほぼ確実に書くので、これは省略して、EndUpdate の代わりに RefreshItem という関数を追加しています。
また ListView という名前ですが
このように TreeView のような表示も可能です。
元々作り始めたきっかけとして、Delphi 2007 の Common Control が慣性スクロール(Moment scroll)が対応してなかったので当然ながら慣性スクロールにも対応しています。
ちょっと違うのは Tree の開閉はしないってことでしょうか。(できるんですが、Win8 っぽくない気がする)
更に更に、左右のスワイプにも対応しています。
右から左へのスワイプと左から右へのスワイプに対応していますので「左から右は削除」「左から右は移動」なんてこともできます。
かなり無茶をしている Class です。
まぁ、普通の CheckBox ですね。違うのは見た目と連動した Label を自動で更新するくらいですか。
もっとも苦労したのが Combobox です。
なんせ、DropDown と DropDownList などの複数のモードを持っていて、更に Edit と List の複合コントロールです。
リストを表示する際の Popup の制御も通常は OS に任せておけばいいんですが、Popup でも慣性スクロールを効かせたいが故に、Popup まで自前で制御(線画)
こうなってくるとフォーカスの動きがめちゃくちゃシビアでして、通常のお任せしているフォーカス移動も自前で処理しなければなりません。
ウィンドウを持ちフォーカスを受け取るのですが、Combobox の場合、アプリ外に制御が移った場合など、Popup を殺さないとならないので「そこまでやらんとあかんかったー!」と作り始めた後に後悔しましたが・・・
MouseEvent を Hook しまくっています。
まぁ、最近こんな低レベル(基本という意味で)制御をするようなアプリを書いていなかったので、Windows message ハンドリングの復習にはなりましたが(笑)
WM_****** をつらつらと眺めて「あ、このメッセージ使えそう」とか「こんなんあったっけ?」とか。
メッセージの流れを確認する為に、Spy++ のようなソフトも1個作りましたし・・・(^-^;