« ウロコインコ達のニギコロ(&新入り) | トップページ | DelphiXE5でFireMonkeyを使わずにAndroid開発 »

2013年2月28日 (木)

FireMonkey2のTGridでOwnerDraw

久々にコーディング。 リハビリがてらXE3のTGridで遊び中ですが、VCLのGridと若干勝手が違い、
・各セルは別コンポーネント。ただし表示されている分のセルのみ生成されている
・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イベントに描画コードを書いてください

|

« ウロコインコ達のニギコロ(&新入り) | トップページ | DelphiXE5でFireMonkeyを使わずにAndroid開発 »

FireMonkey2/Delphi XE3」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: FireMonkey2のTGridでOwnerDraw:

« ウロコインコ達のニギコロ(&新入り) | トップページ | DelphiXE5でFireMonkeyを使わずにAndroid開発 »