2重表示をなくすには?


ない  2011-05-19 13:16:52  No: 40538  IP: 192.*.*.*

Delphi5では、正常に表示されるのに、
同様のソースをDelphi2010で行うと、
文字が2重表示になるのは
なぜでしょうか?

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  (Sender as TStringGrid).Canvas.FillRect(Rect);
  DrawText((Sender as TStringGrid).Canvas.Handle, PChar((Sender as TStringGrid).Cells[ACol,ARow]),
           Length((Sender as TStringGrid).Cells[ACol,ARow]),
           Rect, DT_SingleLine or DT_VCenter or DT_Center);
end;

編集 削除
au  2011-05-19 13:38:10  No: 40539  IP: 192.*.*.*

こうしたらどうでしょ
(Sender as TStringGrid).Canvas.Brush.Style := bsSolid;
(Sender as TStringGrid).Canvas.FillRect(Rect);

編集 削除
ない  2011-05-19 14:28:06  No: 40540  IP: 192.*.*.*

書き込みありがとうございます。

すいません、もう一つ言うのを忘れていました。
セルの動かない部分(FIXED部)なので、
グレーっぽい色は残ってほしいです。
(Sender as TStringGrid).Canvas.Brush.Style := bsSolid;
だと、真っ白になってしまいますので・・・・。

編集 削除
au  2011-05-19 14:47:54  No: 40541  IP: 192.*.*.*

StateにgdFixedが含まれてたらBrush.colorをFixedColorにしてからFillCharする

編集 削除
au  2011-05-19 14:49:08  No: 40542  IP: 192.*.*.*

FillCharじゃなくてFillRectでした

編集 削除
ない  2011-05-19 18:09:27  No: 40543  IP: 192.*.*.*

Brush.colorをFixedColorにしてから・・・にしたら、
全部、グレーになってしまった・・・。
固定行のグレーから白のグラデュエーションが表示できない・・・。
難しそうですね。

編集 削除
要微調整  2011-05-19 18:20:36  No: 40544  IP: 192.*.*.*

D2010ならば、自前でグラデーションで塗りつぶすのは難しくないけど、
それよりも、Brush.Style は bsClear のままで背景を塗らずに 文字の
描画位置を OffsetRect で微調整して、文字位置を完全に一致させて
上書きした方がいい。

編集 削除
ない  2011-05-19 19:07:40  No: 40545  IP: 192.*.*.*

OffsetRectを入れたけど、
やり方がマズい???
if (gdFixed In State) then begin
  OffsetRect(Rect, 10, 10);
  //(Sender as TStringGrid).Canvas.Brush.Style := bsSolid;
  //(Sender as TStringGrid).Canvas.Brush.Color := (Sender as TStringGrid).FixedColor;
  //(Sender as TStringGrid).Canvas.Brush.Style := bsClear;
  (Sender as TStringGrid).Canvas.FillRect(Rect);
  DrawText((Sender as TStringGrid).Canvas.Handle, PChar((Sender as TStringGrid).Cells[ACol,ARow]),
                         Length((Sender as TStringGrid).Cells[ACol,ARow]),
                         Rect, DT_SingleLine or DT_VCenter or DT_RIGHT);
end else begin
  (Sender as TStringGrid).Canvas.Brush.Style := bsSolid;
  (Sender as TStringGrid).Canvas.FillRect(Rect);
  DrawText((Sender as TStringGrid).Canvas.Handle, PChar((Sender as TStringGrid).Cells[ACol,ARow]),
                         Length((Sender as TStringGrid).Cells[ACol,ARow]),
                         Rect, DT_SingleLine or DT_VCenter or DT_CENTER);
end;

編集 削除
HOta  2011-05-20 19:55:48  No: 40546  IP: 192.*.*.*

FillRect(Rect);で一度表示を消してから、書き直さないと、Delphi5でも二重になります。

編集 削除
TS  2011-05-20 21:36:39  No: 40547  IP: 192.*.*.*

HOtaさんが言われる様に結局自前で全部書き込む様になると思います。
https://www.petitmonte.com/bbs/answers?question_id=6506

編集 削除
KHE00221  2011-05-21 07:35:39  No: 40548  IP: 192.*.*.*

>DEPHI5 ではDelphi5では、正常に表示されるのに、
>同様のソースをDelphi2010で行うと、
>文字が2重表示になるのは
>なぜでしょうか?

DELPHI 5 では
Canvas.Brush.Style := bsSolid;
になっている

DELHI 2010 では
Canvas.Brush.Style := bsClear;
になっている

背景と文字(左寄せ)を描画後に

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

が実行されるので

>(Sender as TStringGrid).Canvas.FillRect(Rect);

bsClear なので塗りつぶされない

>  DrawText((Sender as TStringGrid).Canvas.Handle, PChar((Sender as >TStringGrid).Cells[ACol,ARow]),
>           Length((Sender as TStringGrid).Cells[ACol,ARow]),
>           Rect, DT_SingleLine or DT_VCenter or DT_Center);

中央に文字描画

>OffsetRectを入れたけど、
>やり方がマズい???

標準で左寄せになっているのを
中央に表示しようとしているので
OffsetRectを入れて文字位置を調整したら意味が無い

編集 削除
orz!  2011-05-21 19:09:49  No: 40549  IP: 192.*.*.*

>OffsetRectを入れたけど、
>やり方がマズい???

最初の質問でセル文字の alignment を変更してあるのを見落としていたw。
固定セルの alignment を中央寄せ、または右寄せに変更したいのなら背景をグラデーションで塗らないとまずいね。
ここではグラデーションの色として clBtnFace を指定している。

procedure GradientFillRect(Canvas: TCanvas; Rect: TRect; aColor: TColor);
var
  H, L, S: WORD;
begin
  ColorRGBToHLS(ColorToRGB(aColor), H, L, S);
  GradientFillCanvas(Canvas, ColorHLSToRGB(H, L+80, S), ColorHLSToRGB(H, L-40, S), Rect, gdVertical);
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 with (Sender as TStringGrid) do begin
  if (gdFixed in State) then begin
   Canvas.Brush.Style := bsClear;
   // clBtnFace色のグラデーションで塗る(上を明るく、下を暗く)
   GradientFillRect(Canvas, Rect, clBtnFace{ $E0E0E0 });
   DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect, DT_SINGLELINE or DT_VCENTER or DT_RIGHT);
  end else begin

  end;
 end;
end;

編集 削除
ない  2011-05-23 17:58:36  No: 40550  IP: 192.*.*.*

いろいろとご意見ありがとうございます。
ただ、私のところでは、上1/3が白、下2/3がグレーの
グラデーションがかかったようになっています。
ですので、1画面にデフォルトのままの表と
DrawCellで描画したのが混在しています。
やはり、難しいんでしょうね。

編集 削除
HOta  2011-05-23 20:35:34  No: 40551  IP: 192.*.*.*

DefaultDrawingをfalseに設定していますか?

編集 削除
ない  2011-05-25 10:28:41  No: 40552  IP: 192.*.*.*

DefaultDrawingですが、
Trueのままにしています。
そのほかの設定、たとえばフォント等の設定を
すべてするのがとても大変だったため
Trueにしています。
やはり、Falseにして、すべてDrawCellに
コーディングしたほうがよいのでしょうか。

編集 削除
HOta  2011-05-25 15:16:02  No: 40553  IP: 192.*.*.*

塗りなおしてから描き直さないと2重表示は治らないでしょうね。

編集 削除
au  2011-05-26 08:00:11  No: 40554  IP: 192.*.*.*

とりあえず、orz!さんの方法でFixedCellについてはちゃんと塗り直されて二重表示とかにはならないと思うんですが。

一画面に表が2つ混在してるってのはグリッドが見た目2個描画されてるって事でしょうか?

であれば、with (Sender as TStringGrid) do beginこの行を書いてないとか?で関数に渡すCanvasがFormのCanvasを渡してる事になってないでしょうか?

編集 削除
無理とは人の心が作るもの  2011-05-27 21:55:12  No: 40555  IP: 192.*.*.*

>ただ、私のところでは、上1/3が白、下2/3がグレーの
>グラデーションがかかったようになっています。
>ですので、1画面にデフォルトのままの表と
>DrawCellで描画したのが混在しています。
>やはり、難しいんでしょうね。

質問者は StringGridのDrawingStyleプロパティをgdsThemed(デフォルト)にしているので、
DrawCellで自前のグラデーション描画をしているStringGridと デフォルト描画をしている
StringGridを 一つの画面(Form)に並べて配置した場合に 両者の見た目が違ってしまって
困るということなのかな?
D2010を持ってないので、ネットで D2010のStringGridが 実際どのように描画されている
のかを調べたら、DrawingStyleプロパティをgdsGradinetに変更した場合には 固定セルが
普通のグラデーションで描画されるけど、DrawingStyleをgdsThemedのままにしてあると、
確かに1/3くらいを境として上部分が白、下部分はグレーのグラデーションで描画され
ているように見える。
なので、デフォルトのgdsThemedの見た目と同じようにDrawCellで固定セルを描画するには
ひと手間余計にかける必要があるけど、難しくはない。
もしかして、もう無理と思って諦めてしまった? それとも、すでに自力で解決した?

procedure ThemedFillRect(Canvas: TCanvas; Rect: TRect);
var
  R: TRect;
  Border: Integer;
begin
  Border := (Rect.Bottom - Rect.Top) div 3;
  R := Rect;
  inc(R.Top, Border);
  GradientFillCanvas(Canvas, $FDF7F6, $DCD1D0, R, gdVertical);
  R := Rect;
  R.Bottom := R.Top + Border;
  Canvas.Brush.Color := $FFFFFE;
  Canvas.Brush.Style := bsSolid;
  Canvas.FillRect(R);
  Canvas.Brush.Style := bsClear;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 with (Sender as TStringGrid) do begin
  if (gdFixed in State) then begin
   // DrawingStyleに応じて固定セルの塗り方を変える
   case DrawingStyle of
    gdsThemed  : ThemedFillRect(Canvas, Rect);
    gdsGradient: GradientFillCanvas(Canvas, GradientStartColor, GradientEndColor, Rect, gdVertical);
   end;
   DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect, DT_SINGLELINE or DT_VCENTER or DT_RIGHT);
  end else begin

  end;
 end;
end;

編集 削除
ない  2011-06-10 09:45:48  No: 40556  IP: 192.*.*.*

>>もしかして、もう無理と思って諦めてしまった? それとも、すでに自力で解決した?
すいません、とりあえず、そのままにしておき
他のことをしていました。そしたら、書き込みのことを
すっかり忘れていました、すいません。
今は、教えて頂いた通りのグレーのグラデーション描画のままに
させてもらっています。ですので、標準と若干違います。
「無理とは人の心が作るもの」様のソースは
今から、確認してみようと思います。
また、結果をご報告します。

編集 削除