16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"DBGridの特定の行の背景色を変える"
この発言に対し以下のコメントが寄せられています
#00140 らせん企画 さん RE:DBGridの特定の行の背景色を変える
#00670 マ太郎 さん DBGridの特定の行の背景色を変えるコンポ
DBGrid にて、レコードポインタのある行だけの背景色を特定の色に代えます。
マウスでフォーカスを移した場合等に DBGrid に背景色あとが
残らないようにするために、ちょっと複雑になっています。
もっといい方法が、あると思いますので自分で考えてください。
レコードポインタのある行の背景 :水色
レコードポインタのある行の文字色 :青
カーソルのあるカラムの背景 :黄色(つまりカーソルの代わりに背景色黄色)
カーソルのあるカラムの文字色 :青
その他の行 :規定の色
まず、目的のDBGridを張り付けてあるフォームのソースコードで、interface部に
type
{ ----- ここから --------------- }
TExDBGrid = Class(TDBGrid);
{ ----- ここまでを記入する ----- }
TForm1 = class(TForm);
{いろいろ Delphi が自動的に書き込んでくれるところ}
そして、implementation部に
implementation
{$R *.DFM}
{ ----- ここから --------------- }
var
k_FocusOn1: String; {目的の DBGRid にフォーカスがあるかどうか '1'--ある}
{ ----- ここまでを記入する ----- }
とします。
そして、DBGridのOnDrawColumnCellイベントで、
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
GCoord : TGridCoord;
begin
GCoord := TExDBGrid(Sender).MouseCoord(Rect.Left, Rect.Top);
If TExDBGrid(Sender).Row = GCoord.Y Then // レコードポインタのある行なら
Begin
if k_FocusOn1 = '1' then // フォーカスのある DBGrid なら
begin
if gdFocused in State then // カーソルのあるカラムなら
begin
DBGrid1.Canvas.Brush.Color := clYellow; // 背景色:黄色
DBGrid1.Canvas.Font.Color := clBlue; // 文字色:青
end
else // カーソルがないカラムなら
begin
DBGrid1.Canvas.Brush.Color := clAqua; // 背景色:水色
DBGrid1.Canvas.Font.Color := clBlue; // 文字色:青
end;
end
else // フォーカスのない DBGrid なら規定の色
begin
DBGrid1.Canvas.Brush.Color := clWindow; // 背景色:ここでは白
DBGrid1.Canvas.Font.Color := clBlack; // 文字色:黒
end;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
if gdFocused in State then DBGrid1.Canvas.DrawFocusRect(Rect);
End;
end;
上記コードは、つぎはぎで作っていったから、 if の順番が変かもしれません。
しかし、ちゃんと動作はします(すべて人に頼らず、自分で工夫しましょう)。
そして、目的の DBGrid の OnEnter 及び OnExitイベントに
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
// フォーカスが当たりました
k_FocusOn1 := '1';
// OnDrowClumnCellイベントをわざと起こすため
DBGrid1.Font.Size := DBGrid1.Font.Size + 1;
DBGrid1.Font.Size := DBGrid1.Font.Size - 1;
{ // フォーカス時最初の項目は今月欄 k_Kongetu は変数 '4月'等が入っている
// ここは直接関係ありません。
DBGrid1.SelectedField := TB2.FieldByName(k_Kongetu); }
end;
procedure TForm1.DBGrid1Exit(Sender: TObject);
begin
// フォーカスを失いました
k_FocusOn1 := ' ';
// OnDrowClumnCellイベントをわざと起こすため
DBGrid1.Font.Size := DBGrid1.Font.Size + 1;
DBGrid1.Font.Size := DBGrid1.Font.Size - 1;
end;
ちなみに私は、水色の背景色をカーソルの代わりに使っていますので、
フォーカスのなくなった DBGrid に、水色の背景が残るのがいやだったのですが、
レコードポインタの位置を知っておきたい場合は、
上記の k_FocusOn1 関係の操作を取り去ってください。
Delphi3 for dBASE3+ の マ太郎
Original document by マ太郎 氏 ID:(VYC12077)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|