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过多时,浏览时,将水平滚动条移到最末,然后再往下滚动时,水平滚动条会自动移到最前面,这个问题很烦人。不知道大家有没有好的办法解决
第二个问题,我想到一个笨办法,不知是不是可行,用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