解决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. TcxComboBoxProperties下拉框填充

    原文地址:https://www1.devexpress.com/Support/Center/Question/Details/CQ30369 Actually, the corresponding ...

  2. Python Scrapy爬虫框架之初次使用

    此篇博客为本人对小甲鱼的课程的总结. 关于Scrapy的安装网上都有方法,这里便不再叙述. 使用Scrapy抓取一个网站一共需要四个步骤: 0.创建一个Scrapy项目: 1.定义Item容器: 2. ...

  3. systemctl可以实现nginx进程挂了之后自动重新启动

    接 2018年7月31日的那篇: vim /lib/systemd/system/nginx.service [Service]Restart=alwaysRestartSec=1Type=forki ...

  4. NMI是什么

    NMI是什么 2016/02/28 vmunix NMI(non-maskable interrupt),就是不可屏蔽的中断.根据Intel的Software Developer手册Volume 3, ...

  5. Error resolving template “pages”, template might not exist or might not be accessible by any of the configured Template Resolver 或者 springboot使用thymeleaf时报html没有结束标签

    application.properties配置文件 spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.ht ...

  6. Python3-def

    def hello(): print("这是一个无参数的方法!") hello(); print("") def helloOne(str): print(st ...

  7. webstorm 2016.3 注册方法

    用license server 的方式吧,activation code 的方式没有找到方法. license server 里写http://idea.iteblog.com/key.php 用li ...

  8. 【JAVA-算法】 截取2个字符中间的字符串

    Java Code /** 截取2个字符中间的字符串 */ private void GetMiddleString() { String str = "BB022220011BB007EB ...

  9. learning strrchr func

    函数名称: strrchr 函数原型:char *strrchr(const char *str, char c); 所属库: string.h 函数功能:查找一个字符c在另一个字符串str中末次出现 ...

  10. Casual Literary Notes

    写在前面的话: 人生中总会有一些惊喜,它会给予坚守的人们以奖励,提醒着人们,生命中不光是辛劳和付出. 很多收获,最后看来,往往都是因为当初的那一点坚持. -- 雷宇<现场> 1.18 上午 ...