前提:
adoquery1和adoquery2 通过datasouce形成主从表, 
adoquery2 数据提交方式为ltBatchOptimistic
当adoquery1 记录滚动时(beforescroll),判断adoquery2是否已提交UpdateBatch
问题:
adoquery1 设置了 filter过滤,当取消过滤显示所有行时 发现会逐条触发beforescroll事件,这样在该事件中用来判断adoquery2是否已提交的语句会依次循环整个adoquery1的记录行,影响了程序的速度.

解决方案 »

  1.   

    定义一个类的私有变量Flag:boolean;
    Flag := true;
    adoquery1.Filtered := true;adoquery1.Filtered := False;
    Flag := False;-----------------------------
    beforescroll事件中判断
    if Flag = False then
    begin
    //判断adoquery2是否已提交UpdateBatch
    end;
      

  2.   

    不行这样,不能通过adoquery1是否处于过滤状态,就禁止判断adoquery2是否已提交,
      

  3.   

    你的意思是说“当取消过滤显示所有行时”会产生这个。
    adoquery1.Filtered := true;
    Flag := true;//那调到这不就完事了。
    adoquery1.Filtered := False;
    Flag := False;
      

  4.   

    不是,我是用的dbgrideh 的过滤功能来进行过滤的,没有代码,
      

  5.   

    可能的操作
     dbgrideh1 连接adoquery1 ,dbgrideh1 过滤出来内容后,选择后,adoquery2会同步关联显示相应的内容,之后如果adoquery2修改了,而dbgrideh1想重新再进行过滤时,判断2的状态,现在如果我没有修改2,而只是任意的在dbgrideh1中进行过滤,他会一直判断2的状态,procedure TForm1.Q1BeforeScroll(DataSet: TDataSet);
    begin
          if   (CacheNotSave(q2)) AND (MessageBox(Handle, '当前数据尚未保存,放弃保存吗?', '系统提示',MB_OKCANCEL+MB_ICONQUESTION) = IDCANCEL) then
         abort
    end;
      

  6.   

    dbgrideh1  是用自带的stfilter属性显示表格顶部的过滤窗口进行过滤