我在stringGrid 的 drawcell事件里有如下代码,大概意思是每个四行交替变换颜色,
由于格子比较多,当stringGrid里的滚动条发生变化时,那些格子闪烁得很厉害,请问该如何解决呀.
代码如下:
var
  i,j: integer;
  rect: TRect;
begin
  with stringGrid do
  begin
    for i:= 1 to RowCount do
      for j:=1 to ColCount do
      begin
        case ch of
          True: begin
                  Canvas.Brush.Color :=clSkyBlue;// ClBlue;
                  if (i mod 4 = 0) and (j=ColCount)   then
                    if (i div 4) mod 2 =0 then
                      ch := False;
                end;
         False: begin
                 Canvas.Brush.Color :=clWindow;
                 if (i mod 4 = 0) and (j= ColCount)   then
                   if (i div 4) mod 2 =1 then
                   begin
                     ch := True;
                   end ;
            end;
         end;
            rect:= CellRect(j,i);
            Canvas.FillRect(rect);
            Canvas.font.color:=ClBlack;
            Canvas.TextOut(rect.left , rect.top, Cells[j, i]);
    end;
  end;
end;

解决方案 »

  1.   

    你的代码写的有问题,在Drawcell事件的时候,就是在绘制每个单元格触发的事件
    你想想你的代码是不是很失败!
    把循环去掉,直接用参数Arow,Acol 这两个参数分别表示当前绘制的行和列,
    说说你代码的问题,
    1、Rect在事件中已经存在这样的参数,你怎么还在上面定义的呢
    2、循环去掉
    3、绘制单元格这样写吧 把这句改一下:
       Canvas.TextOut(rect.left , rect.top, Cells[j, i]);
       改为:
       Canvas.TextRect(Rect,Rect.left,Rect.top,Cells[Acol,Arow]);
      

  2.   

    winxkm(蹩脚的程序员):
       因为我这个stringGrid列数有120行,30列,但最多能显示20行12列,其他行列要要移动滚动条才能看到.但是这个Drawcell里面的ACOL这个能数最大值也是最多能显示的列即12列,用你的方法是不会有闪烁的现象,但是当移动单元或者滚动条时,那些颜色就显示得不正常了.所以我才想出了这个笨方法.可否帮忙解决一下.
      

  3.   

    to yi10000() :  但是我第一次加载窗体的时候就已经有一些闪烁了呀.
      

  4.   

    Arow能够判断出自己处于第几行,所以无论是否有滚动条,你用Arow就可以来完成你需要的功能。你说的问题我没碰到过,你稍等我帮你测试一下,
      

  5.   

    这个问题我碰到过:
    但是当移动单元或者滚动条时,那些颜色就显示得不正常了,你在stringGrid的TopLeftChanged方法中加入一下代码:
        stringGrid.Enabled = false;
        stringGrid.Refresh;
        stringGrid.Enabled = true;
        stringGrid.SetFocus;
      

  6.   

    stringGrid的Drawcell只是画了显示的部分,当移动单元或者滚动条时stringGrid画的还是以前的显示的部分,所以导致颜色不正常,移动单元或者滚动条时可以触发TopLeftChanged事件,在TopLeftChanged事件中强制刷新就可以解决。
      

  7.   

    测试完毕,这是你代码算法的问题 ,我给你看看我的代码吧:
     with self.StringGrid1 do
         begin
              if ((Arow div 4) mod 2)=0 then
                 canvas.Brush.Color:=clSkyBlue
              else
                 canvas.Brush.Color:=clred;// ClBlue;          Canvas.font.color:=Clblue;
              Canvas.TextRect(Rect,Rect.left,Rect.top,Cells[Acol,Arow]);
         end;
      

  8.   

    TO: yygang(yygang)  照你的方法,还是会有问题的.
      

  9.   

    楼上的没有考虑当StringGrid行列超过界面的显示的情况,你代码没有问题。你用100行测试用一下滚动条就知道。
      

  10.   

    什么问题?解决闪烁的方法winxkm(蹩脚的程序员) 已经说得很清楚。
      

  11.   

    呵呵 我就是用的你说得12列120行在测试,有滚动AOtiao
      

  12.   

    我说得是解决 “但是当移动单元或者滚动条时,那些颜色就显示得不正常了”的方法,其他的问题参照 winxkm(蹩脚的程序员)  代码。
      

  13.   

    非常感谢winxkm(蹩脚的程序员):
      看了你的代码,恍然大悟啊!!!
      不愧是五星级的.