stringgrid怎样根据值指定某个单元格的颜色?

aiq 2009-09-23 09:15:13
情况如下,5*5的表格,我使用数据库里的数据进行填充,表有两个字段 a和b

1、我通过循环加载数据,表格显示的内容是a,单元格的颜色通过b来控制(b值有1、2、3三种情况),比如1用红色,2黄色,3灰色;

2、加载完后怎样改变指定单元的颜色(不固定),比如我点击一个按钮,得出col=3,row=3,我就想让(3,3)变成指定的颜色,如果得出col=3,row=2,我就让(3,2)变指定的颜色

...全文
231 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinoalex 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 aiq 的回复:]
好了,谢谢关键是用了sg1.Cols[ACol].Objects[ARow],这个是什么意思

比如我点击一个按钮,得出col=3,row=3,我就想让(3,3)变成指定的颜色,如果得出col=3,row=2,我就让(3,2)变指定的颜色,这个怎么结局
[/Quote]

设两个全局变量,即特定的位置 CC,CR

画时就判断 if ACol = CC and ARow = CR then ..

BUTTON执行时
CC:= 3;
CR:= 3;
stringgrid.refresh;
aiq 2009-09-23
  • 打赏
  • 举报
回复
好了,谢谢关键是用了sg1.Cols[ACol].Objects[ARow],这个是什么意思

比如我点击一个按钮,得出col=3,row=3,我就想让(3,3)变成指定的颜色,如果得出col=3,row=2,我就让(3,2)变指定的颜色,这个怎么结局
wzzwwz 2009-09-23
  • 打赏
  • 举报
回复
根据自己的需要灵活改变

procedure TForm3.btn1Click(Sender: TObject);
var
ACol, ARow: Integer;
begin
Randomize;
for ACol := 0 to sg1.ColCount - 1 do
for ARow := 0 to sg1.RowCount - 1 do
begin
{ 等号后面换上你的A字段 }
sg1.Cells[ACol, ARow] := IntToStr(GetTickCount);
{ 等号后面换上你的B字段 }
sg1.Cols[ACol].Objects[ARow] := TObject(Random(2) + 1);
end;
end;

procedure TForm3.sg1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
AColor: TColor;
ARect: TRect;
begin
with TStringGrid(Sender) do
begin
case Integer(Cols[ACol].Objects[ARow]) of
1: AColor := clYellow;
2: AColor := clRed;
3: AColor := clBlue;
else AColor := Color;
end;
Canvas.Brush.Color := AColor;
Canvas.FillRect(Rect);

ARect := Rect;
DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, ARECT,
DT_SINGLELINE or DT_VCENTER);
end;
end;
阿三 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 aiq 的回复:]
说的都简单,俺就是不会判读
[/Quote]
你的表中的字段A的值都有什么?
aiq 2009-09-23
  • 打赏
  • 举报
回复
字符,
wzzwwz 2009-09-23
  • 打赏
  • 举报
回复
你那个B字段是数字类型吗
aiq 2009-09-23
  • 打赏
  • 举报
回复
说的都简单,俺就是不会判读
wzzwwz 2009-09-23
  • 打赏
  • 举报
回复
如果A和B有联系就在Draw里通过A定位adoquery,然后读和A配套的B,像绕口令吗
如果query中数据的位置和sg中数据的位置匹配。也可以通过判断draw事件中当前单元格的位置来定位query以获得配套的b值
阿三 2009-09-23
  • 打赏
  • 举报
回复
像BDMH中
if StringGrid1.Cells[ACol,ARow] = '1' then
的不就是根据adoquery1.fieldbyname('b').asstring值来进行判断的吗,
StringGrid1.Cells[i,j]:=adoquery1.fieldbyname('a').AsString;这不就是给stringgrid赋值吗?
具体的,你要根据你的值去找个规律,然后来进行处理
if StrGrid1.Cells[i,j]='' then
begin
....
end;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextRect(Rect,Rect.Left+5,Rect.Top+(Rect.Bottom-Rect.Top-
Canvas.TextHeight(StringGrid1.Cells[ACol,ARow])) div 2,StringGrid1.Cells[ACol,ARow]);
bdmh 2009-09-23
  • 打赏
  • 举报
回复
万变不离其中,就是这么处理,自己根据具体情况修改吧
aiq 2009-09-23
  • 打赏
  • 举报
回复
那就在draw事件里判断字段B的值

就是想问,怎么判断的

比如我在一个按钮下加载数据

procedure TForm1.Button2Click(Sender: TObject);
var
li_col,li_row:integer;
i,j,li_count:integer;
begin
li_row=5;
li_col=5;

adoquery1.First;
for j:=0 to li_row - 1 do
begin
FOR i:=0 to li_col -1 do
begin
StringGrid1.Cells[i,j]:=adoquery1.fieldbyname('a').AsString;
adoquery1.Next;
end;
end;
end;

在draw中我这样用adoquery1.fieldbyname('b').AsString来控制颜色
wzzwwz 2009-09-23
  • 打赏
  • 举报
回复
那就在draw事件里判断字段A的值
改了控制颜色值之后重画StringGrid
aiq 2009-09-23
  • 打赏
  • 举报
回复
楼上,我显示的是字段a的值,颜色是根据123来判断的
StringGrid1.Cells[ACol,ARow]得出好像是a的值波
bdmh 2009-09-23
  • 打赏
  • 举报
回复
下面只是改变了单元格的颜色,你需要在把文字画出来,否则看不到文字

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if StringGrid1.Cells[ACol,ARow] = '1' then
begin
StringGrid1.Canvas.Brush.Color := clRed;
StringGrid1.Canvas.FillRect(Rect);
end
else if StringGrid1.Cells[ACol,ARow] = '2' then
begin
StringGrid1.Canvas.Brush.Color := clYellow;
StringGrid1.Canvas.FillRect(Rect);
end
else if StringGrid1.Cells[ACol,ARow] = '3' then
begin
StringGrid1.Canvas.Brush.Color := clBlue;
StringGrid1.Canvas.FillRect(Rect);
end;
end;
aiq 2009-09-23
  • 打赏
  • 举报
回复
谢谢楼上各位,
好像都没看明白我的要求
grace_zou 2009-09-23
  • 打赏
  • 举报
回复
if (StringGrid1.Cells[aCol,aRow])='3) and
(StringGrid1.Cells[aCol,aRow])='3') then
begin
stringgrid1.canvas.brush.color:=CLAQua;
stringgrid1.canvas.FillRect(rect);
stringGrid1.Canvas.textrect(Rect,Rect.left+1,Rect.Top+1,StringGrid1.Cells[aCol,aRow]);
end;
grace_zou 2009-09-23
  • 打赏
  • 举报
回复
只将文字变红:用下面一段程序,保你满意:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var Area:TRect;
begin
if ARow = 1 then
with StringGrid1,StringGrid1.Canvas do begin
FillRect(Rect);
Font.Color := clRed;
Area:= Rect;
InflateRect(Area, -2, -2);
DrawText(Handle, PChar(Cells[ACol, ARow]),Length(Cells[ACol, ARow]), Area, DT_CENTER);
end;
end;
grace_zou 2009-09-23
  • 打赏
  • 举报
回复
tempStr:=stringgrid1.Cells[ACol,ARow];
with stringgrid1.Canvas do
begin
StrHeight:=TextHeight(tempStr);
Brush.Color:=RGB(100,128,192);
FillRect(Rect);
Pen.Color:=RGB(192,192,192);
Pen.Width:=1;
Rectangle(Rect);
Font.Color:=RGB(0,0,200);
Font.Style:=[fsBold];
TextOut(Rect.Left+2,Rect.Top+(Rect.Bottom-Rect.Top-StrHeight) div 2,tempStr);
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧