NextGrid 5.9和5.9.1版本关于横滚动条的错误

90次阅读
没有评论

菲菲的家(ffhome.com)原创,转载请注明!

NextGrid 是一个简洁易用的表格控件,其原作者一直在更新和完善,主版本号为 6 的控件新版本已经处于 Beta 测试中。

然而自从 NextGrid 升级到 5.9 后,本人发现一个关于横滚动条的错误,这个错误在最新的 5.9.1 版本中依然存在,而上一版本(5.8.5)并不存在这个错误,作者在 5.9 版本对 procedure TNxCustomGridControl.UpdateHorzScrollBar; 函数进行了修改,本人看不出修改内容对增加功能或修正 Bug 或提高效率有任何必要,却带来了错误,不清楚修改的目的何在。具体错误表现为:

当表格中所有列全部显示在表格的宽度区域内时(即所有显示列宽的总和 < 表格 ClientWidth 宽度),横滚动条本应不显示,但实际上横滚动条始终显示并可滚动。

这个错误所带来的严重问题是,当将表格的高度缩小到表格底部边缘接近最后一数据行时(此时原本显示的横滚动条已经消失,竖滚动条还未自动出现),造成最后一数据行无法进行任何表格内鼠标操作(比如选择、右键弹出菜单等)。实际上这时候虽已看不见横滚动条,但其实际上还在,滚动鼠标滚轮表格还会横向滚动,正是这个横滚动条阻挡了表格最后一行不能进行鼠标操作。

NextGrid 5.9 和 5.9.1 版本导致本文所阐述的错误原代码如下:
在 Sources\Next Grid\NxCustomGridControl.pas 文件中找到 TNxCustomGridControl.UpdateHorzScrollBar 函数:

[delphi]procedure TNxCustomGridControl.UpdateHorzScrollBar;

function GetColTotalWidth: Integer;
var
i: integer;
begin
Result := 0;
for i := 0 to Columns.Count – 1 do
begin
if Columns[i].Visible then Inc(Result, Columns[i].Width);
end;
if goIndicator in Options then Inc(Result, sizIndicator);
end;

var
m, ps, lc, p: Integer;
begin
case GridStyle of
gsReport:
begin
m := GetColTotalWidth;
ps := ClientWidth + 1;
lc := HorzScrollBar.PageSize – 10;
p := GetRealScrollPosition(HorzScrollBar);

if ClientHeight > GetSystemMetrics(SM_CXHSCROLL) then
begin
HorzScrollBar.Visible := m > ps;
end else HorzScrollBar.Visible := False;

if HorzScrollBar.Visible then
begin
HorzScrollBar.Max := m;
HorzScrollBar.PageSize := ps;
HorzScrollBar.LargeChange := lc;
HorzScrollBar.Position := p;
end;

// HorzScrollBar.SetValues(
// GetColTotalWidth,
// ClientWidth + 1,
// HorzScrollBar.PageSize – 10);

// HorzScrollBar.Max := GetColTotalWidth;
// HorzScrollBar.PageSize := ClientWidth + 1;
// HorzScrollBar.LargeChange := HorzScrollBar.PageSize – 10;

// HorzScrollBar.Position := GetRealScrollPosition(HorzScrollBar);

// if ClientHeight > GetSystemMetrics(SM_CXHSCROLL) then
// begin
// HorzScrollBar.Visible := HorzScrollBar.Max > HorzScrollBar.PageSize;
// end else HorzScrollBar.Visible := False;

end else HorzScrollBar.Visible := False;
end;
end;[/delphi]

NextGrid 5.8.5 及之前版本的相应原代码:

[delphi]procedure TNxCustomGridControl.UpdateHorzScrollBar;

function GetColTotalWidth: Integer;
var
i: integer;
begin
Result := 0;
for i := 0 to Columns.Count – 1 do
begin
if Columns[i].Visible then Inc(Result, Columns[i].Width);
end;
if goIndicator in Options then Inc(Result, sizIndicator);
end;

begin
case GridStyle of
gsReport:
begin
HorzScrollBar.Max := GetColTotalWidth;
HorzScrollBar.PageSize := ClientWidth + 1;
HorzScrollBar.LargeChange := HorzScrollBar.PageSize – 10;
HorzScrollBar.Position := GetRealScrollPosition(HorzScrollBar);

if ClientHeight > GetSystemMetrics(SM_CXHSCROLL) then
begin
HorzScrollBar.Visible := HorzScrollBar.Max > HorzScrollBar.PageSize;
end else HorzScrollBar.Visible := False;

end else HorzScrollBar.Visible := False;
end;
end;[/delphi]

将新版本的此处替换成 5.8.5 版本的源代码即可修正此错误,修改后别忘记重新编译啊,别说我没提醒。

菲菲的家(ffhome.com)原创,转载请注明!

  文件名称:
  文件大小:
  下载声明:本站部分资源来自于网络收集,若侵犯了你的隐私或版权,请及时联系我们删除有关信息。
下载地址:

本处提供之文件只供研究使用,下载后请于 24 小时内删除!

正文完
 0
评论(没有评论)