2012-03-05 10 views
1

私はLazarus 0.9.30.2を実行しています。TStringGridの列タイトルセルをすべて別の色にペイントする方法はありますか

TStringGridがあるTFormがあります。各列のタイトルは、実行時にグリッドに動的に追加したTGridColumnsオブジェクトです。各列のタイトルには、それに関連付けられたオブジェクト(作成してTListに格納したオブジェクト)があります。文字列グリッドの列タイトルセルの背景をペイントしたいが、すべてのセルが同じ色になることは望ましくない。列タイトルに関連付けられたオブジェクトのプロパティの1つの値に応じて、色が変わります。

私はStackoverflow(example)でTStringGridセルをペイントする方法に関する答えがあることを知っています。文字列グリッドDrawCellイベントを使用してセルをペイントする方法について説明していますが、このプロシージャを呼び出す方法がわかりません。

目的のセルを識別する(つまり、セルの「Rect」プロパティを識別する)別のプロシージャを用意し、必要な色を設定してから実際のグリッドのDrawCellプロシージャを呼び出します着色?

答えて

2

OnPrepareCanvasの方が良いイベントがあります。このイベントは、セルが描画を準備しているときはいつでも起動され、その段階で背景をペイントするためのブラシカラーなどのキャンバス属性の一部を変更できます。 OnPrepareCanvasイベントが示さ

procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer; 
    aState: TGridDrawState); 
var 
    ColumnTitle: TTmColumnTitle; 
begin 
    if ARow = 0 then 
    begin 
    ColumnTitle := TTmColumnTitle(StringGrid1.Objects[ACol, ARow]); 
    if Assigned(ColumnTitle) then 
     StringGrid1.Canvas.Brush.Color := ColumnTitle.CellColor; 
    end; 
end; 

オブジェクトインスペクタで:

type 
    TTmColumnTitle = class(TTmObject) 
    private 
    FCellColor: TColor; 
    public 
    property CellColor: TColor read FCellColor write FCellColor; 
    end; 

そしてOnPrepareCanvasイベントのハンドラを記述します。だから、あなたが必要なものをどこかに色を格納することです

+0

感謝答えのために。私はグリッドのセットを持っており、それらのすべてのためにグリッドカラムをロードし、TForm1.Createコンストラクタの一部としてセルにTTmColumnTitleオブジェクトを割り当てます。 OnPrepareCanvasイベントはTForm1.Createの前に呼び出されるため、 'ColumnTitle:= TTmColumnTitle(StringGrid1.Objects [ACol、ARow])'はNilオブジェクトを返します)。 OnPreparecanvasイベントの前にグリッド列の読み込みを移動する方法はありますか、TForm1.Createの後に何らかの形でこのイベントをトリガーできますか? – user1174918

+1

フォームの 'OnCreate'イベントは、文字列グリッドの' OnPrepareCanvas'の前に1回発生します。 'OnPrepareCanvas'は、ペイントされるときに各セルに対して起動され、一度ではなく、セルが視覚的にリフレッシュする必要があるときはいつでも実行されます。あなたはイベントを呼び出す方法をあなたの質問に、あなたは、 'StringGrid1.DrawRow(0);'、しかし、あなたが記述しているのは変です。イベントはコンポーネントによって自動的に発生します。ハンドラで実行されているコードのみを記述します。 – TLama

+1

コンポーネントのイベント処理を誤解していると思います。 ['このチュートリアル'](http://delphi.about.com/od/beginners/l/aa052802b.htm)。また、フォームのコンストラクタをオーバーライドする必要はありません。イベントハンドラを記述する必要があります(私の答えのスクリーンショットを参照)。マウスでフォームを選択するだけで、 'Object Inspector'、' Events'タブに行き、 'OnCreate'の' ... 'ボタンをクリックしてそこにコードを書くことができます。 – TLama

関連する問題