如何控制DBGrid的滚动条

delphilove 2005-03-25 10:41:59
在DBGrid控件右侧的滚动条运行时始终在中间位置或顶端或底端,不能根据实际情况移动,如何正确配置滚动条的范围、以及在单击或拖动滑块时如何正确设置滚动条的位置?
void _fastcall TForm1::GridWindowProc(TMessage &Message)
{
if (Message.Msg == WM_VSCROLL)
{
int nPos = GetScrollPos((HWND)Message.LParam, SB_VERT);
if (Message.WParam == SB_LINEUP)
{
t->DataSource->DataSet->Prior();
SetScrollPos((HWND)Message.LParam, SB_VERT, nPos - 1, TRUE);
Message.Msg = 0;
}
if (Message.WParam == SB_LINEDOWN)
{
t->DataSource->DataSet->Next();
SetScrollPos((HWND)Message.LParam, SB_VERT, nPos + 1, TRUE);
Message.Msg = 0;
}
}
OldGridProc(Message);
}
我用上述的方法尝试设置,结果没有任何反应,应该如何设置啊?还有应该在哪里设置滚动条的Range和nPage啊?
...全文
389 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Libran 2005-03-25
  • 打赏
  • 举报
回复
修改GridWindowProc:(去掉你加的两行,增加SB_THUMB...消息处理)
void _fastcall TForm1::GridWindowProc(TMessage &Message)
{
if (Message.Msg == WM_VSCROLL)
{
int nPos = GetScrollPos((HWND)Message.LParam, SB_VERT);
if (Message.WParam == SB_LINEUP)
{
t->DataSource->DataSet->Prior();
Message.Msg = 0;
}
if (Message.WParam == SB_LINEDOWN)
{
t->DataSource->DataSet->Next();
Message.Msg = 0;
}
if (LOWORD(Message.WParam) == SB_THUMBPOSITION ||
LOWORD(Message.WParam) == SB_THUMBTRACK)
{
t->DataSource->DataSet->RecNo = HIWORD(Message.WParam);
return;
}
}
OldGridProc(Message);
}

再在t->DataSource->DataSet的AfterScroll事件里加代码:
{
ShowScrollBar(t->Handle, SB_VERT, false);
SCROLLINFO si;
memset(&si, 0, sizeof(SCROLLINFO));
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
si.nPage = 8; //这里设为DBGrid一次可以显示的记录数;
//实在不好确定,可以为0(滑块稍微难看一点儿)
si.nMin = 1;
si.nMax = t->DataSource->DataSet->RecordCount + si.nPage - 1;
si.nPos = t->DataSource->DataSet->RecNo;
SetScrollInfo(t->Handle, SB_VERT, &si, true);
ShowScrollBar(t->Handle, SB_VERT, true);
}
delphilove 2005-03-25
  • 打赏
  • 举报
回复
顶一下
delphilove 2005-03-25
  • 打赏
  • 举报
回复
每次运行到函数中取nPos时,取得的nPos值都是0,这是为什么呢?
delphilove 2005-03-25
  • 打赏
  • 举报
回复
OK,搞定,结贴!
delphilove 2005-03-25
  • 打赏
  • 举报
回复
哦,那我用ADO试一下啦!:)
Libran 2005-03-25
  • 打赏
  • 举报
回复
嗯。。。因为你用的是BDE,TTable/TQuery的RecNo值总是-1的。。。不好办哪。。。

咱商量一下,你换用ADO好不啦?
delphilove 2005-03-25
  • 打赏
  • 举报
回复
我试了一下,还是不行,这样运行起来,滑块的位置怎么总是在最上端呢?
Libran 2005-03-25
  • 打赏
  • 举报
回复
还有一点要补充说明:
如果用ADOTable/ADOQuery获取数据集,且其Filtered属性为false的话,那么上面的代码就不需要了,DBGrid的滚动条滑块的高度和位置都和实际记录数以及当前记录位置是相适应的。
suny803 2005-03-25
  • 打赏
  • 举报
回复
xi
Lonelywolf1899 2005-03-25
  • 打赏
  • 举报
回复
这是BCB才有的特性吧?
作为ComponentOne Studio for .NET 和 ComponentOne Studio Enterprise的一部分,ComponentOne True DBGrid for .NET是我们受欢迎的ActiveX控件-True DBGrid Pro的.NET版本。它使用ADO.NET,最新的数据绑定技术,能完全管理数据库界面并提供强大灵活的浏览,编辑,添加和操作表格数据的能力。 True DBGrid Pro for ActiveX的爱好者会喜欢ComponentOne True DBGrid for .NET。因为它包含了您所依赖的特性:复合显示模式,具有独立或同步滚动的水平和垂直拆分,完全可定制网格界面(字体,颜色,图片和格式),增强键盘导航,健壮的打印选项以及其它更多特性! [特 性] ComponentOne True DBGrid for .NET具有您对我们畅销的ActiveX 控件True DBGrid Pro所期望的高级特性。以下是一个实例: 复合显示模式以最实用的格式表示数据:标准Outlook样式分组,可以动态的排序网格列;分层数据显示提供了增强的Master-Detail显示以及完全可编辑的下拉视图;窗体视图可在需要能修改的标准“窗体”中重新定位数据;反转视图可将行转换为列,从而提供方便的“向下读”方式。 Microsoft Word- 和Excel-类型模型定制网格的外观:字体,颜色,图片以及格式化规范。从列和行边框…到前景图片…到正文环绕。能非常简单的让网格显示出您需要的结果。 具有定制滚动条的垂直和水平分割可以水平,垂直和两者同时分割网格!此外,您具有对滚动行为的控制:选择具有在每个分割中独立工作的滚动条(对于需要从不同列的数据中对比字段值时非常有效)或选择一个滚动条同步滚动复合分割。 2D和3D单元显示选择两维,三维和两者结合来控制单元外观符合您的要求。例如,您可能希望允许鼠标移动元素来获得一个3D外观。 Excel-类型单元格选项选择不但可以是任何行或列,而且可以是任何区域的单元。 丰富的滚动能力跟踪滚动条的位置并且在滚动条移动时给用户一个信息弹出框。 自动调整列尺寸(弹性模式)当网格水平尺寸调整时,通过适当改变列的尺寸保证您的数据可见。 增强键盘导航当用户按回车键时使用DirectionAfterEnter属性控制下一单元的相应位置。 FilterBar数据输入行实现定制用户操作,如增长搜索和记录集过滤。 标签属性可以向一个列附加任何类型的对象。 合并相邻单元从指定的列中合并相邻数据行到一个不可编辑单元,或独立显示所有单元属性。 AutoDropdown和 AutoCompletion属性 · 通过减少下拉选项所需按键次数来简化数据输入。 · 自动将网格单元转换为True DBDropDown值 · 连接一个TDBDropDown控件到一个包含值和描述的表上,该表的下拉选项将自动的将描述映射到该值上。 · 健壮的打印选项 · 控件打印具有完备的功能,如缩放,调整到窗体,停止分页以及打印预览。

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧