M
maldini610
Unregistered / Unconfirmed
GUEST, unregistred user!
dbgrid分页显示,最近做的小应用程序,有个需求,要求分页显示数据。
于是,在baidu中一顿搜索,关于这方面的问题还真就是不少,由于自己的愚蠢,实在是看不明白高手们的寥寥几笔,而且,程序的需求是在dbgrid中能直接修改,我看大部分都是通过sql语句实现的,但是那样的sql语句好像连dbgrid的时候不能修改,只能浏览。
在网上没找到支持分页的控件,于是决定自己想办法实现。
首先说明下,我的分页功能的实现方法,可能是违背了大多数分页显示的目的(提高效率),我做的分页功能的目的是,浏览时有好的效果。
我利用了数组和sql语句,个人认为在效率上存在问题。
窗体中的主要的控件有“上一页”,“下一页”按钮,一个dbgrid,还有一个那个叫DataModulem奥(我delphi不熟)
Var
di,ii :integer;
arr1: array of String;
arr2: array of String;
//下面的代码写在了formonshow事件中,进行调用。
//di代表当前页,ii代表总页数。
function fenye():Integer;
var
fyi1, fyi2, fyi3: integer;
fysql: String;
begin
DataModulem.ADOQuerym.Close;
DataModulem.ADOQuerym.SQL.Clear;
DataModulem.ADOQuerym.SQL.Add('select id from danjia order by id desc');
DataModulem.ADOQuerym.Open;
di:=1;
djyl1.TeLabel10.Caption:=inttostr(di);
ii:= DataModulem.ADOQuerym.RecordCount div 20;
if DataModulem.ADOQuerym.RecordCount mod 20 <> 0 then
begin
inc(ii);
end;
djyl1.TeLabel12.Caption:=inttostr(ii);
fyi1 := 0;
fyi2 := 0;
fyi3 := 0;
if DataModulem.ADOQuerym.RecordCount > 0 then
begin
setlength(arr1, DataModulem.ADOQuerym.RecordCount);
While (Not DataModulem.ADOQuerym.Eof) do
begin
arr1[fyi1] := DataModulem.ADOQuerym.FieldByName('id').AsString;
DataModulem.ADOQuerym.Next;
inc(fyi1);
end;
end;
if High(arr1) >= 0 then
begin
setlength(arr2, ii*2);
while fyi2 <= High(arr1) do
begin
arr2[fyi3] := arr1[fyi2];
fyi2 := fyi2 + 20;
inc(fyi3);
end;
arr2[fyi3] := arr1[High(arr1)];
end;
if di <ii then
begin
fysql := 'select * from danjia where id<='+arr2[di-1]+' and id>'+arr2[di]+' order by id desc';
end
else
begin
fysql := 'select * from danjia where id<='+arr2[di-1]+' and id>='+arr2[di]+' order by id desc';
end;
DataModulem.ADOQuerym.Close;
DataModulem.ADOQuerym.SQL.Clear;
DataModulem.ADOQuerym.SQL.Add(fysql);
DataModulem.ADOQuerym.Open;
Result := fyi1;
end;
////////////////////////////(每页显示20条数据)
其中 主要思想就是取出表中的第1条,21条,。。。最后一条数据的id放入数组中,然后根据当前的页数,通过sql语句查询出结果来。
//下面是“上一页”和“下一页“按钮代码
procedure Tdjyl1.TeButton11Click(Sender: TObject);//上一页
begin
if di > 1 then
begin
dec(di);
TeLabel10.Caption:=inttostr(di);
DataModulem.ADOQuerym.Close;
DataModulem.ADOQuerym.SQL.Clear;
DataModulem.ADOQuerym.SQL.Add('select * from danjia where id<='+arr2[di-1]+' and id>'+arr2[di]+' order by id desc');
DataModulem.ADOQuerym.Open;
end;
end;
procedure Tdjyl1.TeButton12Click(Sender: TObject);//下一页
var
sql :String;
begin
if di < ii then
begin
inc(di);
TeLabel10.Caption:=inttostr(di);
if di <ii then
begin
sql := 'select * from danjia where id<='+arr2[di-1]+' and id>'+arr2[di]+' order by id desc'
end
else
begin
sql := 'select * from danjia where id<='+arr2[di-1]+' and id>='+arr2[di]+' order by id desc'
end;
DataModulem.ADOQuerym.Close;
DataModulem.ADOQuerym.SQL.Clear;
DataModulem.ADOQuerym.SQL.Add(sql);
DataModulem.ADOQuerym.Open;
end;
end;
就这样我实现了分页,我知道无论从代码风格还是,编成思想上,小弟都差很多,希望各位大侠给与批评指正,我也想知道更好的方法
于是,在baidu中一顿搜索,关于这方面的问题还真就是不少,由于自己的愚蠢,实在是看不明白高手们的寥寥几笔,而且,程序的需求是在dbgrid中能直接修改,我看大部分都是通过sql语句实现的,但是那样的sql语句好像连dbgrid的时候不能修改,只能浏览。
在网上没找到支持分页的控件,于是决定自己想办法实现。
首先说明下,我的分页功能的实现方法,可能是违背了大多数分页显示的目的(提高效率),我做的分页功能的目的是,浏览时有好的效果。
我利用了数组和sql语句,个人认为在效率上存在问题。
窗体中的主要的控件有“上一页”,“下一页”按钮,一个dbgrid,还有一个那个叫DataModulem奥(我delphi不熟)
Var
di,ii :integer;
arr1: array of String;
arr2: array of String;
//下面的代码写在了formonshow事件中,进行调用。
//di代表当前页,ii代表总页数。
function fenye():Integer;
var
fyi1, fyi2, fyi3: integer;
fysql: String;
begin
DataModulem.ADOQuerym.Close;
DataModulem.ADOQuerym.SQL.Clear;
DataModulem.ADOQuerym.SQL.Add('select id from danjia order by id desc');
DataModulem.ADOQuerym.Open;
di:=1;
djyl1.TeLabel10.Caption:=inttostr(di);
ii:= DataModulem.ADOQuerym.RecordCount div 20;
if DataModulem.ADOQuerym.RecordCount mod 20 <> 0 then
begin
inc(ii);
end;
djyl1.TeLabel12.Caption:=inttostr(ii);
fyi1 := 0;
fyi2 := 0;
fyi3 := 0;
if DataModulem.ADOQuerym.RecordCount > 0 then
begin
setlength(arr1, DataModulem.ADOQuerym.RecordCount);
While (Not DataModulem.ADOQuerym.Eof) do
begin
arr1[fyi1] := DataModulem.ADOQuerym.FieldByName('id').AsString;
DataModulem.ADOQuerym.Next;
inc(fyi1);
end;
end;
if High(arr1) >= 0 then
begin
setlength(arr2, ii*2);
while fyi2 <= High(arr1) do
begin
arr2[fyi3] := arr1[fyi2];
fyi2 := fyi2 + 20;
inc(fyi3);
end;
arr2[fyi3] := arr1[High(arr1)];
end;
if di <ii then
begin
fysql := 'select * from danjia where id<='+arr2[di-1]+' and id>'+arr2[di]+' order by id desc';
end
else
begin
fysql := 'select * from danjia where id<='+arr2[di-1]+' and id>='+arr2[di]+' order by id desc';
end;
DataModulem.ADOQuerym.Close;
DataModulem.ADOQuerym.SQL.Clear;
DataModulem.ADOQuerym.SQL.Add(fysql);
DataModulem.ADOQuerym.Open;
Result := fyi1;
end;
////////////////////////////(每页显示20条数据)
其中 主要思想就是取出表中的第1条,21条,。。。最后一条数据的id放入数组中,然后根据当前的页数,通过sql语句查询出结果来。
//下面是“上一页”和“下一页“按钮代码
procedure Tdjyl1.TeButton11Click(Sender: TObject);//上一页
begin
if di > 1 then
begin
dec(di);
TeLabel10.Caption:=inttostr(di);
DataModulem.ADOQuerym.Close;
DataModulem.ADOQuerym.SQL.Clear;
DataModulem.ADOQuerym.SQL.Add('select * from danjia where id<='+arr2[di-1]+' and id>'+arr2[di]+' order by id desc');
DataModulem.ADOQuerym.Open;
end;
end;
procedure Tdjyl1.TeButton12Click(Sender: TObject);//下一页
var
sql :String;
begin
if di < ii then
begin
inc(di);
TeLabel10.Caption:=inttostr(di);
if di <ii then
begin
sql := 'select * from danjia where id<='+arr2[di-1]+' and id>'+arr2[di]+' order by id desc'
end
else
begin
sql := 'select * from danjia where id<='+arr2[di-1]+' and id>='+arr2[di]+' order by id desc'
end;
DataModulem.ADOQuerym.Close;
DataModulem.ADOQuerym.SQL.Clear;
DataModulem.ADOQuerym.SQL.Add(sql);
DataModulem.ADOQuerym.Open;
end;
end;
就这样我实现了分页,我知道无论从代码风格还是,编成思想上,小弟都差很多,希望各位大侠给与批评指正,我也想知道更好的方法