1

Lazarus0.9.30.2を実行しています。

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

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

対象のセルを識別する(つまり、セルの「Rect」プロパティを識別する)別のプロシージャを使用して、必要な色を設定し、グリッドの一般的なDrawCellプロシージャを呼び出して、実際の色付けを行う正しいアプローチはありますか?

4

1 に答える 1

2

この目的のためのより良いイベントがあります、OnPrepareCanvas。このイベントは、セルがそれ自体を描画する準備をしているときに発生します。その段階で、背景をペイントするためのブラシの色など、キャンバスの属性の一部を変更できます。したがって、必要なのは色をどこかに保存することです。

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

そして、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;  

OnPrepareCanvasイベントが表示されたオブジェクトインスペクター:

于 2012-03-05T18:11:02.783 に答える