喫茶XRAYトップページ

[スレッド全体
]

[9931] TStringGridのセルの塗り潰し返信 削除
2016/5/16 (月) 11:33:10 Mr.XRAY
[TStringGridのDrawCellで左側に謎の空白が出る]
http://www.freeml.com/delphi-users/4452/latest?sid=a9966e7df7401d6abde9c2d09b86a9a97c89679f55b4deb1dcb2480f49563d2a048c7835c7f189bfcced54c0391341e17dcfc1fdae6893376d29501512a49c58

やってみました.
Delphi のバージョンが上がると,マージン(?)が大きくなるのかな ?
測ってみたら,Delphi XE7 の場合は 4 px でした.
Delphi 10 Seattle だと 10 px ?

下図は,新規作成のプロジェクトに TStringGrid を配置して,
ML のコードを書いただけです.ただし,色は変えています.


[9939] Re:TStringGridのセルの塗り潰し返信 削除
2016/5/16 (月) 17:39:29 福士
▼ Mr.XRAYさん
> やってみました.
> Delphi のバージョンが上がると,マージン(?)が大きくなるのかな ?
> 測ってみたら,Delphi XE7 の場合は 4 px でした.


ソースコードを確認してみましたが、XEまでは
| procedure TStringGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
|   AState: TGridDrawState);
| begin
|   if DefaultDrawing then
|     Canvas.TextRect(ARect, ARect.Left+2, ARect.Top+2, Cells[ACol, ARow]);
|   inherited DrawCell(ACol, ARow, ARect, AState);
| end;
となっていて、一方XE2以降は
| procedure TStringGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
|   AState: TGridDrawState);
| const
|   CCellNormal: array[TGridDrawingStyle] of TThemedGrid =
|     (tgClassicCellNormal, tgCellNormal, tgGradientCellNormal);
| ...(略)
| var
|   LText: string;
|   LDetails: TThemedElementDetails;
| begin
|   if DefaultDrawing then
|   begin
|     if StyleServices.Enabled then
|     begin
|       ARect.Left := ARect.Left + 4;
|
|       if (gdFixed in AState) then
| ...(略)
|       LText := Cells[ACol, ARow];
|       Canvas.TextRect(ARect, ARect.Left+2,
|         ARect.Top+((ARect.Height - Canvas.TextHeight(LText)) div 2), LText)
|     end
|     else
|       Canvas.TextRect(ARect, ARect.Left+2, ARect.Top+2, Cells[ACol, ARow]);
|   end;
|   inherited DrawCell(ACol, ARow, ARect, AState);
| end;
となっています。つまりXE2以降でDefaultDrawing=Trueかつ*スタイル(テーマ)有効*だと
左4pixelがDrawCell=OnDrawCellの対象外になる、ということのようです。
なんでこんな風になっているのかはよくわかりません。

[9940] Re2:TStringGridのセルの塗り潰し返信 削除
2016/5/16 (月) 17:57:44 Mr.XRAY
▼ 福士さん

> となっています。つまりXE2以降でDefaultDrawing=Trueかつ*スタイル(テーマ)有効*だと
> 左4pixelがDrawCell=OnDrawCellの対象外になる、ということのようです。
> なんでこんな風になっているのかはよくわかりません。


ははぁ〜,なるほど,ソースコードまでは確認しませんでした.
XE でテーマ関係の描画で,マージンがないと問題でもあったのかも...
で,やってみました.領域の左端を - 4 にしたのが図の下の図です.
コードは以下です.
-5 にすると,左側のセルを選択した時に 1 px (?) 右のセルの背景に欠損が
生じるようです.
これから ML にレス書いてみます.

//  動作確認 Windows 7 U64(SP1) + Delphi XE7

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if ACol = 2 then begin
    Rect.Left := Rect.Left - 4;
    StringGrid1.Canvas.Brush.Style := bsSolid;
    StringGrid1.Canvas.Brush.Color := RGB(0, 150, 0);
    StringGrid1.Canvas.FillRect(Rect);
  end;
end;



[9948] Re3:TStringGridのセルの塗り潰し返信 削除
2016/5/16 (月) 21:19:02 Mr.XRAY
> で,やってみました.領域の左端を - 4 にしたのが図の下の図です.
> コードは以下です.


Delphi ML の書き込みの 10 px だと以下の図のような感じですね.
10 px はかなり目立ちます.


[9950] Re4:TStringGridのセルの塗り潰し返信 削除
2016/5/16 (月) 22:38:27 igy
▼ Mr.XRAYさん
> Delphi ML の書き込みの 10 px だと以下の図のような感じですね.
> 10 px はかなり目立ちます.


Delphi 10.1 Berlinで試してみました。

私の場合、Delphi XE以前のバージョンもよく使うので、
以下のような感じで調整しています。

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
{$IFDEF CONDITIONALEXPRESSIONS}
  {$IF Declared(CompilerVersion) and (CompilerVersion >= 23.0)}
    Rect.Left := Rect.Left - 4;
  {$IFEND}
{$ENDIF}

  if ACol = 2 then begin
    StringGrid1.Canvas.Brush.Style := bsSolid;
    StringGrid1.Canvas.Brush.Color := RGB(0, 150, 0);
    StringGrid1.Canvas.FillRect(Rect);
  end;
end;


[9952] Re5:TStringGridのセルの塗り潰し返信 削除
2016/5/16 (月) 23:50:49 Mr.XRAY
▼ igyさん,サンクスです.

> Delphi 10.1 Berlinで試してみました。

なるほど.となると,Delphi ML の方の 10 px は左側のマージンが多いと
いう意味の表現ですね.きっと.
福士さんの調査結果の Delphi XE2 以降ということになりそうです.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82