说明:由于以前发的一个贴子没有说明白,在此再开一贴再讨论 (数据总行数是远大于dbgrid1一页数据行数才会出现这种情况)
///////////////////////////////////////////////////////////////////
问题描述:
(假如dbgrid1一页数据显示7行) 行号
... 0600 ... 1行
... 0700 ... 2行
... 0800 ... 3行
... 0830 ... 4行 //这是dbgrid1一页数据的中间位置
... 0900 ... 5行
... 1000 ... 6行
... 1100 ... 7行〈---//假如此时指针指向这一条数据,
//这时时钟定时响应,刷新数据,
//这时问题出现了:7行数据跳到第四行数据上去了
显示为如下:... 0830 ... 1行
... 0900 ... 2行
... 1000 ... 3行
... 1100 ... 4行〈---//这是dbgrid1一页数据的中间位置
... 1120 ... 5行
... 1200 ... 6行
... 1230 ... 7行
///////////////////////////////////////////////////////////
我的目的:
... 0600 ... 1行
... 0700 ... 2行
... 0800 ... 3行
... 0830 ... 4行 //这是dbgrid1一页数据的中间位置
... 0900 ... 5行
... 1000 ... 6行
... 1100 ... 7行〈---//假如此时指针指向这一条数据,
//这时时钟定时响应,刷新数据,
//这时该行数据仍在原位置显示,不跳到4行显示
///////////////////////////////////////////////////////////////////////
其它说明:1。我的刷新语句是:
timer定时触发:
===========================================================
gss:=dbgrid1.datasoure.dataset.fieldbyname('A1').asstring;
dbgrid1.datasoure.dataset.close;
dbgrid1.datasoure.dataset.open;
dbgrid1.datasoure.dataset.locate('A1',gss,[]);
============================================================
用book效果与上面情况一样
aa:=dbgrid1.datasoure.dataset.getbookMark;
dbgrid1.datasoure.dataset.close;
dbgrid1.datasoure.dataset.open;
dbgrid1.datasoure.dataset.gotobookMark;
===========================================================
2。指定DBgrid1.datasource为Query1
///////////////////////////////////////////////////////////////////
问题描述:
(假如dbgrid1一页数据显示7行) 行号
... 0600 ... 1行
... 0700 ... 2行
... 0800 ... 3行
... 0830 ... 4行 //这是dbgrid1一页数据的中间位置
... 0900 ... 5行
... 1000 ... 6行
... 1100 ... 7行〈---//假如此时指针指向这一条数据,
//这时时钟定时响应,刷新数据,
//这时问题出现了:7行数据跳到第四行数据上去了
显示为如下:... 0830 ... 1行
... 0900 ... 2行
... 1000 ... 3行
... 1100 ... 4行〈---//这是dbgrid1一页数据的中间位置
... 1120 ... 5行
... 1200 ... 6行
... 1230 ... 7行
///////////////////////////////////////////////////////////
我的目的:
... 0600 ... 1行
... 0700 ... 2行
... 0800 ... 3行
... 0830 ... 4行 //这是dbgrid1一页数据的中间位置
... 0900 ... 5行
... 1000 ... 6行
... 1100 ... 7行〈---//假如此时指针指向这一条数据,
//这时时钟定时响应,刷新数据,
//这时该行数据仍在原位置显示,不跳到4行显示
///////////////////////////////////////////////////////////////////////
其它说明:1。我的刷新语句是:
timer定时触发:
===========================================================
gss:=dbgrid1.datasoure.dataset.fieldbyname('A1').asstring;
dbgrid1.datasoure.dataset.close;
dbgrid1.datasoure.dataset.open;
dbgrid1.datasoure.dataset.locate('A1',gss,[]);
============================================================
用book效果与上面情况一样
aa:=dbgrid1.datasoure.dataset.getbookMark;
dbgrid1.datasoure.dataset.close;
dbgrid1.datasoure.dataset.open;
dbgrid1.datasoure.dataset.gotobookMark;
===========================================================
2。指定DBgrid1.datasource为Query1
procedure TForm1.Bttn_TestClick(Sender: TObject);
var
BookMark: TBookMark;
TotalMoney: Integer;
begin
TotalMoney := 0;
LockWindowUpdate(DBGrid1.Handle); //锁住屏幕,防止抖动
BookMark := ADO_Pay.GetBook; //设置书签
ADO_Pay.First;
while not ADO_Pay.Eof do
begin
TotalMoney := TotalMoney + ADO_Pay.fieldbyname('left_pay').Value;
ADO_Pay.Next;
end;
ADO_Pay.GotoBook(BookMark); //回到书签
ADO_Pay.FreeBook(BookMark); //释放书签
Edt_TotalPay.Text := inttostr(TotalMoney);
LockWindowUpdate(0); //解锁
end;
DisableControls;
然后Close;
再Open;
最后
EnableControls;
还会抖动吗?我经常用这种方法,不会抖
↑直接対Query1做bookMark、試試。
DisableControls;EnableControls;
再加上
DisableControls;
EnableControls;
begin
if not Active then
Active:=true;
if not IsEmpty then
i:=RecNo
else
i:=1;
DisableControls;
ReQuery;
if not IsEmpty then
begin
if RecordCount>=i then
RecNo:=i
else
Last;
end;
EnableControls;
end;