情况如下,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)变指定的颜色

解决方案 »

  1.   

    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;   
      

  2.   

    只将文字变红:用下面一段程序,保你满意:   
      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;
      

  3.   

    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;
      

  4.   

    下面只是改变了单元格的颜色,你需要在把文字画出来,否则看不到文字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;
      

  5.   

    楼上,我显示的是字段a的值,颜色是根据123来判断的
    StringGrid1.Cells[ACol,ARow]得出好像是a的值波
      

  6.   

    那就在draw事件里判断字段A的值
    改了控制颜色值之后重画StringGrid
      

  7.   

    那就在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来控制颜色
      

  8.   

    像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]);
      

  9.   

    如果A和B有联系就在Draw里通过A定位adoquery,然后读和A配套的B,像绕口令吗
    如果query中数据的位置和sg中数据的位置匹配。也可以通过判断draw事件中当前单元格的位置来定位query以获得配套的b值
      

  10.   

    根据自己的需要灵活改变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;
      

  11.   

    好了,谢谢关键是用了sg1.Cols[ACol].Objects[ARow],这个是什么意思比如我点击一个按钮,得出col=3,row=3,我就想让(3,3)变成指定的颜色,如果得出col=3,row=2,我就让(3,2)变指定的颜色,这个怎么结局
      

  12.   


    设两个全局变量,即特定的位置 CC,CR画时就判断 if ACol = CC and ARow = CR then .. BUTTON执行时 
    CC:= 3;
    CR:= 3;
    stringgrid.refresh;