TStringGrid控件非常好用,俺一直用它的父类TDrawGrid,完成许多TListView无法完成的功能。
除了滚动条的问题,其它基本上算得上完美。俺看了源码,发现它处理滚动条的机制很山寨,还需要自己写代码完善。
滚动条的BUG有如下几个:
1.不能根据数据的多少改变滚动条块的大小。
这个问题虽然可以用SetScrollInf设置,但是有一点,Grid的Row是可以自由设置高度的,代码还需要改进:
var
info: TScrollInfo;
begin
fillchar(info, sizeof(info), 0);
with info do
begin
cbsize := sizeof(info);
fmask := SIF_ALL;
GetScrollInfo( TheGrid.handle, SB_VERT, info );
fmask := fmask or SIF_PAGE;
nPage := 5 * (nmax-nmin) div TheGrid.RowCount;
//whatever number of cells you consider a 'page'
end;
setscrollinfo(TheGrid.handle, SB_VERT, info, TRUE);
end;2.将Grid.Option中的goRowSelect选中,会出现另外的BUG,如Col过多时,浏览时,将水平滚动条移到最末,然后再往下滚动时,水平滚动条会自动移到最前面,这个问题很烦人。不知道大家有没有好的办法解决
除了滚动条的问题,其它基本上算得上完美。俺看了源码,发现它处理滚动条的机制很山寨,还需要自己写代码完善。
滚动条的BUG有如下几个:
1.不能根据数据的多少改变滚动条块的大小。
这个问题虽然可以用SetScrollInf设置,但是有一点,Grid的Row是可以自由设置高度的,代码还需要改进:
var
info: TScrollInfo;
begin
fillchar(info, sizeof(info), 0);
with info do
begin
cbsize := sizeof(info);
fmask := SIF_ALL;
GetScrollInfo( TheGrid.handle, SB_VERT, info );
fmask := fmask or SIF_PAGE;
nPage := 5 * (nmax-nmin) div TheGrid.RowCount;
//whatever number of cells you consider a 'page'
end;
setscrollinfo(TheGrid.handle, SB_VERT, info, TRUE);
end;2.将Grid.Option中的goRowSelect选中,会出现另外的BUG,如Col过多时,浏览时,将水平滚动条移到最末,然后再往下滚动时,水平滚动条会自动移到最前面,这个问题很烦人。不知道大家有没有好的办法解决
解决方案 »
- Animate播放完毕触发的事件是什么?
- 我想把TDateTimePicker改成和TEDIT一样的FLAT效果,怎么也搞不定……你行吗
- 不好意思问一个简单问题:Str[i] >= #160是什么意思???
- 怎样得到.禁止控件的句柄?????????????
- delphi初识
- 大哥们,帮帮我吧,我都要急死了
- 怎样在三层体系中使用ADO组件,TDatasetProvider,TClientDataset同时更新多个数据表?
- 急!吐血大送分!怎样操作TADOQuery+Access2000中的备注字段?(80分相送,来者有份)
- 如何在RichEdit上加背景图片??
- 看不懂: 如何修改一个只读的query结果集!
- AnsiString的一个疑问,简答,大家一起来讨论
- 数据库存储图片路径,各client能显示,请问大家有什么好方案上传图片?
第二个问题,我想到一个笨办法,不知是不是可行,用StringGrid.Row判断行数,如果当前行是最后一行,移动之后判断是否是第一行,如果是第一行就返回最后一行……不过如果别人向上翻到第一行也会出现这种效果……不好判断
ARow: Integer; var CanSelect: Boolean);
begin
sel:=true;
end;procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
begin
if sel then
begin
sel:=false;
stringgrid1.LeftCol:=LeftColumn;
exit;
end;
if stringgrid1.Row=previous_Row then
LeftColumn:=stringgrid1.LeftCol
else
previous_Row:=stringgrid1.Row;end;
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP