Eine direkte Methode zum verschieben von Records gibt es nicht. Es bleibt also nur das Lesen und Schriben der einzelnen Felder des jeweiligen Datensatzes. Für solche Zwecke habe ich mir mal zwei Hilfsroutinen geschrieben, mit denen man den aktuellen Datensatz einfach sichern und wieder zurückschreiben kann.
Delphi-Quellcode:
type
TRecordStore = TDictionary<string, Variant>;
TDataSetHelper = class helper for TDataSet
public
procedure LoadRecord(Source: TRecordStore);
procedure StoreRecord(Target: TRecordStore);
end;
procedure TDataSetHelper.LoadRecord(Source: TRecordStore);
{ Überträgt die Daten aus dem RecordStore in den aktuellen Datensatz }
var
fld: TField;
fldName: string;
begin
for fldName in Source.Keys do begin
fld := FindField(fldName);
if (fld <> nil) and not fld.ReadOnly then begin
fld.Value := Source[fldName];
end;
end;
end;
procedure TDataSetHelper.StoreRecord(Target: TRecordStore);
{ Überträgt den aktuellen Datensatz in den RecordStore }
var
fld: TField;
begin
Target.Clear;
for fld in Fields do begin
Target.AddOrSetValue(fld.FieldName, fld.Value);
end;
end;
Für deinen Fall könnte man das etwa so verwenden:
Delphi-Quellcode:
var
sto: TDictionary<string, Variant>;
sto2: TDictionary<string, Variant>;
begin
sto := TRecordStore.Create;
try
sto2 := TRecordStore.Create;
try
ClientDataSet1.First;
ClientDataSet1.StoreRecord(sto);
ClientDataSet1.Last;
ClientDataSet1.StoreRecord(sto2);
ClientDataSet1.Edit;
ClientDataSet1.LoadRecord(sto);
ClientDataSet1.Post;
ClientDataSet1.First;
ClientDataSet1.Edit;
ClientDataSet1.LoadRecord(sto2);
ClientDataSet1.Post;
finally
sto2.Free;
end;
finally
sto.Free;
end;