delphi 更改stringgrid单元格所在行的字体颜色
答案:2 悬赏:30 手机版
解决时间 2021-01-29 03:50
- 提问者网友:骨子里的高雅
- 2021-01-28 04:53
因为某种需要,只能用stringgrid,用于显示数据库中的数据,当某单元格的值在数据库中存在时候如何更改此单元格所在行的字体颜色?
最佳答案
- 五星知识达人网友:不如潦草
- 2021-01-28 06:21
由于TStringGrid没有并没有提供类似的方法.所以只能自己画了.
以下代码 是假定 有一个名称为 Form2 的窗体 上面放着 一个名称为 sGrid的TStringGrid:
以下代码实现了这个StringGrid的OnDrawCell事件
procedure TForm2.sGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
TheGrid: TStringGrid; CellText: string;
begin
if not (ARow = 1) then Exit; //如果不满足条件,条件由你自行确定
TheGrid := Sender as TStringGrid; //强制类型转换Sender,可以让多个StringGrid来使用这个函数
with TheGrid.Canvas do
begin
//如果单元格被中了则绘制高亮否则,则绘制指定的颜色
if gdSelected in State then
begin
Brush.Color := clHighlight; Font.Color := clHighlightText;
end
else
begin
Brush.Color := clWindow; Font.Color := clRed; //这里是你需要设置的颜色,暂时这只为红色
end;
if gdFixed in State then
begin
Brush.Color := clBtnFace;
end;
FillRect(Rect); //代替原始内容,并绘制背景
CellText := TheGrid.Rows[ARow][ACol]; //获取单元格文字
Inc(Rect.Left,2); //让文本区域左缩进2像素
//利用Windows API函数绘制文本
DrawText(Handle,PChar(CellText),Length(CellText),Rect,
DT_LEFT or DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS);
end;
end;
以下代码 是假定 有一个名称为 Form2 的窗体 上面放着 一个名称为 sGrid的TStringGrid:
以下代码实现了这个StringGrid的OnDrawCell事件
procedure TForm2.sGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
TheGrid: TStringGrid; CellText: string;
begin
if not (ARow = 1) then Exit; //如果不满足条件,条件由你自行确定
TheGrid := Sender as TStringGrid; //强制类型转换Sender,可以让多个StringGrid来使用这个函数
with TheGrid.Canvas do
begin
//如果单元格被中了则绘制高亮否则,则绘制指定的颜色
if gdSelected in State then
begin
Brush.Color := clHighlight; Font.Color := clHighlightText;
end
else
begin
Brush.Color := clWindow; Font.Color := clRed; //这里是你需要设置的颜色,暂时这只为红色
end;
if gdFixed in State then
begin
Brush.Color := clBtnFace;
end;
FillRect(Rect); //代替原始内容,并绘制背景
CellText := TheGrid.Rows[ARow][ACol]; //获取单元格文字
Inc(Rect.Left,2); //让文本区域左缩进2像素
//利用Windows API函数绘制文本
DrawText(Handle,PChar(CellText),Length(CellText),Rect,
DT_LEFT or DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS);
end;
end;
全部回答
- 1楼网友:动情书生
- 2021-01-28 07:17
完整的程序源码: 您拷贝就可以运行: unit unit1; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, grids; type tform1 = class(tform) stringgrid1: tstringgrid; procedure stringgrid1drawcell(sender: tobject; acol, arow: integer; rect: trect; state: tgriddrawstate); procedure formcreate(sender: tobject); private { private declarations } public { public declarations } end; var form1: tform1; implementation {$r *.dfm} procedure tform1.stringgrid1drawcell(sender: tobject; acol, arow: integer; rect: trect; state: tgriddrawstate); begin with stringgrid1 do if cells[acol,arow] = '1233' then begin canvas.font.color := clred; //字体颜色为红的 canvas.brush.color:=clmoneygreen; //背景为 美元绿色 canvas.fillrect(rect); canvas.textout(rect.left+2,rect.top+2,cells[acol,arow]); end; end; procedure tform1.formcreate(sender: tobject); begin with stringgrid1 do begin rowcount :=5;//设置5行 colcount :=5;//设置5列 cells[1,2]:='1233'; cells[2,2]:='1233'; cells[2,4]:='1233'; end; end; end. ----------------------------------------------------- 关键是drawcell事件,在这个事件中可以设字体名、大小、颜色、字体装饰、cell背景画布等 ---------------------------------------------------
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯