2重表示をなくすには?


ない  2011-05-19 22:16:52  No: 40538

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 22:38:10  No: 40539

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


ない  2011-05-19 23:28:06  No: 40540

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

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


au  2011-05-19 23:47:54  No: 40541

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


au  2011-05-19 23:49:08  No: 40542

FillCharじゃなくてFillRectでした


ない  2011-05-20 03:09:27  No: 40543

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


要微調整  2011-05-20 03:20:36  No: 40544

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


ない  2011-05-20 04:07:40  No: 40545

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-21 04:55:48  No: 40546

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


TS  2011-05-21 06:36:39  No: 40547

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


KHE00221  2011-05-21 16:35:39  No: 40548

>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-22 04:09:49  No: 40549

>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-24 02:58:36  No: 40550

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


HOta  2011-05-24 05:35:34  No: 40551

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


ない  2011-05-25 19:28:41  No: 40552

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


HOta  2011-05-26 00:16:02  No: 40553

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


au  2011-05-26 17:00:11  No: 40554

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

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

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


無理とは人の心が作るもの  2011-05-28 06:55:12  No: 40555

>ただ、私のところでは、上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 18:45:48  No: 40556

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


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

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






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