VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2855|回复: 17

stringGrid闪烁的问题

[复制链接]

2

主题

9

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-3-13 20:00:01 | 显示全部楼层 |阅读模式
我在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;
回复

使用道具 举报

0

主题

53

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-6-11 01:45:01 | 显示全部楼层
你的代码写的有问题,在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]);
回复

使用道具 举报

0

主题

14

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-6-12 15:15:01 | 显示全部楼层
对每行的颜色做个保存,当你发现相同时,就不用重画,直接退出,这样就不会闪烁了.
回复

使用道具 举报

2

主题

9

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-6-13 20:45:01 | 显示全部楼层
stevevai:
   因为我这个stringGrid列数有120行,30列,但最多能显示20行12列,其他行列要要移动滚动条才能看到.但是这个Drawcell里面的ACOL这个能数最大值也是最多能显示的列即12列,用你的方法是不会有闪烁的现象,但是当移动单元或者滚动条时,那些颜色就显示得不正常了.所以我才想出了这个笨方法.可否帮忙解决一下.
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-6-14 15:15:01 | 显示全部楼层
你把刷新的控制坐在滚动调停止滚动时刷新 试一试
回复

使用道具 举报

2

主题

9

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-6-16 08:00:01 | 显示全部楼层
to njmumu :

  但是我第一次加载窗体的时候就已经有一些闪烁了呀.
回复

使用道具 举报

0

主题

53

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-6-16 10:30:01 | 显示全部楼层
Arow能够判断出自己处于第几行,所以无论是否有滚动条,你用Arow就可以来完成你需要的功能。你说的问题我没碰到过,你稍等我帮你测试一下,
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-6-17 23:15:01 | 显示全部楼层
这个问题我碰到过:
但是当移动单元或者滚动条时,那些颜色就显示得不正常了,你在stringGrid的TopLeftChanged方法中加入一下代码:
    stringGrid.Enabled = false;
    stringGrid.Refresh;
    stringGrid.Enabled = true;
    stringGrid.SetFocus;
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-6-18 21:30:01 | 显示全部楼层
stringGrid的Drawcell只是画了显示的部分,当移动单元或者滚动条时stringGrid画的还是以前的显示的部分,所以导致颜色不正常,移动单元或者滚动条时可以触发TopLeftChanged事件,在TopLeftChanged事件中强制刷新就可以解决。
回复

使用道具 举报

0

主题

53

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-6-19 00:30:01 | 显示全部楼层
测试完毕,这是你代码算法的问题 ,我给你看看我的代码吧:
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;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表