TStringGridの固定行のみDefaultDrawingをFalseにした時の選択セルの描画について

解決


てつお  2006-11-03 06:29:59  No: 23719

TStringGridでご教授ください。

Delphi5 UpdatePack1 (Build6.18)です。

TStringGridの固定行のみDefaultDrawingをFalseにしたいと思っています。
(固定行の一部のセルを結合する機能をOnDrawCellで描画して実現したいと考えています。このため、DefaultDrawingをFalseにします)

Optionプロパティはデフォルト
FixedCols = 0
FixedRows = 1

になっています。

OnDrawCellで以下のように記述しました。

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if gdFixed in State then
    StringGrid1.DefaultDrawing := False    
  else
    StringGrid1.DefaultDrawing := True;
end;

TForm1を表示すると、通常デフォルトで反転しているセル(今回は[0, 1])の反転がなくなってしまいます。点線の枠は残っているのですが、反転が消えてしまいます。
もちろん、OnDrawCellに記述したコードを削除すれば、反転は表示されます。

この現象を回避することは可能でしょうか?
RowSelect=Trueとした場合、左端のセルのみが反転しないという表示になってしまい、非常に困っています。

ご教授ください。宜しくお願いします。


igy  2006-11-06 09:05:58  No: 23720

ヘルプ
TStringGridのOnDrawCellイベント
では、

>DefaultDrawing プロパティが True ならば,描画グリッドは 
>OnDrawCell イベントの前にセルの背景色をペイントし,
>OnDrawCell イベントハンドラがセルの内容の描画を完了した後で,
>選択されたセルの周りにフォーカス四角形を描画します。

とあるので、

DefaultDrawing プロパティの切り替えをOnDrawCell イベントで
設定しても期待した動作にならないのでは?


てつお  2006-11-06 19:10:33  No: 23721

igyさん、ご指摘ありがとうございます。

<A HREF='wwwlng.cgi?print+200407/04070056.txt'>https://www.petitmonte.com/bbs/answers?question_id=1861</A>
を参考にグリッドの固定セル結合を実現しようとしているのですが・・・

OnDrawCellイベントでDefaultDrawingを変更しても期待した動作が得られないということでしょうか・・・。

(1) DefaultDrawingを常にFalseにする
(2) TStringGridを継承したクラスでOnDrawCellの挙動を変更する

などで対応できるか確認したいと思います。

ただ(都合のよい話ですが)、「自前でOnDrawCellを実装したくない」という希望があったりします・・・

「カスタマイズしたい部分だけ、DefaultDrawingをFalseにする」というのは、根本的に方法論が誤っているのでしょうか?


てつお  2006-11-06 19:11:52  No: 23722

すいません、リンクの使い方を誤ったようです。

https://www.petitmonte.com/bbs/answers?question_id=1861

これだけでOKのようですね・・・
申し訳ありません。


HOta  2006-11-06 19:26:41  No: 23723

DefaultDrawingはTStringGridのプロパティでCellsなどの部分のプロパティでは無いので、無理です。


HOta  2006-11-06 19:29:08  No: 23724

https://www.petitmonte.com/bbs/answers?question_id=1861
にも
>答えはカンタン。DefaultDrawingプロパティを False にすること。
となっています。


文字  2006-11-06 23:46:17  No: 23725

StringGridを思い通りに使うにはOnDrawSelは不可欠ですよ。


  2006-11-07 00:14:43  No: 23726

OnDrawCellだろが。


てつお  2006-11-07 02:22:30  No: 23727

HOta さん、文字 さん、ご指摘ありがとうございます。

https://www.petitmonte.com/bbs/answers?question_id=1861

に紹介されているサンプルコードでは、固定セルの場合のみDefaultDrawingをFalseにしているようなので、なんとかなるか!?と思ったのですが・・・やはり難しいようです。

根本的に考え方を変えて、DefaultDrawingをTrueにしたまま、固定セルの結合ができないものか試してみました。

StringGrid1の設定は以下のようにしています。
DefaultDrawing := True;
Ctl3D := False;

procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  Text := StringGrid1.Cells[ACol, ARow];

  // 固定セルのみ
  if gdFixed in State then begin

    結合対象セルの描画Rectを計算
//    Rect := 

    StringGrid1.Canvas.Brush.Color := StringGrid1.FixedColor;
    StringGrid1.Canvas.Font.Color  := clWhite
    StringGrid1.Canvas.FillRect(Rect);
    DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, BF_RECT);

    // 文字列描画
    DrawText(FGrid.Canvas.Handle, PChar(Text), -1, Rect,
      DT_SINGLELINE or DT_CENTER or DT_VCENTER);
  end;
end;

かなり強引ですが、これでほぼ期待した状態が得られました。
ただCtl3DプロパティをFalseにした影響で、グリッドの表示が従来と異なってしまうので、もう少し検討してみます。

DefaultDrawingをFalseにして、自前でOnDrawCellをコーディングすることも検討したのですが、現在のプロジェクトでは基本的にTStringGridの使用にあたっては「True」にしているので、準じることにしました。

当初の表題の件とは異なってしまいますが、固定セルの結合方法やDefaultDrawingについて、アドバイスいただければと思います。


てつお  2006-11-07 02:25:01  No: 23728

すいません、要点のみコードを抽出したのですが、コンパイルが通らない状態になってしまいました。申し訳ありません。

procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Text: string;
begin
  // 固定セルのみ
  if gdFixed in State then begin

    Text := StringGrid1.Cells[ACol, ARow];

    結合対象セルの描画Rectを計算
//    Rect := 

    StringGrid1.Canvas.Brush.Color := StringGrid1.FixedColor;
    StringGrid1.Canvas.Font.Color  := clWhite
    StringGrid1.Canvas.FillRect(Rect);
    DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, BF_RECT);

    // 文字列描画
    DrawText(StringGrid1.Canvas.Handle, PChar(Text), -1, Rect,
      DT_SINGLELINE or DT_CENTER or DT_VCENTER);
  end;
end;


てつお  2006-11-08 00:52:30  No: 23729

皆様、アドバイスいただきありがとうございました。

固定セルの結合は以下の方法で行い、OnDrawCellイベントハンドラにおいてはDefaultDrawingを変更しない(Trueのまま)で実装することにしました。

また、Ctl3DプロパティをFalseにすることに伴い、グリッドの表示が従来の画面と異なってしまう問題が残りましたが、これはOKということになりました。
※「Ctl3DプロパティをFalseにすることで、Grids.pasで実装されている固定セルのエッジ部分の描画処理を発生させないようにする」という、やや気持ち悪い解決になってしまいました・・・・

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加