关于dev控件 cxGrid分页有关问题

关于dev控件 cxGrid分页问题
 cxGrid控件固然好用 可以列过滤 列聚集等
但是数据太多 分页 就麻烦了。
最好能够实现滚动分页(意思就是在滚动条下滚的时候,自动再加载数据,达到分页的效果)
然后列过滤也可以搭配使用 要求先到db中过滤出数据 然后再加载到界面上来
目前个人实现的方法就是查询都通过存储过程,存储过程包含很多列的过滤条件,然后哪一列过滤 就传入哪一列参数 proc返回的记录就是过滤后的 到cxgrid中 再分页 甚至分页也通过proc来处理 proc中专门有总页数和第几页这两个参数
现在问题是 delphi 不知道要怎么实现 还请教大家 这里还挺麻烦的  
有没有其他更好的办法。
------解决方案--------------------
建议你了解一下cxgrid->dbview->NavigatorButtons属性.



------解决方案--------------------
这个我做过,而且是千万级别的,对于如此大级别的分页,只有一种方法而且是最终方法,也是比较简单的方法,那就是存储过程分页,需要在界面上放置翻页的按钮
下面把我的通用翻页存储过程贴出来:


--通用分页存储过程
Create  PROCEDURE [dbo].[GetRecordFromPage]
    @tblName      varchar(255),       -- 表名
    @fldName      varchar(255)='AutoID',       --关键字段名
    @PageSize     int = 10,           -- 页尺寸
    @PageIndex    int = 1,            -- 页码
    @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
    @strWhere     varchar(1000) = '',  -- 查询条件 (注意: 不要加 where)
    @RecordCount int output --总记录数
AS
declare @ss nvarchar(4000)
if @strWhere != ''
set @ss = 'select @RecordCount=count(*) from ' + @tblName + ' where ' + @strWhere
else
set @ss = 'select @RecordCount=count(*) from ' + @tblName
--print @ss
exec sp_executesql @ss,N'@RecordCount Int out',@RecordCount OutPut

declare @strSQL   varchar(6000)       -- 主语句
declare @strTmp   varchar(500)        -- 临时变量
declare @strOrder varchar(400)        -- 排序类型
declare @strOrderw varchar(400)        -- 排序类型

-- 如果是查询记录总数,直接使用Count(0)函数
set @strOrderw= ' order by [' + @fldName +'] '

if @IsCount != 0
 begin
  if @strWhere != ''
   set @strSQL = 'select count(*) as Total from ' + @tblName + ' where ' + @strWhere
  else
   set @strSQL = 'select count(*) as Total from ' + @tblName
 end
--如果是想查询记录,则
else
begin
if @PageIndex = 1
begin
set @strTmp = ''
--如果是降序查询……
if @OrderType != 0
begin
set @strOrder = ' order by [' + @fldName +'] desc'
end
--如果是升序查询……
else
begin
set @strOrder = ' order by [' + @fldName +'] asc'
end
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' +cast(@PageSize as varchar)+ ' * from '+@tblName+@strTmp+' '+@strOrder
end
  else
begin
declare @topTmp varchar(100)
--如果是降序查询……
if @OrderType != 0
begin
set @strTmp = '>=(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
set @topTmp= cast((@PageIndex*@PageSize) as varchar) 
end
--如果是升序查询……
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
set @topTmp= cast((@PageIndex*@PageSize-@PageSize) as varchar) 
end

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' * from '
+ @tblName + ' where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' +@topTmp+ ' ['
+ @fldName + '] from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrderw
else
set @strSQL = 'select top ' + str(@PageSize) + ' * from '
+ @tblName + ' where [' + @fldName + ']' + @strTmp + '(['