开发工具:BCB 6.0
TStringGrid是BCB 6.0的一个控件,开发中经常用于显示数据查询结果,但是其本身不支持插入、删除操作,需要开发者自己实现。
最简单的实现思路:
1.插入时,把插入行后边的行都往下移一行,总行数+1
2.删除时,把删除行后边的行都往上移一行,总行数-1
明显,最坏情况下,每一次插入或删除操作的时间复杂度都是o(n)的,对于只有几百行数据的情况,没什么问题,但是对于有几十万行数据的情况,软件很可能会卡。

有什么改进方法吗?google了好几次之后,我找到了一个Stack Overflow的帖子:
https://stackoverflow.com/questions/8095931/emptying-string-grid-in-delphi
里边的这段话给了我提示:
The fastest way to use a TStringGrid is using OnGetValue/OnSetValue.
This way only the t e x t of visible cells are requested dynamically.
Adding and removing rows is then lighting fast, otherwise
TStringGrid is very slooow when you have more than 5000 records.
This way I can fill and clear a grid with 700.000 records within a second!
实现思路是:自己实现一个数据结构来管理数据,然后在TStringGrid的OnDrawCell事件中动态获取对应单元格的文本,再画到对应位置。
数据结构提供3个接口:
1.在第i行插入数据的接口
2.删除第i行数据的接口
3.查第i行数据的接口
使用修改后的AVL树这3个接口都可以做到o(log(n)),于是完美解决问题。

封装了一个控件,仅供参考:
http://www.pudn.com/Download/item/id/3434311.html

关键词:数据结构在软件开发中的应用、OnDrawCell事件的妙用

09-04 00:58