我在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?
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?
try
ADOQuery1.DisableControls;
finally
ADOQuery1.EnableControls
end;
……
LockWindowUpdate(0);
如果是也不行呀。
你的程序中应该是adodataset1,就是和grid相连的那个数据集
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;
常用在绘图方面,减少界面的闪烁Determines whether the control's image is rendered directly to the window or painted to an in-memory bitmap first.
决定是否首先用内存中的bitmap去渲染控件的图像
不用timer还有什么办法?
不是点击按钮才变化,就想到timer了。
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
for i:=0 to 5 do
begin
DBGrid1.Columns[i].Width:=85;
end; 每调用一次Timer,就刷新一次列宽,这是做什么呢?建议:列宽的调整放在外面处理,不建议将GUI,逻辑处理和数据层绑死
你可以在adoquery或table上做固化字段,定好宽度,那样就不会自动适应字段长度了
另外,你的程序是不是有多人一起用呢,如果不是,那为什么要实时看到数据呢
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去轮循的阿,中间刷新很多次都是无用功。
感觉应该定义一个通讯,当有数据被更新了,你再去刷新,如果你是单机的话,就更好控制了,update后刷新,其它时间静止
轮循效率很低下的。
ADOQuery1.DisableControls;
ADOQuery1.EnableControls;
我以前做过,效果最好的是采用聊天室的技术,好像叫做什么“推技术”
也想过用触发器,但是更麻烦,最后的解决办法是 A作为增加数据库记录的机器向数据库提交数据后,广播一次,所有查询端收到消息后SELECT一次,当时还是菜菜鸟,所以也只能这样了!