解决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
版权声明:本文为博主原创文章,转载请附上博文链接!

解决DBGridEh遍历记录后不移动当前行位置的方法的更多相关文章

  1. 解决sqlite 删除记录后数据库文件大小不变

    最的做的项目中要有到sqlite数据存储,写了测试程序进行测试,存入300万条记录,占用flash大小为 86.1M,当把表中的记录全部删除后发后数据库文件大小依然是 86.1M: 原因是:sqlit ...

  2. 解决Jupyter notebook安装后不自动跳转网页的方法

    在安装完Jupyter notebook后,有童鞋说出现了各种不友好的问题,鉴于此情况,个人先随手写出以下三种情况,并给出解决方法: 题外建议:请使用谷歌浏览器为默认浏览器 一.对于弹不出浏览器的解决 ...

  3. 解决使用绝对定位absolute后,margin:0 auto居中方法失效(转)

    https://blog.csdn.net/qq_40678503/article/details/82780680

  4. jqGrid 编辑完数据后能返回到当前位置的方法

    jqGrid 是一个js的jquery组件,虽然不轻便,但功能还是蛮强大的,也比较方便使用.在数据加载后,经常需要对其中的记录进行编辑,修改完后再返回时需要看到修改后的数据,一般采取重新加载的方法re ...

  5. 【转发】Linq To EF添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题

    1:添加记录后,如何获取新添加的ID的值 比如,一个实体 TestEntity   对应一个表TestEntity(ID主键自增,Name,age),使用linq to ef   添加一条记录后,如何 ...

  6. Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)

    1:添加记录后,如何获取新添加的ID的值 比如,一个实体 TestEntity   对应一个表TestEntity(ID主键自增,Name,age),使用linq to ef   添加一条记录后,如何 ...

  7. 解决pycharm新建项目后按钮灰色问题

    解决pycharm新建项目后按钮灰色问题 出现过多次该问题了, 在此记录一下 同样适用于导入别人的新项目后无法运行问题 原因一: pycharm没有设置系统解析器 解决方法一: 打开pycharm-& ...

  8. 解决git rebase操作后推送远端分支不成功的问题

    转:解决git rebase操作后推送远端分支不成功的问题 前段时间在工作中同事在rebase时遇到一个问题来问我,今天突然想起来觉得有必要记录一下. 在我们日常工作中,经常使用git座位代码管理工具 ...

  9. 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)

    例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tre ...

随机推荐

  1. cursor:not-allowed

    今天发现了一个鼠标样式:not-allowed,是一个红色圈加一个斜杠,表示禁止的意思,似乎IE ,chrome firefox 都可以正常显示,很好用

  2. Paper Reading:Deep Neural Networks for Object Detection

    发表时间:2013 发表作者:(Google)Szegedy C, Toshev A, Erhan D 发表刊物/会议:Advances in Neural Information Processin ...

  3. Angular Multiple HTTP Requests with RxJS

    原文:https://coryrylan.com/blog/angular-multiple-http-requests-with-rxjs ----------------------------- ...

  4. ACM-ICPC 2018 南京赛区网络预赛 K. The Great Nim Game(博弈)

    题目链接:https://nanti.jisuanke.com/t/31000 题意:有N堆石子(N为大数),每堆的个数按一定方式生成,问先手取若干堆进行尼姆博弈,必胜的方式有多少种. 题解:因为 k ...

  5. demo(一) react-native-router-flux

    react-native init AwesomeProject cd AwesomeProject 安装模块 npm i react-native-router-flux --save

  6. 乱搞 - LCT求LCA

    神犇学弟说LCA要用LCT求,于是我就听他的话写了一个LCT~ Code: #include <bits/stdc++.h> #define N 500005 #define lson t ...

  7. 并发编程入门(三): 使用C++11实现无锁stack(lock-free stack)

    前几篇文章,我们讨论了如何使用mutex保护数据及使用使用condition variable在多线程中进行同步.然而,使用mutex将会导致一下问题: 等待互斥锁会消耗宝贵的时间 - 有时候是很多时 ...

  8. JAVA实现四则运算的简单计算器

    开发环境eclipse java neon. 今天用JAVA的swing界面程序设计制作了一个四则运算的简易计算器.代码以及截图如下: computer.java: ///////////////// ...

  9. [Luogu] 飞扬的小鸟

    https://www.luogu.org/problemnew/show/P1941 Bfs or Dp #include <bits/stdc++.h> using namespace ...

  10. ZOJ 4124 拓扑排序+思维dfs

    ZOJ - 4124Median 题目大意:有n个元素,给出m对a>b的关系,问哪个元素可能是第(n+1)/2个元素,可能的元素位置相应输出1,反之输出0 省赛都过去两周了,现在才补这题,这题感 ...