DBGridで選択した行に任意の色を設定したい。

解決


Delphi6  2007-06-18 14:09:22  No: 26724  IP: 192.*.*.*

TDBGridを使って、gdRowselectとgrMultiselectをtrueに設定してあるとします。この時に、選択している行に任意の色をつけたいとします。しかし、DBGRidでは、表示範囲をスクロールさせるときに、表示範囲の最下行もしくは最上行がハイライトになってしまいます。これをキャンセルして、常に選択した行だけを任委の色で表示する方法はありませんか?

編集 削除
Delphi6  2007-06-18 14:53:37  No: 26725  IP: 192.*.*.*

補足です。表示されているDBGridの中から5行を選択したいと仮に考えます。まず1行目をクリックします。ここでgdSelected in Stateで調べて着色するとこの行は任意の色になります。さらに次の行をCTRLを押しながらクリックすると新たな行は任意色になりますが、先に選択した行はデフォルトのハイライト表示にかわってしまいます。これを、CTRLを押しながらクリックした全部の行を任意の色のままにしたいのです。さらに最上行・最下行もスクロールジにハイライトにしたくないということです。StringGridでよくあるような感じです。難しいでしょうか?

編集 削除
igy  2007-06-18 18:49:00  No: 26726  IP: 192.*.*.*

こんな感じでどうですか?

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;

編集 削除
komin  2007-06-22 15:36:40  No: 26727  IP: 192.*.*.*

説明の仕方がいまひとつ解りにくかったですね。
  現在は以下のように書いています。

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の最下行もしくは最上行に移動します。するとこの列も色がついてしまって、選択部分とまぎらわしいのです。
  要はレコードポインタのある行が非選択行であればデフォルトの表示、選択行であれば指定した色になってもらいたい、ということなのです。

編集 削除
Ru  2007-06-22 17:42:43  No: 26728  IP: 192.*.*.*

これでどうでしょうか?
色は適当に変えてください。
(似たような質問に答えがあった?)

  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;

編集 削除
komin  2007-06-25 08:50:57  No: 26729  IP: 192.*.*.*

Ruさん、いつもありがとうございます。

  if TDBGridMSYS(Sender).SelectedRows.CurrentRowSelected = True then

  ここの「TDBGridMSYS」が未定義の識別子となってしまいました。

編集 削除
コマッタちゃん  2007-06-25 09:05:43  No: 26730  IP: 192.*.*.*

>ここの「TDBGridMSYS」が未定義の識別子となってしまいました。

その程度のエラーも自力解決できないの?

編集 削除
HOta  2007-06-25 09:51:38  No: 26731  IP: 192.*.*.*

>  if TDBGridMSYS(Sender).SelectedRows.CurrentRowSelected = True then
TDBGridMSYSはTDBGridの間違いでしょう.

編集 削除
Ru  2007-06-25 11:48:51  No: 26732  IP: 192.*.*.*

HOtaさんが言われるようにTDBGridMSYSはTDBGridです。
TDBGridMSYSは自作コンポーネントです。
テストした際にキャストするのを間違えました。

申し訳ありません。

編集 削除
komin  2007-06-25 13:14:31  No: 26733  IP: 192.*.*.*

Rusさん、HOtaさんありがとうございました。このコードでもレコードポインタがある行は色がついてしまいます。私がしたいことは、たとえば100レコードあって、画面に20行表示されていたとします。そのうちまん中あたりの数行を選択した状態でグリッドをスクロールさせたときに、レコードポインタが最初または最後の行に移動しますよね。この場合にその行が選択行でなければ色をつけたくない、と言う事なのです。

編集 削除
komin  2007-06-25 13:37:40  No: 26734  IP: 192.*.*.*

Ruさん、ごめんなさい。移植するときに書き落としていました。結果、望むとおりの動作になりました。ありがとうございました。

編集 削除