解决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
版权声明:本文为博主原创文章,转载请附上博文链接!
解决DBGridEh遍历记录后不移动当前行位置的方法的更多相关文章
- 解决sqlite 删除记录后数据库文件大小不变
最的做的项目中要有到sqlite数据存储,写了测试程序进行测试,存入300万条记录,占用flash大小为 86.1M,当把表中的记录全部删除后发后数据库文件大小依然是 86.1M: 原因是:sqlit ...
- 解决Jupyter notebook安装后不自动跳转网页的方法
在安装完Jupyter notebook后,有童鞋说出现了各种不友好的问题,鉴于此情况,个人先随手写出以下三种情况,并给出解决方法: 题外建议:请使用谷歌浏览器为默认浏览器 一.对于弹不出浏览器的解决 ...
- 解决使用绝对定位absolute后,margin:0 auto居中方法失效(转)
https://blog.csdn.net/qq_40678503/article/details/82780680
- jqGrid 编辑完数据后能返回到当前位置的方法
jqGrid 是一个js的jquery组件,虽然不轻便,但功能还是蛮强大的,也比较方便使用.在数据加载后,经常需要对其中的记录进行编辑,修改完后再返回时需要看到修改后的数据,一般采取重新加载的方法re ...
- 【转发】Linq To EF添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题
1:添加记录后,如何获取新添加的ID的值 比如,一个实体 TestEntity 对应一个表TestEntity(ID主键自增,Name,age),使用linq to ef 添加一条记录后,如何 ...
- Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)
1:添加记录后,如何获取新添加的ID的值 比如,一个实体 TestEntity 对应一个表TestEntity(ID主键自增,Name,age),使用linq to ef 添加一条记录后,如何 ...
- 解决pycharm新建项目后按钮灰色问题
解决pycharm新建项目后按钮灰色问题 出现过多次该问题了, 在此记录一下 同样适用于导入别人的新项目后无法运行问题 原因一: pycharm没有设置系统解析器 解决方法一: 打开pycharm-& ...
- 解决git rebase操作后推送远端分支不成功的问题
转:解决git rebase操作后推送远端分支不成功的问题 前段时间在工作中同事在rebase时遇到一个问题来问我,今天突然想起来觉得有必要记录一下. 在我们日常工作中,经常使用git座位代码管理工具 ...
- 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)
例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tre ...
随机推荐
- TcxComboBoxProperties下拉框填充
原文地址:https://www1.devexpress.com/Support/Center/Question/Details/CQ30369 Actually, the corresponding ...
- Python Scrapy爬虫框架之初次使用
此篇博客为本人对小甲鱼的课程的总结. 关于Scrapy的安装网上都有方法,这里便不再叙述. 使用Scrapy抓取一个网站一共需要四个步骤: 0.创建一个Scrapy项目: 1.定义Item容器: 2. ...
- systemctl可以实现nginx进程挂了之后自动重新启动
接 2018年7月31日的那篇: vim /lib/systemd/system/nginx.service [Service]Restart=alwaysRestartSec=1Type=forki ...
- NMI是什么
NMI是什么 2016/02/28 vmunix NMI(non-maskable interrupt),就是不可屏蔽的中断.根据Intel的Software Developer手册Volume 3, ...
- 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 ...
- Python3-def
def hello(): print("这是一个无参数的方法!") hello(); print("") def helloOne(str): print(st ...
- webstorm 2016.3 注册方法
用license server 的方式吧,activation code 的方式没有找到方法. license server 里写http://idea.iteblog.com/key.php 用li ...
- 【JAVA-算法】 截取2个字符中间的字符串
Java Code /** 截取2个字符中间的字符串 */ private void GetMiddleString() { String str = "BB022220011BB007EB ...
- learning strrchr func
函数名称: strrchr 函数原型:char *strrchr(const char *str, char c); 所属库: string.h 函数功能:查找一个字符c在另一个字符串str中末次出现 ...
- Casual Literary Notes
写在前面的话: 人生中总会有一些惊喜,它会给予坚守的人们以奖励,提醒着人们,生命中不光是辛劳和付出. 很多收获,最后看来,往往都是因为当初的那一点坚持. -- 雷宇<现场> 1.18 上午 ...