frmlook.strgrdbeformodify.Canvas.FillRect(frmlook.strgrdbeformodify.CellRect(i+1,k));
frmlook.strgrdbeformodify.Canvas.Brush.Color:=clred;
frmlook.strgrdbeformodify.Canvas.Font.Color:=clred ;
frmlook.strgrdbeformodify.Cells[i+1,k] := nodeList[i].NodeValue;
frmlook.strgrdbeformodify.Canvas.TextOut(frmlook.strgrdbeformodify.CellRect(i+1,k).Left,frmlook.strgrdbeformodify.CellRect(i+1,k).Top,frmlook.strgrdbeformodify.cells[i+1,k]);
以上是我的代码.我这样设置了,为什么逐步调试的时候是可以的,当全部调试完后又还原了,没有颜色了.
我在论坛上也看到了些类似问题的解答,似乎都是千遍一律的如下:
type   
      TStringGridEx   =   class(TStringGrid);   
    
  procedure   TForm1.StringGrid1DrawCell(Sender:   TObject;   ACol,   ARow:   Integer;   
      Rect:   TRect;   State:   TGridDrawState);   
  begin   
      if   not   ((ACol   =   2)   and   (ARow   =   2))   then   Exit;   
      TStringGridEx(Sender).OnDrawCell   :=   nil;   
      try   
          TStringGridEx(Sender).Canvas.Font.Color   :=   clRed;   
          TStringGridEx(Sender).Canvas.Brush.Color   :=   clYellow;   
          TStringGridEx(Sender).Canvas.Font.Name   :=   '黑体';   
          TStringGridEx(Sender).Canvas.Font.Size   :=   16;   
          TStringGridEx(Sender).DrawCell(ACol,   ARow,   Rect,   State);   
      finally   
          TStringGridEx(Sender).OnDrawCell   :=   StringGrid1DrawCell;   
      end;   
  end;
可我要设置的是不确定的单元格我是要根据对比后显示不同的数据颜色,因此至于那个单元格是不确定的,而他这是固定的.

解决方案 »

  1.   

    将ACol,ARow的值设为变量,在两个edit中输入,
      

  2.   

    参考代码procedure TForm1.Button11Click(Sender: TObject);
    var
      i,j,m,n:Integer;
      s:string;
      rect:TRect;
    begin
      i:=self.StringGrid1.RowCount;
      m:=self.StringGrid1.ColCount;
      for j:=1 to i-1 do
      begin
        for n:=1 to m do
        begin
          rect:=self.StringGrid1.CellRect(n,j);
          s:=self.StringGrid1.Cells[n,j];
          if s='√' then
          begin
            self.StringGrid1.Canvas.Font.Color:=clBlue
          end
          else
            self.StringGrid1.Canvas.Font.Color:=clRed;
          Self.StringGrid1.Canvas.TextOut(rect.Left+1,rect.Top+1,s);
        end;
      end;
    end;
      

  3.   


    if  not  ((ACol  =  2)  and  (ARow  =  2))  then  Exit;
    将上面的改为
    if  not  ((ACol  =  StringGrid1.Col)  and  (ARow  =  StringGrid1.Row))  then  Exit;
    这样就判断当前StringGrid1选中大单元格,然你可以继续加进一些判断
      

  4.   

    加上一句StringGrid1.Canvas.FillRect(Rect);  
      

  5.   

    你这样虽然能改变字体的颜色,但是不够灵活啊,我的意思是这样的,从数据库中读取一些记录集到stringgrid组件中,然后修改,保存,之后查询出来与未改之前的进行对比,如果改变的地方就用红色标注,所以我并不能确定哪个单元格要设置的,我原来是设置了两个全局变量,var Acol,Aro:string;
    在下面的事件中写代码如下:
    procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
    Rect: TRect; State: TGridDrawState);
    begin
    with (Sender as TStringGrid) do
       if not (ACol=Acol) and (ARow=Aro) then//你要改变的单元格
       begin
          Canvas.FillRect(Rect);
          Canvas.Font.Color:=clred;//字体颜色
           Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
       end;
    end;这样设置改变最后一个改变的字段的颜色,这是何解?
      

  6.   

    把你的对比放到StringGrid1DrawCell函数里去。。
      

  7.   

    如果是这样,首先你要得出所有改变的单元格,将其放到一个stringlist中,变量名为vg_cells,存放格式为[col][row]
    procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
    var
      i:integer;
    begin 
      i:=self.vg_cells.index('['+inttostr(acol)+']['+inttostr(arow)+']')
      if i>=0 then//属于内容改变的单元格
      begin 
         Canvas.FillRect(Rect); 
         Canvas.Font.Color:=clred;//字体颜色 
          Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]); 
      end; 
    end; 
      

  8.   

    如果你要对比两个StringGrid,那么你就用2个StringGrid,一个是改过的,另一个是查询出来的。你可以隐藏其中一个(如果必要的话)至于怎么用不同的颜色标示出值得差异,只要对比2个Grid相同位置的值是否相同就可以了,如果不同,设置颜色。(我想,两个Grid行列应该相同吧?否则怎么对比?)
      

  9.   


    你用一个二维数组来模拟Grid,把对比的结果保存在数组中,后然在StringGrid1DrawCell函数中改变字体
      

  10.   

    为什么逐步调试的时候是可以的,当全部调试完后又还原了,没有颜色了. 估计是这样,当全部调试完后,stringGrid控件又重新画了下。你需要处理OnDrawCell事件
      

  11.   

    这段代码用过很多次了,怎么没有出现你这种状况呢?
    跟踪一下ACol,ARo
    还有你的Acol和DrawCell事件中的参数ACol重名了哦