收录日期:2019/12/16 12:52:41 时间:2016/06/07 20:54:58 标签:VCL组件使用和开发
dbgrid 默认的是一次滚动一个字段(列)宽度的距离,这样就有个问题:
当某个字段很长的时候,窗口界面显示不完这个字段,而滚动条滚动一下就跳到另一个字段去了,如何实现类似平滑滚动的功能?
看了一个源码,感觉很难实现.
up

还是看看Delphi中有关TDBGrid的源码吧。或许能够对你产生帮助。
没有办法。
up
其实不难,在Delphi中查找到DBGrid所在的stdctrl.pas源文件,之后查找有关水平滚动条和垂直滚动条滚动事件中的代码,正常,我们移动一个组件是平滑的,这是由于组件的Left或Top每次像素值加1,而Delphi中势必采用一种方法,使得每次水平移动的位置为Left加上单元格的RectWidth,垂直为Top加上单元格的RectHight。因此,只要找到它,并对其进行修改为1个像素的值,之后重新引用该头文件即可。
在Delphi中查找到DBGrid所在的stdctrl.pas源文件
====================================================
可我用的是BCB啊,找不到这个文件
邮箱,我将DBGrid.pas文件发给你。
workingroy@gmail.com
已送出!
谢谢蓝色!
我已经收到了。
正在看。
应该是这段吧?
先贴在这里,不会PASCALL,只能当英语读了。哪位有空就帮我改下,自己先研究。
//----------------------------------------------------------------------------------
procedure TCustomDBGrid.Scroll(Distance: Integer);
var
  OldRect, NewRect: TRect;
  RowHeight: Integer;
begin
  if not HandleAllocated then Exit;
  OldRect := BoxRect(0, Row, ColCount - 1, Row);
  if (FDataLink.ActiveRecord >= RowCount - FTitleOffset) then UpdateRowCount;
  UpdateScrollBar;
  UpdateActive;
  NewRect := BoxRect(0, Row, ColCount - 1, Row);
  ValidateRect(Handle, @OldRect);
  InvalidateRect(Handle, @OldRect, False);
  InvalidateRect(Handle, @NewRect, False);
  if Distance <> 0 then
  begin
    HideEditor;
    try
      if Abs(Distance) > VisibleRowCount then
      begin
        Invalidate;
        Exit;
      end
      else
      begin
        RowHeight := DefaultRowHeight;
        if dgRowLines in Options then Inc(RowHeight, GridLineWidth);
        if dgIndicator in Options then
        begin
          OldRect := BoxRect(0, FSelRow, ColCount - 1, FSelRow);
          InvalidateRect(Handle, @OldRect, False);
        end;
        NewRect := BoxRect(0, FTitleOffset, ColCount - 1, 1000);
        ScrollWindowEx(Handle, 0, -RowHeight * Distance, @NewRect, @NewRect,
          0, nil, SW_Invalidate);
        if dgIndicator in Options then
        begin
          NewRect := BoxRect(0, Row, ColCount - 1, Row);
          InvalidateRect(Handle, @NewRect, False);
        end;
      end;
    finally
      if dgAlwaysShowEditor in Options then ShowEditor;
    end;
  end;
  if UpdateLock = 0 then Update;
end;
====================================================================================

哈夫曼问题??100分只给能完全解答我问题的人!!! SQL2005还原的问题,很奇怪 datagridview 中改变行的位置 查询速度问题,客户端和后台查询比较 not suitable driver 我用的mysql数据库 解题类,求第2关解法。。。 Msdn安装到了E盘,可装完后为什么C盘少了好多空间 晒晒自己第一次写的程序,大家来评价评价 directshow的DES中智能连接过程的问题 两道哈夫曼编码的题目,我不会做,大家编码看一下,谢谢了! 晓组织每天的聊天内容 急于求成的问题----hello world! 同一个用户,回答提示问题每天只能错三次。超过3次24小时后回答.有点思路,但有个datetime问题 问一个程序题,高手指教 找不到DLL入口点,各位大哥们帮帮忙。着急着急!!!!!!!!!!! 画出几张图片的不同之处时遇到的问题 这个简单的shell判断条件怎么不对? 用VS2008 Debug一个链表出现的问题 Windows Mobile,窗体会把下面的状态条遮住,怎么回事? 我菜鸟,帮忙看下问题在哪 rac下OCFS2安装的问题 在手机上实现上传文件,除了用socket外,还能其他方法吗?哪种效率比较高些 一个remoting的很简单很简单的问题 大家来看一下吧,关于去除HTML标记语言的问题 这句SQL语句用存储过程怎么写,急!! 大家09年春节火车票都怎么买?网上有好的购票网没有? AJAX 异步获取数据产生的并发问题 不知道是什么问题,我的网站传到网上去却打不开? 数据库中的二进制图片如何显示在datalist中 请教我执行这二条语句查询的结果统计