情况如下,5*5的表格,我使用数据库里的数据进行填充,表有两个字段 a和b1、我通过循环加载数据,表格显示的内容是a,单元格的颜色通过b来控制(b值有1、2、3三种情况),比如1用红色,2黄色,3灰色;2、加载完后怎样改变指定单元的颜色(不固定),比如我点击一个按钮,得出col=3,row=3,我就想让(3,3)变成指定的颜色,如果得出col=3,row=2,我就让(3,2)变指定的颜色
调试欢乐多
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;
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;
(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;
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;
StringGrid1.Cells[ACol,ARow]得出好像是a的值波
改了控制颜色值之后重画StringGrid
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来控制颜色
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]);
如果query中数据的位置和sg中数据的位置匹配。也可以通过判断draw事件中当前单元格的位置来定位query以获得配套的b值
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;
设两个全局变量,即特定的位置 CC,CR画时就判断 if ACol = CC and ARow = CR then .. BUTTON执行时
CC:= 3;
CR:= 3;
stringgrid.refresh;