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

posted on   癫狂编程  阅读(531)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示