FireMonkey2のTGridでOwnerDraw
久々にコーディング。
リハビリがてらXE3のTGridで遊び中ですが、VCLのGridと若干勝手が違い、
・各セルは別コンポーネント。ただし表示されている分のセルのみ生成されている
・Grid自体はデータを持たない
・セルを描画するタイミングでGetValueイベントが呼ばれるのでそこでデータを渡す
・コラム単位で機能が異なる(文字列用、チェックBOX用、Image用等)
等々。
上記の違い高速性のための処置だとまあ納得できるのですが、画像を表示するための TImageColumnが遅い。そしてざっとみる限りOwnerDraw系のイベントが無い。
ということで、OwnerDrawを行うためのコンポーネントを作ってみました。
・各セルは別コンポーネント。ただし表示されている分のセルのみ生成されている
・Grid自体はデータを持たない
・セルを描画するタイミングでGetValueイベントが呼ばれるのでそこでデータを渡す
・コラム単位で機能が異なる(文字列用、チェックBOX用、Image用等)
等々。
上記の違い高速性のための処置だとまあ納得できるのですが、画像を表示するための TImageColumnが遅い。そしてざっとみる限りOwnerDraw系のイベントが無い。
ということで、OwnerDrawを行うためのコンポーネントを作ってみました。
※作ったあとに気が付きましたが、公式blogで似たものが既に紹介されています。http://t.co/vw7omRtUnv まあ、PaintイベントにRow値が渡されるのとコンポーネントしているということでご勘弁を。
unit FMX.CustomDrawColumn; interface uses System.Classes, System.Types, FMX.Controls, FMX.Types, FMX.Grid; type TOnCellPaintEvent = procedure(Sender: TObject; Row : integer; Canvas: TCanvas; const ARect: TRectF) of object; TCustomDrawColumn = class(TColumn) private FOnCellPaint: TOnCellPaintEvent; procedure DefaultOnCellPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); procedure SetOnCellPaint(const Value: TOnCellPaintEvent); protected function CreateCellControl: TStyledControl; override; published property OnCellPaint : TOnCellPaintEvent read FOnCellPaint write SetOnCellPaint; end; procedure Register; implementation procedure Register; begin RegisterComponents('ESX',[TCustomDrawColumn]); // TGridのDesignerで追加できるようにしたいが、これでは駄目。 // 代替案として、いったんフォーム上に置いて「構造」ツリーでTGridの下にドロップすれば // そこそこ使える。・・・が時々IDEがフリーズする end; function TCustomDrawColumn.CreateCellControl: TStyledControl; begin Result := TStyledControl.Create(Self); Result.OnPaint := DefaultOnCellPaint; end; procedure TCustomDrawColumn.DefaultOnCellPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var Row : integer; begin if Assigned(FOnCellPaint) then begin Row := Trunc(StringToPoint(TFmxObject(Sender).TagString).Y); FOnCellPaint(Sender, Row, Canvas, ARect); end; end; procedure TCustomDrawColumn.SetOnCellPaint(const Value: TOnCellPaintEvent); begin FOnCellPaint := Value; end; end.
適当なパッケージを作って上記ソースを追加してインストールしてください。
使い方:**力尽きたので詳しくは次回(があれば)**
・TGridが置いてあるフォームにTOwnerDrawColumnをドロップして、構造ツリーでTGridの下に移動
・TOwnerDrawColumnのOnCellPaintイベントに描画コードを書いてください
| 固定リンク
「FireMonkey2/Delphi XE3」カテゴリの記事
- FireMonkey2のTGridでOwnerDraw(2013.02.28)
この記事へのコメントは終了しました。
コメント