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とした場合、左端のセルのみが反転しないという表示になってしまい、非常に困っています。
ご教授ください。宜しくお願いします。
ヘルプ
TStringGridのOnDrawCellイベント
では、
>DefaultDrawing プロパティが True ならば,描画グリッドは
>OnDrawCell イベントの前にセルの背景色をペイントし,
>OnDrawCell イベントハンドラがセルの内容の描画を完了した後で,
>選択されたセルの周りにフォーカス四角形を描画します。
とあるので、
DefaultDrawing プロパティの切り替えをOnDrawCell イベントで
設定しても期待した動作にならないのでは?
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にする」というのは、根本的に方法論が誤っているのでしょうか?
すいません、リンクの使い方を誤ったようです。
https://www.petitmonte.com/bbs/answers?question_id=1861
これだけでOKのようですね・・・
申し訳ありません。
DefaultDrawingはTStringGridのプロパティでCellsなどの部分のプロパティでは無いので、無理です。
https://www.petitmonte.com/bbs/answers?question_id=1861
にも
>答えはカンタン。DefaultDrawingプロパティを False にすること。
となっています。
StringGridを思い通りに使うにはOnDrawSelは不可欠ですよ。
OnDrawCellだろが。
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について、アドバイスいただければと思います。
すいません、要点のみコードを抽出したのですが、コンパイルが通らない状態になってしまいました。申し訳ありません。
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;
皆様、アドバイスいただきありがとうございました。
固定セルの結合は以下の方法で行い、OnDrawCellイベントハンドラにおいてはDefaultDrawingを変更しない(Trueのまま)で実装することにしました。
また、Ctl3DプロパティをFalseにすることに伴い、グリッドの表示が従来の画面と異なってしまう問題が残りましたが、これはOKということになりました。
※「Ctl3DプロパティをFalseにすることで、Grids.pasで実装されている固定セルのエッジ部分の描画処理を発生させないようにする」という、やや気持ち悪い解決になってしまいました・・・・
ありがとうございました。
ツイート | ![]() |