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

解决方案 »

  1.   

    个人觉得第一个可以把TStringGrid放到TPanel当中,或者用TsrollBox代替,不过如果你的想法是只改源代码的话,那这种方法就不可行了
    第二个问题,我想到一个笨办法,不知是不是可行,用StringGrid.Row判断行数,如果当前行是最后一行,移动之后判断是否是第一行,如果是第一行就返回最后一行……不过如果别人向上翻到第一行也会出现这种效果……不好判断
      

  2.   

    Grid的Row是可以自由设置高度的,比如第1行高度我设置为10,第2行高度我设置为100,咋办,呵呵
      

  3.   

    推荐看一下businessskinform里面的drawgrid,或许有帮助
      

  4.   

    第二个问题,好像解决了,试试procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      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;
      

  5.   

    http://www.schsky.com/bbs/?fromuid=2735
      

  6.   

    http://www.schsky.com/bbs/?fromuser=jackal_lin
      

  7.   

    Grid的Row是可以自由设置高度的,比如第1行高度我设置为10,第2行高度我设置为100,咋办,呵呵 
     
     
    对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP  
      

  8.   

    http://blog.csdn.net/laocui172/article/details/6684245