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