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;
こうしたらどうでしょ
(Sender as TStringGrid).Canvas.Brush.Style := bsSolid;
(Sender as TStringGrid).Canvas.FillRect(Rect);
書き込みありがとうございます。
すいません、もう一つ言うのを忘れていました。
セルの動かない部分(FIXED部)なので、
グレーっぽい色は残ってほしいです。
(Sender as TStringGrid).Canvas.Brush.Style := bsSolid;
だと、真っ白になってしまいますので・・・・。
StateにgdFixedが含まれてたらBrush.colorをFixedColorにしてからFillCharする
FillCharじゃなくてFillRectでした
Brush.colorをFixedColorにしてから・・・にしたら、
全部、グレーになってしまった・・・。
固定行のグレーから白のグラデュエーションが表示できない・・・。
難しそうですね。
D2010ならば、自前でグラデーションで塗りつぶすのは難しくないけど、
それよりも、Brush.Style は bsClear のままで背景を塗らずに 文字の
描画位置を OffsetRect で微調整して、文字位置を完全に一致させて
上書きした方がいい。
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;
FillRect(Rect);で一度表示を消してから、書き直さないと、Delphi5でも二重になります。
HOtaさんが言われる様に結局自前で全部書き込む様になると思います。
https://www.petitmonte.com/bbs/answers?question_id=6506
>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を入れて文字位置を調整したら意味が無い
>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;
いろいろとご意見ありがとうございます。
ただ、私のところでは、上1/3が白、下2/3がグレーの
グラデーションがかかったようになっています。
ですので、1画面にデフォルトのままの表と
DrawCellで描画したのが混在しています。
やはり、難しいんでしょうね。
DefaultDrawingをfalseに設定していますか?
DefaultDrawingですが、
Trueのままにしています。
そのほかの設定、たとえばフォント等の設定を
すべてするのがとても大変だったため
Trueにしています。
やはり、Falseにして、すべてDrawCellに
コーディングしたほうがよいのでしょうか。
塗りなおしてから描き直さないと2重表示は治らないでしょうね。
とりあえず、orz!さんの方法でFixedCellについてはちゃんと塗り直されて二重表示とかにはならないと思うんですが。
一画面に表が2つ混在してるってのはグリッドが見た目2個描画されてるって事でしょうか?
であれば、with (Sender as TStringGrid) do beginこの行を書いてないとか?で関数に渡すCanvasがFormのCanvasを渡してる事になってないでしょうか?
>ただ、私のところでは、上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;
>>もしかして、もう無理と思って諦めてしまった? それとも、すでに自力で解決した?
すいません、とりあえず、そのままにしておき
他のことをしていました。そしたら、書き込みのことを
すっかり忘れていました、すいません。
今は、教えて頂いた通りのグレーのグラデーション描画のままに
させてもらっています。ですので、標準と若干違います。
「無理とは人の心が作るもの」様のソースは
今から、確認してみようと思います。
また、結果をご報告します。
ツイート | ![]() |