procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var s :string; begin s:=dbgrid1.SelectedField.AsString; if gdSelected in State then begin dbgrid1.Canvas.Brush.Color:=clred; (Sender as TDBGrid).Canvas.FillRect(Rect); (Sender as TDBGrid).Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2,s); end; end;
to jackie168(花好月圓) 谢谢~ 我说的是mousemove事件,不是选择一个单元格后那行变颜色~ 我测试一下,如果你的这个不行,还请继续帮忙了~
http://blog.csdn.net/whbo/articles/232420.aspx
申明两个全局变量X,Y :integer 或 一个TPoint变量 在OnMouseMove事件中记录当前鼠标的位置。记录完了以后调用DBGrid.Repaint函数。在OnDrawDataCell中,判断当前鼠标的位置是否在Rect中,如果在重画。 例子: procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); var pt :TPoint; begin pt.X := self.X; pt.Y := self.Y; if PtInRect(Rect,pt) then begin dbgrid1.Canvas.Brush.Color := clRed; dbgrid1.DefaultDrawDataCell(Rect,Field,State); end; end;procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin self.X := X; self.Y := Y; Dbgrid1.Repaint; end;
private { Private declarations } public x,y:integer; //全局变量 { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin self.X := X; self.Y := Y; Dbgrid1.Repaint; end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var pt :TPoint; begin pt.X := self.X; pt.Y := self.Y; if PtInRect(Rect,pt) then begin dbgrid1.Canvas.Brush.Color := clRed; dbgrid1.DefaultDrawDataCell(Rect,Column.Field,State); end; end;end.
(1)设置DBGrid的Options属性中的dgRowSelect为True。 (2)定义一个新类。代码如下: type THackDBGrid = class(TDBGrid); (3)在DBGrid的OnMouseMove事件处理程序中,写如下的代码: procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var gc: TGridCoord; begin gc:= DBGrid1.MouseCoord(X, Y); if (gc.X >= 0) and (gc.Y > 0) then DBGrid1.DataSource.DataSet.MoveBy(gc.Y - THackDBGrid(DBGrid1).Row); end; (4)编译,运行!
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var s :string;
begin
s:=dbgrid1.SelectedField.AsString;
if gdSelected in State then begin
dbgrid1.Canvas.Brush.Color:=clred;
(Sender as TDBGrid).Canvas.FillRect(Rect);
(Sender as TDBGrid).Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2,s);
end;
end;
谢谢~
我说的是mousemove事件,不是选择一个单元格后那行变颜色~
我测试一下,如果你的这个不行,还请继续帮忙了~
例子:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
pt :TPoint;
begin
pt.X := self.X;
pt.Y := self.Y; if PtInRect(Rect,pt) then
begin
dbgrid1.Canvas.Brush.Color := clRed;
dbgrid1.DefaultDrawDataCell(Rect,Field,State);
end;
end;procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
self.X := X;
self.Y := Y;
Dbgrid1.Repaint;
end;
{ Private declarations }
public
x,y:integer; //全局变量
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
self.X := X;
self.Y := Y;
Dbgrid1.Repaint;
end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
pt :TPoint;
begin
pt.X := self.X;
pt.Y := self.Y;
if PtInRect(Rect,pt) then
begin
dbgrid1.Canvas.Brush.Color := clRed;
dbgrid1.DefaultDrawDataCell(Rect,Column.Field,State);
end;
end;end.
(2)定义一个新类。代码如下:
type
THackDBGrid = class(TDBGrid);
(3)在DBGrid的OnMouseMove事件处理程序中,写如下的代码:
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
gc: TGridCoord;
begin
gc:= DBGrid1.MouseCoord(X, Y);
if (gc.X >= 0) and (gc.Y > 0) then
DBGrid1.DataSource.DataSet.MoveBy(gc.Y - THackDBGrid(DBGrid1).Row);
end;
(4)编译,运行!