delphi+mysql如何实现查询结果在DBGrid(或者其他的控件也可以,但是请详细说明)中分页显示出来,并且有一个翻页按扭可以翻页查看。谁能告诉我查询的语句怎么写,我用的是ADOQuery查询,请不要只给我一句select * from table limit 2,3这样的语句,我希望要实现这个功能的详细的代码段,我只用delphi+mysql实现功能,请不要给我什么java,php或者其他什么语言的方法!谢谢!

解决方案 »

  1.   

    事先要预建多个GRID控件(设定固定行数),全部先导进某个GRIDALL里,然后按行数计算要用到多少个GRID,
    就显示多少个GRID,按固定行数瓜分GRIDALL里的数据
      

  2.   

    那如果我有一万条记录,每个页只显示5条记录,那得要2000个DBGrid。。这个会不会很浪费资源啊
      

  3.   

    此贴提出的人太多,往前一翻都是已经回答的答案
    粘一个别人发的unit   Unit1;   
        
      interface   
        
      uses   
          Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,   
          Dialogs,adoint,   Grids,   DBGrids,   DB,   ExtCtrls,   DBCtrls,   StdCtrls,   Spin,   ADODB;   
        
      type   
          TForm1   =   class(TForm)   
              ADOConnection1:   TADOConnection;   
              ADODataSet1:   TADODataSet;   
              DataSource1:   TDataSource;   
              StringGrid1:   TStringGrid;   
              Button1:   TButton;   
              Button2:   TButton;   
              Button3:   TButton;   
              Button4:   TButton;   
              procedure   showdata();   
              procedure   FormCreate(Sender:   TObject);   
              procedure   Button2Click(Sender:   TObject);   
              procedure   Button3Click(Sender:   TObject);   
          private   
        
              {   Private   declarations   }   
          public   
        
              {   Public   declarations   }   
          end;   
        
      var   
          Form1:   TForm1;   
        
      implementation   
        
      {$R   *.dfm}   
      procedure   TForm1.FormCreate(Sender:   TObject);   
      begin   
            adodataset1.Recordset.PageSize:=10;   
            adodataset1.Recordset.AbsolutePage:=1;   
            showdata;   
      end;   
        
      procedure   Tform1.showdata;   
      var   
            irow,icol,icount:integer;   
            rs:adoint.recordset;   
      begin   
            //cleardata;   
            irow:=0;   
            icol:=0;   
            stringgrid1.Cells[icol,irow]:='顾客编号';   
            inc(icol);   
            stringgrid1.cells[icol,irow]:='公司名称';   
            inc(irow);   
            dec(icol);   
        
            rs:=adodataset1.recordset;   
            for   icount:=1   to   10   do   
            begin   
                  stringgrid1.cells[icol,irow]:=rs.fields.get_item('customerid').value;   
                  inc(icol);   
                  stringgrid1.cells[icol,irow]:=rs.fields.get_item('companyid').value;   
                  inc(irow);   
                  dec(icol);   
                  rs.movenext;   
            end;   
      end;   
        
        
        
      procedure   TForm1.Button2Click(Sender:   TObject);   
      var   
      abspage:integer;   
      begin   
            abspage:=adodataset1.Recordset.AbsolutePage;   
            inc(abspage);   
            showdata;   
      end;   
      end.如果需要往前翻,定义一个全局变量
      

  4.   

    呵呵,我比较笨,我用多了一个ClientDataSet来在本地存放qury过来的dataset,然后操作clientdataset,想如何就如何
      

  5.   

    3楼的yangkunjie,我比较笨啊,你的这个方法,我看不太懂啊,而且为什么都没用到mysql的查询语句。这样也可以嘛??
      

  6.   

    我引用的3楼的方法是得到已经得到数据集后,然后自定义一个分页显示处理数据集的过程showdata,通过定义一个全局的变量AbsolutePage来处理往前和往后翻页
    上面的方法是正常使用sql查询得到数据集而进行处理的
    条条小路通厕所,使用分页存储过程实现,然后在程序中调用实现也可以
    代码我就不贴出来了,引用页为
    http://www.qqgb.com/Program/Delphi/DelphiJQ/Program_165423.html
      

  7.   

    TO 楼主 动态创建囉 或者你自己写个控件TO yangkunjie 用你的方法可行,但这是对现有的表进行显示能否给一个以下情况的解决方法:
    stringgrid是新增记录用,保存后插入到数据表,而不是显示数据表,这种情况下该如何呢?
      

  8.   

    如果楼主只是单纯的显示的话前提建一个存储过程
    1 建临时表,第一列自动加1,第二列为页码暂为null
    2 insert into 临时表 select * from 你的表
    3 定义行数 X, 计算页数:select count(*)/行数
    4 update 临时表 set 第二列 为 1 where 你的表某列 = (select top X 你的表某列 from 你的表)
    5 做个循环 update 其它第二列 (....from 你的表 where 你的表某列 in (select 你的表某列 from 临时表 where 第二列不为NULL))最后就按列数来执行查询你的临时表 当然你要在DELPHI里有个页数的变量
      

  9.   

    MYSQL的话select * from table limit 2,3是最简单的方式
    设置一个页码 一个页长度
    with Query do
    begin
     SQL.text:='select * from table limit '+format('%d,%d',[(APageNo-1)*APageSize+1,APageSize*APageNo]);
    Open;
    end;
      

  10.   

    6楼的 yangkunjie 朋友,你的连接里面的方法是MSSQL+DELPHI吧!在mysql里面那样创建存储过程会出错的吧?小弟我刚学,很惭愧,所以存储过程我还没掌握啊,不懂得怎么把sql的代码翻译成mysql的代码!还有你在三楼帖出的代码里面
               ADOConnection1:   TADOConnection;   
              ADODataSet1:   TADODataSet;   
              DataSource1:   TDataSource;   
              StringGrid1:   TStringGrid;  
    这四个控件要怎么设置与数据库的连接啊??
         ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
    我是初学者,我还只会用这三个控件设置数据库连接。。还有9楼的 dh9450 朋友,你那句with Query do是什么意思啊?我不明白。。
      

  11.   

    存储过程做分页好。With语句又叫开域语句,用来简化记录中域的引用。比如
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add(strSQL);
    ADOQuery1.Active:=true;
    ...这一段全是对ADOQuery1的操作,重复写比较麻烦,你可以这样:
    with ADOQuery1 do begin
      SQL.Clear;
      SQL.Add(strSQL);
      Active:=true;
    end;
      

  12.   

    就是操作数据集拉
    如果你用ADO或者MYDAC之类的连接MYSQL
    具体如楼上所说
      

  13.   

    mysql从5.0就开始支持存储过程了,方法类似,基本上相同