@Uwe: Danke für die Antwort und den zur Verfügung gestellten Source-Code.
Habe mir in der Zwischenzeit eine eigene Lösung gestrickt. Wäre die nach Deiner Auffassung auch akzeptabel, oder wäre es aus einem bestimmten Grund eher zu empfehlen, auf Deine Lösung umzuschwenken?
Hier mein Ansatz (verschiebt den aktuellen Datensatz auf die Postion ToNr):
Delphi-Quellcode:
procedure MoveCurrentToRecordNo(ToNr: Integer; Dataset:TClientdataset);
var
aField : Variant;
OldRecNo, i: Integer;
begin
if ToNr <= 0 then exit;
if ToNr > DataSet.RecordCount then exit;
// Create a variant Array
aField := VarArrayCreate([0,DataSet.Fieldcount-1],VarVariant);
// read the current values into the array
for i := 0 to (DataSet.Fieldcount-1) do begin
aField[i] := DataSet.fields[i].Value ;
end;
OldRecNo := Dataset.RecNo;
if (ToNr > OldRecNo) and (ToNr < DataSet.RecordCount) then begin
Dataset.RecNo := ToNr+1;
end else begin
Dataset.RecNo := ToNr;
end;
if ToNr = Dataset.RecordCount then Dataset.Append else Dataset.Insert;
// Put array values into new the record
for i := 0 to (DataSet.Fieldcount-1) do begin
DataSet.fields[i].Value := aField[i] ;
end;
if ToNr < OldRecNo then begin
Dataset.RecNo := OldRecNo+1;
end else begin
Dataset.RecNo := OldRecNo;
end;
Dataset.Delete;
Dataset.MergeChangeLog;
Dataset.RecNo := ToNr;
end;