谢谢!

解决方案 »

  1.   

    StringGrid.ver----.postion
    好像是这样的俺回头看看
      

  2.   

    在StringGrid中怎么没见有ver----.postion???
      

  3.   

    能不能用StringGrid.col(或是.cel我忘了)的值试一试,
    用一个变量进行记录,
    var i:integer;
    i:=1;
    在事件onAfterScroll()
    begin
      改变的值:=StringGrid.col-i;
      i:=StringGrid.col;
    end;
      

  4.   

    楼上的,我怎么没见到有onAfterScroll()
      

  5.   

    int GetScrollPos(    HWND hWnd, // handle of window with scroll bar
        int nBar  // scroll bar flags
       );
    两次取得的位置比较一下就可以了!
      

  6.   

    var
      P1,P2:integer;
    begin
      P1:=GetScrollPos(StringGrid1.Handle, SB_VERT);//取垂直滚动条的位置
      //..........发生滚动事件..............
      P2:=GetScrollPos(StringGrid1.Handle, SB_VERT);
      ShowMessage(IntToStr(P2-P1));//这个就是滚动的位置
    end;
      

  7.   

    控制滚动的事件是TopLeftChanged吗?
    但是我怎么能够获取滚动对应的Stringgrid的列呢?
    即水平滑块向左或向右移动后,上面的列有多少同时向左或向右消失掉了呢?
      

  8.   

    TopLeftChanged是每当你的StringGrid的列或行发生滚动时触发的。随便作了一个例子你看看可以计算列滚动了多少。不过在滚动之前你要单击一下bitbtn1,滚动完成以后要单击一下bitbtn2就可以显示出列滚动的数值了。
    var
      Form1: TForm1;
      OldRow,NewRow,HasScrolled:integer;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      i,j:integer;
    begin
      for i:=0 to 1000 do
      begin
        if StringGrid1.ColCount<i  then
          StringGrid1.ColCount:=StringGrid1.ColCount+1;
        for j:=0 to 4  do
          StringGrid1.Cells[i,j]:=IntToStr(Random(100));
      end;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin //取出滚动之前的列位置
      HasScrolled:=0;
      OldRow:=GetScrollPos(StringGrid1.Handle,SB_HORZ);
    end;procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
    begin
      NewRow:=GetScrollPos(StringGrid1.Handle,SB_HORZ);
      If NewRow<>OldRow then
      begin //如果是列滚动的话
        if NewRow>OldRow then
          Inc(HasScrolled)
        else
          Dec(HasScrolled);
        OldRow:=NewRow;
      end;
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    begin//显示出滚动了的位置
      ShowMessage('The column has scrolled:'+IntToStr(HasScrolled));
    end;
      

  9.   

    blazingfire(烈焰) 
    感谢帮助,
    但是有点问题,我点滚动条右边的箭头,明明向左移了一列,但是却捕获不到,
      

  10.   

    回去我看了一下SDK方面的书又通过机器验证了一下。是这样的,在Windows中
    默认StringGrid的滚动条的最大值为127,最小值为0(这个如果你不信可以用一
    个API GetScrollRange设断点跟踪来看一看)。这样,你就应该知道问题
    所在了,我们的StringGrid的列数是从0到1000。也就是说ScrollBar的一个位
    置就对应不了StringGrid的每一列,所以你点击StringGrid滚动条发生滚动后
    再用API GetScrollPos就不能每次都可以取到不同的Position值了。听到这你
    可能点失望了吧,不过没有关系,当你的StringGrid的列数小于或邻近127时我
    给你的那段代码都是有效的。至于远大于127的情况,那我也只有帮你关注一
    下了,希望对SDK有极高造化的大侠能帮一帮你了。祝好运!:)
    另外告诉你一个好消息,有一个SDK函数为SetScrollRange可以改变滚动条的最
    大和最小值,不过我还没有搞懂。你可以去研究一下吧
      

  11.   

    虽然还是有点问题,不过还是要
    感谢大家的帮忙!
    特别是blazingfire(烈焰) ,thank you!