菲菲的家(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函数:
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;
NextGrid 5.8.5 及之前版本的相应原代码:
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;
将新版本的此处替换成5.8.5版本的源代码即可修正此错误,修改后别忘记重新编译啊,别说我没提醒。
菲菲的家(ffhome.com)原创,转载请注明!
Next Suite 5.9.1 修正编译完成版.rar (9.0 MiB, 945 点击, 最后更新:2013年08月25日)
本处提供之文件只供研究使用,下载后请于24小时内删除!