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