收录日期:2020/07/08 21:55:52 时间: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;
====================================================================================

我对url传递的变量进行加密,但是用querystring获取变量时发现, DEV-C++编译错误的解决??? DELL sc1420 下有人知道如何安装solaris 吗?????请指教 急,请高手根据数据类型读取数据 一个很急切的问题。 关于设计模式~~ 请教高手:ATL接口嵌套问题 请问各位高手有什么办法可以锁定dxdbgrid的行 新安装的W2003无法上网,求助 怎么我的数据库连不上?? 请教各位大虾!!linux下编译的程序如何移植到windows下 关于数组与类 Posix线程问题! 请高手进来看一下重复数据查询的难题,谢谢了 开发for Web的GIS系统用什么组件比较好? 如何修改TXT文件中的内容?(是不是也适用于修改INI文件?) 编译中出现的问题!! 隐性世袭---中国的悲哀!!!中美差距如此之大,不只在科技领域!!!来者有分!!! 联想SX5EP(815)主板可不可以插盈通ti4200-8X的显卡啊? 请问关于C/S程序的编写方法...... 救命,如何清除hxdef100后门 C# winform规格化DataGrid显示,自定义表头,高分求代码 如何准确获取一个类的名称,能解决此问题的绝对是PHP高手 LPVOID参数转换? XP操作系统安装的问题 Help…… 又是关于控件重绘 请教:更换解决方案名称后为什么会产生分析器错误 AdvStringGrid刷新闪烁的问题.回答有分! Delphi 中的 TAbc = class of TClassA; 在c++ builder 怎么写?