说明:由于以前发的一个贴子没有说明白,在此再开一贴再讨论     (数据总行数是远大于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

解决方案 »

  1.   

    2。我用的DBgrid1.datasource为Query1
      

  2.   

    给你一段代码参考
    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;
      

  3.   


    DisableControls;
    然后Close;
    再Open;
    最后
    EnableControls;
    还会抖动吗?我经常用这种方法,不会抖
      

  4.   

    Query1.getbookMark;
    ↑直接対Query1做bookMark、試試。
      

  5.   


    DisableControls;EnableControls;
      

  6.   

    LockWindowUpdate
    再加上
    DisableControls;
    EnableControls;
      

  7.   

    我用這種方法處理﹐基本上都不會有什么大的閃動            with ADOQuery1 do
                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;