如何在DBGRID失去焦点时将当前记录行以彩色背景显示(200分)

  • 主题发起人 主题发起人 ecfan1
  • 开始时间 开始时间
E

ecfan1

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠急救:
我要在用户击删除BUTTOM时看到当前记录,即
在DBGRID(包括失去焦点时)将当前记录行以彩色背景显示?
谢谢!!!
 
grid.options := grid.option + [gdRowSelect, gdAlwaysShowSelection];
或设计时选中options中的RowSelect和AlwaysShowSelection这两项.
 
procedure TForm1.DBGrid1DataCell(Sender:TObject;const Rect:TRect;
Field:TField;State:TGridDrawState);
var
begin
if Field.fieldname='XM'
then DBgrid1.canvas.brush.color:=clred
else DBgrid1.canvas.brush.color:=clblue;
DBgrid1.canvas.brush.color: = $0020508f;
DGgridl.canvas.fillRect(Rect);
DBgridl.canvas.textout(Rect.left+4,Rect.top+4,field.Asstring);
end;
 
type
TCustomDBGridCracker = class(TCustomDBGrid);

Var
Dl:TList; //记录将要被删除的行号

function TForm1.LineInList(i:integer):Boolean; //用于判断行号为i的行是否已标记
begin
......{用一个循环来判断}
......

end;

......
{在删除Button的事件处理以下事情:
1.调用LineInList,检查当前行号是否在TList中,如有则去掉,表示恢复已标记的行;
如没有,则把当前行号加入到TList中,以示将要删除.
2.调用DBGrid的RePaint事件,强制使它刷新.

}
......

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with Cracker(Sender) do
if LineInList(DataLink.ActiveRecord) then //DBGrid中的当前记录是应标记的行
Canvas.Brush.Color := clRed
else
Canvas.Brush.Color := clWhite;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

最后,当执行删除或全部恢复后应清空 Dl.
 
按问题本身来理解,eYes的方法是最好的。
按churchuill的来理解的话,不知你的Dl是怎么记录的,考虑到dbgrid的滚动没有.
我是这么实现的:在表中设置一标志位,标志是否要删除,双击时改变其值,完了dbgrid1.refresh。

DBGrid1DrawColumnCell中:
begin
if dbgrid1.datasource.dataset.fieldbyname('delete').asboolean then
Canvas.Brush.Color := clRed
else
Canvas.Brush.Color := clWhite;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
 
谢谢大家的帮助,不过DBGrid1DrawColumnCell中
是不起作用的,因为:
DefaultDrawColumnCell(Rect, DataCol, Column, State);
不对当前行起作用,EYES的方法,等我回去试着看.
另请大家注意,我要的是当前记录行,所以,情况就复杂起来,
小天的方法,我好象试过,不行,
谢谢大家,希望大家继续帮忙!!
 
我的意思是用Dl记载要删除的记录,譬如3、7、12、...;滚动时会自动重画,这样3
、7、12、...等各记录会显示成红色。如果最后要真正删除记录,就可按Dl中的记录
号处理。
 
Another_eYes的方法不错,
不过选中的记录的颜色只能是缺省的蓝色
有没有办法修改颜色?
 
啊,是有问题!忘了考虑选中的当前记录
DBGrid1DrawColumnCell中:
begin
if not (gdSelected in State) then
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
不是当前记录
begin
if dbgrid1.datasource.dataset.fieldbyname('delete').asboolean then
Canvas.Brush.Color := clRed
else
Canvas.Brush.Color := clWhite;
end
else
Canvas.Brush.Color := clGreen;
//选中的记录的颜色是green
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
 
to churchill:
你的方法原来是记录数据集中的记录的特征(比如唯一索引的值,记录在表中的recno),是这意思吧?
to lhxu:
if not (gdSelected in State) then
Canvas.Brush.Color := clWhite;
else
Canvas.Brush.Color := clGreen;//选中的记录的颜色是green
DefaultDrawColumnCell(Rect, DataCol, Column, State);
 
如果仅仅是改变当前行的颜色,可如此:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables;

type
TCustomDBGridCracker = class(TCustomDBGrid);

TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;


implementation

{$R *.DFM}

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with TCustomDBGridCracker(Sender) do
begin
if DataLink.ActiveRecord = Row - 1 then
Canvas.Brush.Color := clRed
else
Canvas.Brush.Color := clWhite;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;

end.

~~~~~~~~~~~~~~~~~~~~~~~~~~
to fx:
我是把要删除的行的记录号放在Dl中.
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
748
import
I
后退
顶部