为什么DBGrid中上下滚动条只用三个位置(上、中、下)?(50分)

  • 主题发起人 主题发起人 李长柱
  • 开始时间 开始时间

李长柱

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么DBGrid中上下滚动条只用三个位置(上、中、下),
如何改变?
 
这是dbgrid预先定义的,很难改,因为滚动包括了数据明了操作,不信你看他的原码
中响应scrollbar的滚动消息包括了数据操作,如recno:=xxx.
 
看下面的源程序:
procedure TCustomDBGrid.UpdateScrollBar;
var
SIOld, SINew: TScrollInfo;
begin
if FDatalink.Active and HandleAllocated then
with FDatalink.DataSet do
begin
SIOld.cbSize := sizeof(SIOld);
SIOld.fMask := SIF_ALL;
GetScrollInfo(Self.Handle, SB_VERT, SIOld);
SINew := SIOld;
if IsSequenced then
begin
SINew.nMin := 1;
SINew.nPage := Self.VisibleRowCount;
SINew.nMax := Integer(DWORD(RecordCount) + SINew.nPage - 1);
if State in [dsInactive, dsBrowse, dsEdit] then
SINew.nPos := RecNo; // else keep old pos
end
else
begin
SINew.nMin := 0;
SINew.nPage := 0;
SINew.nMax := 4;
if FDataLink.BOF then SINew.nPos := 0
else if FDataLink.EOF then SINew.nPos := 4
else SINew.nPos := 2;
end;
if (SINew.nMin <> SIOld.nMin) or (SINew.nMax <> SIOld.nMax) or
(SINew.nPage <> SIOld.nPage) or (SINew.nPos <> SIOld.nPos) then
SetScrollInfo(Self.Handle, SB_VERT, SINew, True);
end;
end;

从源程序上来看只要数据库IsSequenced 为真,
即数据库中的表是用记录号来表示记录的顺序就可以使用滚动条不只用三个位置,
可惜,大家用的数据库基本上都不是这样的。
所以就只有三个位置, 即SINew.nPos为0,2,4。
 
补充说明一下,
SetScrollInfo(Self.Handle, SB_VERT, SINew, True);
就是设定了滚动位置。

对第二个问题,最好不要改变,
因为就算改了,如果数据库不是IsSequenced 的,结果也不一定准确。

 
是的,对于有些数据库是不只有三个点的.
 
To amo and hubdo:

这种现象确实是Delphi本身的问题,我以为简单设置一下属性就可以解决了,
事实上并非如此。我原来使用的是Delphi3,确实有这种现象,我现在使用的是
正版的Delphi 5,在用Paradox数据库时,滚动条显示就完全正常了(多个位置),
而在使用SQL Server数据库时,则又不正常了(三种位置),真的是BUG吗?

注:滚动条正常时,所显示的滚动条比较长,数据量越大滚动条就越长,
滚动条不正常时,所显示的滚动条是固定的小方块。
 
Access也没有记录号的概念,但是在Access软件里面,就可以平滑滚动.
 
看一看这里吧:
<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=96871">关于不同数据库与DBGrid的奇怪现象</a>
 
多人接受答案了。
 
后退
顶部