ClientDataSet高手请进啊,困惑许久的问题帮忙.....(200分)

  • 主题发起人 主题发起人 无忧鱼
  • 开始时间 开始时间

无忧鱼

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道ClientDataSet有一个RefressRecord事件可以刷新单条记录.
其源代码如下:
procedure TCustomClientDataSet.RefreshRecord;
begin
InternalFetch([foRecord]);
Resync([]);
end;

procedure TCustomClientDataSet.InternalFetch(Options: TFetchOptions);
var
DataPacket: TDataPacket;
NewData: OleVariant;
BaseDS: TCustomClientDataSet;
begin
if not Assigned(DSCursor) then CheckActive;
UpdateCursorPos;
Check(DSCursor.GetRowRequestPacket(foRecord in Options, foBlobs in Options,
foDetails in Options, True, DataPacket));
DataPacketToVariant(DataPacket, NewData);
BaseDS := Self;
while Assigned(BaseDS.FParentDataSet) do BaseDS := BaseDS.FParentDataSet;
NewData := BaseDS.DoRowRequest(NewData, Byte(Options));
UpdateCursorPos;
Check(DSCursor.RefreshRecord(VarToDataPacket(NewData)));
if not Active then Exit;
DSCursor.GetCurrentRecord(ActiveBuffer);
if Options = [foDetails] then
DataEvent(deDataSetChange, 0);
end;
由于本人从TClientDataSet继承了一个ClientDataSet控件,其刷新机制也完全变化.
现在本人想自定义一个RefreshRecord方法,但一直不知道上面这段代码的机制.
特别是在上面的第二个方法当中,本人一直不是很了解.
下面是我自己写的一个方法:
procedure TLYClientDataSet.InternalFetchMyRecord(Options: TFetchOptions);
var
DataPacket: TDataPacket;
NewData: OleVariant;
BaseDS: TlyClientDataSet;
i:integer;
begin
CheckActive;
UpdateCursorPos;
Check(DSCursor.GetRowRequestPacket(foRecord in Options, foBlobs in Options,
foDetails in Options, True, DataPacket));
DataPacketToVariant(DataPacket, NewData);
BaseDS := Self;
while Assigned(BaseDS.ParentDataSet) do BaseDS := BaseDS.ParentDataSet as TLYClientDataSet ;
NewData := BaseDS.GetRowRecorder(NewData, Byte(Options));//这里的取数据方法改成我自己写的方法.返回的数据只是当前记录对应于数据库中的最新值.
//NewData := BaseDS.DoRowRequest(NewData, Byte(Options));这是原方法
UpdateCursorPos;
Check(DSCursor.RefreshRecord(VarToDataPacket(NewData)));
DSCursor.GetCurrentRecord(ActiveBuffer);
if Options = [foDetails] then
DataEvent(deDataSetChange, 0);
end;

由于我不是很熟悉这个方法的机制,所以这个自定义的方法有问题.
最明显的地方就是刷新时会产生两条记录.也就是说原记录没有从数据集中移除.
如果用Refresh方法,虽然没有这些问题,但是大家也知道,Refresh方法的速度实在让人害怕.
请各位大虾帮个忙,这个问题困扰我太久了.......
 
自己顶一下,等待帮忙....
 
晕啊,自己再顶...

大家帮忙顶一下啊.
 
帮你顶。。。
 
谢了,我自己再顶一下.
 
多人接受答案了。
 
后退
顶部