TDBGridを使って、gdRowselectとgrMultiselectをtrueに設定してあるとします。この時に、選択している行に任意の色をつけたいとします。しかし、DBGRidでは、表示範囲をスクロールさせるときに、表示範囲の最下行もしくは最上行がハイライトになってしまいます。これをキャンセルして、常に選択した行だけを任委の色で表示する方法はありませんか?
補足です。表示されているDBGridの中から5行を選択したいと仮に考えます。まず1行目をクリックします。ここでgdSelected in Stateで調べて着色するとこの行は任意の色になります。さらに次の行をCTRLを押しながらクリックすると新たな行は任意色になりますが、先に選択した行はデフォルトのハイライト表示にかわってしまいます。これを、CTRLを押しながらクリックした全部の行を任意の色のままにしたいのです。さらに最上行・最下行もスクロールジにハイライトにしたくないということです。StringGridでよくあるような感じです。難しいでしょうか?
こんな感じでどうですか?
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with TDBGrid(Sender) do
begin
if Canvas.Brush.Color = clHighlight then
begin
Canvas.Brush.Color := clYellow;
end;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
説明の仕方がいまひとつ解りにくかったですね。
現在は以下のように書いています。
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
i, j: Integer;
s: string;
begin
with TDBGrid(Sender) do begin
if Canvas.Brush.Color = clHighlight then begin
Canvas.Brush.Color := $EEEEAA;
Canvas.Font.Color := $000000;
end;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
emd;
これでCTRLを押しながらクリックすると複数行選択になって色がつきます。ここまではいいのですが、DBGridをホイールでスクロールさせると、レコードポインタはスクロール方向によってDBGridの最下行もしくは最上行に移動します。するとこの列も色がついてしまって、選択部分とまぎらわしいのです。
要はレコードポインタのある行が非選択行であればデフォルトの表示、選択行であれば指定した色になってもらいたい、ということなのです。
これでどうでしょうか?
色は適当に変えてください。
(似たような質問に答えがあった?)
with TDBGrid(Sender) do begin
if TDBGridMSYS(Sender).SelectedRows.CurrentRowSelected = True then
begin
Canvas.Brush.Color := $EEEEAA;
Canvas.Font.Color := $000000;
end
else
begin
Canvas.Brush.Color := clWhite;
Canvas.Font.Color := clBlack;
end;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
Ruさん、いつもありがとうございます。
if TDBGridMSYS(Sender).SelectedRows.CurrentRowSelected = True then
ここの「TDBGridMSYS」が未定義の識別子となってしまいました。
>ここの「TDBGridMSYS」が未定義の識別子となってしまいました。
その程度のエラーも自力解決できないの?
> if TDBGridMSYS(Sender).SelectedRows.CurrentRowSelected = True then
TDBGridMSYSはTDBGridの間違いでしょう.
HOtaさんが言われるようにTDBGridMSYSはTDBGridです。
TDBGridMSYSは自作コンポーネントです。
テストした際にキャストするのを間違えました。
申し訳ありません。
Rusさん、HOtaさんありがとうございました。このコードでもレコードポインタがある行は色がついてしまいます。私がしたいことは、たとえば100レコードあって、画面に20行表示されていたとします。そのうちまん中あたりの数行を選択した状態でグリッドをスクロールさせたときに、レコードポインタが最初または最後の行に移動しますよね。この場合にその行が選択行でなければ色をつけたくない、と言う事なのです。
Ruさん、ごめんなさい。移植するときに書き落としていました。結果、望むとおりの動作になりました。ありがとうございました。
ツイート | ![]() |