老软件工程师都被卡住了,相当有难度的Delphi的DBGrid有关问题

老程序员都被卡住了,相当有难度的Delphi的DBGrid问题
老软件工程师都被卡住了,相当有难度的Delphi的DBGrid有关问题

遇到个客户,要求在grid报表里面划连接线,还找了个类似图给我看,就是上图。我在DBGrid里面找了半天也没有找有相应的事件,后来又考虑用dbgrideh或是DBAdvGrid或是AdvStringGrid,都没有找到办法,有办法的员友们给我支支招,感谢了。
------解决思路----------------------
1.override draw cell 的方法,绘图红底圆白底字。
2.override paint方法,在下面写绘制连线的代码。
------解决思路----------------------
引用:
感谢各位的回复,这个必须要用Grid的,因为它就像一个excel表格一样,有几千行十多列的数据,所以只能用grid来装。

二楼“frank_lee_cn”说法的用override paint是可以划静态的线,也就是固定位置不动的线,如:MoveTo(100,100);LineTo(200,200);这样子的,但是当上下滚动滚动条时,它依然只是划这个位置100,100的线,不会随着单元格上下变动,所以我觉得要让划线跟随着动,那线两头的位置肯定要依据单元格的位置来定,{可以通过Grid控件的TopRow;LeftCol;CellRect;等属性/方法取得你需要画线的坐标,然后在Canvas上画出来}所以就变成了要获取Grid显示界面里,显示的是从第几列到第几列,哪行到哪行。比如当前的Grid显示的从第2列到第7列,从第100行显示150行。那我就可以通过循环获取每个Cell里面的数据,然后因为行高和列宽都是固定的,就可以用paint划线了。

所以如何获取当前Grid里面显示了多少cell成了问题的关键,当gird随着窗体的放大,或是滚动后,都能时时的获取,那就可以时时的来划线了。还有一个小问题,随着Grid的滚动如何清除前一步才划的线,然后再划新的线,这样线就可以随数据的滚动而变化了,不是划死了的。

------解决思路----------------------
引用:
1.override draw cell 的方法,绘图红底圆白底字。
2.override paint方法,在下面写绘制连线的代码。


这个方法可行。 DBGrid 是从TCustomControl继承过来的。 覆盖Paint方法, 在最后面加上画连接线的代码
------解决思路----------------------
引用:
感谢各位的回复,这个必须要用Grid的,因为它就像一个excel表格一样,有几千行十多列的数据,所以只能用grid来装。

二楼“frank_lee_cn”说法的用override paint是可以划静态的线,也就是固定位置不动的线,如:MoveTo(100,100);LineTo(200,200);这样子的,但是当上下滚动滚动条时,它依然只是划这个位置100,100的线,不会随着单元格上下变动,所以我觉得要让划线跟随着动,那线两头的位置肯定要依据单元格的位置来定,所以就变成了要获取Grid显示界面里,显示的是从第几列到第几列,哪行到哪行。比如当前的Grid显示的从第2列到第7列,从第100行显示150行。那我就可以通过循环获取每个Cell里面的数据,然后因为行高和列宽都是固定的,就可以用paint划线了。

所以如何获取当前Grid里面显示了多少cell成了问题的关键,当gird随着窗体的放大,或是滚动后,都能时时的获取,那就可以时时的来划线了。还有一个小问题,随着Grid的滚动如何清除前一步才划的线,然后再划新的线,这样线就可以随数据的滚动而变化了,不是划死了的。

每次绘制时,按你既定规则定位指定内容所在Cell位置,并按行顺序依次记录。

事实上控件基类TCustomGrid已经有提供VisibleRowCount表明当前网格可见记录数,以及 TopRow表示可视区域第一条的记录行号。
TopRow的基类中位于protected保护域中,但仍然有办法访问的。

结合上面两个属性,可以将处理内容缩小到可视区域,绘制效率也比较高。