zoukankan      html  css  js  c++  java
  • 解决DBGridEh遍历记录后不移动当前行位置的方法

    解决DBGridEh遍历记录后不移动当前行位置的方法

    在用DBGridEh配合ClientDataSet使用时,需要知道用户选择了哪些记录,可用遍历记录的方法查询选择列是否为真,但在这之后,ClientDataSet记录指针的位置发生了改变,可用TBookMark的bm:=GetBookMark(ClientDataSet)在遍历前记录下当前指针的位置,在遍历后在用ClientDataSet.GotoBookMark(bm);然后释放ClientDataSet.FreeBookMark(bm);

    但在这里有个问题是,虽然回到了用户操作前的记录位置,但DBGridEh的当前记录位置会移到表格的中间,使得想看到的记录又看不到,

    忽然想起ClientDataSet有一个克隆功能,先把要遍历的数据集克隆下来,在这个克隆的数据集里查询,就不会改变用户界面上的记录集指针位置了。经测试,如法炮制。

    function TMeterReadingForm.bDataMarkChecked: Boolean;
    var
      cds: TClientDataSet;
    begin
      Result := false;
      cds := TClientDataSet.Create(nil);
      try
        SendDataThread.DataMarkCount := 0;
        if cdsDataMark.State in[dsEdit,dsInsert] then
          cdsDataMark.Post;
        cds.CloneCursor(cdsDataMark, True);
        cds.First;
        while not cds.Eof do
        begin
          if cds.FieldByName('Checked').AsBoolean = true then
          begin
            Result := True;
            SendDataThread.Datamarks[SendDataThread.DataMarkCount] := cds.FieldByName('f_DataMark').AsString;
            Inc(SendDataThread.DataMarkCount);
          end;
          cds.Next;
        end;
      finally
        cds.Free;
      end;
      bChecked := Result;
    end;

    而且这种内存数据集速度应该非快,再也用不着下面这种繁锁的代码了。

    function TMeterReadingForm.bDataMarkChecked: Boolean;
    var
      bm: TBookmark;
    begin
      Result := false;
      SendDataThread.DataMarkCount := 0;
      try
        bm := cdsDataMark.GetBookmark;
        cdsDataMark.DisableControls;
        cdsDataMark.First;
        while not cdsDataMark.Eof do
        begin
          if cdsDataMark.FieldByName('Checked').AsBoolean = true then
          begin
            Result := True;
            SendDataThread.Datamarks[SendDataThread.DataMarkCount] := cdsDataMark.FieldByName('f_DataMark').AsString;
            Inc(SendDataThread.DataMarkCount);
          end;
          cdsDataMark.Next;
        end;
        cdsDataMark.GotoBookmark(bm);
      finally
        cdsDataMark.FreeBookmark(bm);
        cdsDataMark.EnableControls;
      end;
      bChecked := Result;

    end;
    ---------------------
    作者:c_huabo
    来源:CSDN
    原文:https://blog.csdn.net/c_huabo/article/details/5776110
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Web容器初始化过程
    基于LayUI实现前端分页功能
    Ubuntu16.04首次root登录设置
    Java集合Iterator迭代器的实现
    ThreadLocal的基本原理与实现
    Redis系列四之复制
    反应堆模式
    Netty学习之客户端创建
    Netty学习之服务器端创建
    Java NIO服务器端开发
  • 原文地址:https://www.cnblogs.com/jijm123/p/11301055.html
Copyright © 2011-2022 走看看