我在timer1的时间里写
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('update student set 积分='''+personmain_form.Tpoint+''' where 姓名             
                       '''+login_form.username_edit.Text+''' ');
  ADOQuery1.ExecSQL;
  adodataset1.active:=false;
  adodataset1.CommandText:='select 姓名,项目名称,积分,经验值,工资,职称 from student where 姓名 ='''+login_form.username_edit.Text+'''';
  adodataset1.active:=true;
   for i:=0 to 5 do
   begin
     DBGrid1.Columns[i].Width:=85;
   end;
//SQL语句没错。
可以实现刷新,但是一闪一闪的,有没有别的方法刷新DBGRID?

解决方案 »

  1.   


      try
        ADOQuery1.DisableControls;
      finally
        ADOQuery1.EnableControls
      end;
      

  2.   

    LockWindowUpdate(Handle);   
    ……
    LockWindowUpdate(0);   
      

  3.   

    或者使用DisableControls,EnableControls试试
      

  4.   

    回2楼,你的意思是不是ADOQuery1.ExecSQL后面加你写的?
    如果是也不行呀。
      

  5.   


    你的程序中应该是adodataset1,就是和grid相连的那个数据集
      

  6.   

    不行啊。还是闪。有没有别的方法刷新DBGRID?bdmh ,麻烦你啦。
      

  7.   

     ADOQuery1.Close; 
      ADOQuery1.SQL.Clear; 
      ADOQuery1.SQL.Add('update student set 积分='''+personmain_form.Tpoint+''' where 姓名            
                          '''+login_form.username_edit.Text+''' '); 
      ADOQuery1.ExecSQL; 
      adodataset1.active:=false; 
      adodataset1.CommandText:='select 姓名,项目名称,积分,经验值,工资,职称 from student where 姓名 ='''+login_form.username_edit.Text+''''; 
      AdoDataSet1.DisableControls;
      adodataset1.active:=true; 
      AdoDataSet1.EnableControls;
      for i:=0 to 5 do 
      begin 
        DBGrid1.Columns[i].Width:=85; 
      end; 
    別外在窗體的 onCreate  裏面 :   DoubleBuffer := True ;  也打開,關閉程序的時候再置為 false;
      

  8.   

    別外在窗體的 onCreate  裏面 :   DoubleBuffer := True ;  也打開,關閉程序的時候再置為 false;弱弱的问下,DoubleBuffer是什么?
      

  9.   

    DoubleBuffered
    常用在绘图方面,减少界面的闪烁Determines whether the control's image is rendered directly to the window or painted to an in-memory bitmap first.
    决定是否首先用内存中的bitmap去渲染控件的图像 
      

  10.   

    加了,但是还是闪。不用timer,用别的方法怎么实现DBGRID的刷新?
      

  11.   

    不频繁看不到变化啊,就要它实时变化。
    不用timer还有什么办法?
    不是点击按钮才变化,就想到timer了。
      

  12.   

    把Timer1的间隔时间调长一点,如2秒,3秒... 调到满意位置.Timer1.Interval := 2000;
      

  13.   

    dbgrid刷新起来是有闪烁问题,还没有想到解决的好办法,帮你顶了!
      

  14.   

    如果你的SQL语句是一样的,不ADOQuery1.Close,直接执行可以不
    ADOQuery1.Close; 
      ADOQuery1.SQL.Clear; 
      

  15.   

    首先,你界面的闪不是由于SQL语句或者是链接的问题。看下面的语句,
      for i:=0 to 5 do 
      begin 
        DBGrid1.Columns[i].Width:=85; 
      end; 每调用一次Timer,就刷新一次列宽,这是做什么呢?建议:列宽的调整放在外面处理,不建议将GUI,逻辑处理和数据层绑死
      

  16.   


    你可以在adoquery或table上做固化字段,定好宽度,那样就不会自动适应字段长度了
    另外,你的程序是不是有多人一起用呢,如果不是,那为什么要实时看到数据呢
      

  17.   

    我试了。列宽在DBGRID的事件里设置的,但是不行,还是闪。.....是不是我思路有问题?
      

  18.   

    如果你不用timer会闪吗,你们是多客户端吗
      

  19.   

    我也建议固定列宽。for i:=0 to 5 do 
    begin 
      DBGrid1.Columns[i].Width:=85; 
    end;这个完全可以在DBGrid设计阶段或者创建阶段就设定.这样至少列标题不会闪。另外如果是DBGrid刷新太快的问题,如果还没法解决,ADOQuery1.SQL.Add('update student set 积分='''+personmain_form.Tpoint+''' where 姓名            
                          '''+login_form.username_edit.Text+''' ');

    adodataset1.CommandText:='select 姓名,项目名称,积分,经验值,工资,职称 from student where 姓名 ='''+login_form.username_edit.Text+'''';这个完全可以用一个输入结束的事件去触发,没必要一直用timer去轮循的阿,中间刷新很多次都是无用功。
      

  20.   


    感觉应该定义一个通讯,当有数据被更新了,你再去刷新,如果你是单机的话,就更好控制了,update后刷新,其它时间静止
      

  21.   

    回29楼,你意思是定义个函数或者进程?bdmh.感觉应该定义一个通讯,当有数据被更新了,你再去刷新,如果你是单机的话,就更好控制了,update后刷新,其它时间静止.  能否给个例子?
      

  22.   

    用户输入有个结束判断比较好,比如回车什么的这时候 就触发数据库写入和查询还有dbgrid刷新
    轮循效率很低下的。
      

  23.   


        ADOQuery1.DisableControls;
        ADOQuery1.EnableControls;
      

  24.   

    如果可能的话,在服务器和客户机之间建立通讯(什么方式都行如广播,web service等),当任一个客户端提交数据后想其它客户机发送信息,其它客户机接收到后,进行刷新,简单的说就跟qq一样不知道存储过程是否能实现消息发送
      

  25.   

    建一个表T1用来记录使用表U1的状态(有变更标记为C,没有变更标记为N),使用表U1用触发器当INSERT, UPDATE, DELETE 时触发,更新表T1的状态标记为C,用一个ADOQuery 去检测T1的状态,当T1记录U1的状态为C时,查询ADOQuery先CLOSE再OPEN,OPEN更新表T1的状态标记为N。如果你就TIME控件,即使用数据库没变化,也会刷新,达不到你的要求。
      

  26.   

    不用讨论了,就是要闪,不过解决了不闪的问题后,你又会发现每一次刷新后,你的游标会锁定第一行记录,你想做新增数据实时显示是吧?根本不能用TIMER,如果是大型数据库,多端查询的话,太浪费了,
    我以前做过,效果最好的是采用聊天室的技术,好像叫做什么“推技术”
    也想过用触发器,但是更麻烦,最后的解决办法是   A作为增加数据库记录的机器向数据库提交数据后,广播一次,所有查询端收到消息后SELECT一次,当时还是菜菜鸟,所以也只能这样了!