Hola mglucero.
Me queda la duda si cuando decis "a mano" te referis a un
TClientDataSet en memoria. Si es así, creo que el modo mas simple es crear un campo de tipo Integer (llamémoslo INDEX), declararlo como índice y trabajar sobre él.
Un ejemplo corto de lo que te comento:
Código Delphi
[-]
...
type
TSentido = (Abajo, Arriba);
TForm1 = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
ClientDataSet1ID: TIntegerField;
ClientDataSet1NOMBRE: TStringField;
ClientDataSet1INDEX: TIntegerField;
DBGrid1: TDBGrid;
btnAbajo: TButton;
btnArriba: TButton;
procedure FormCreate(Sender: TObject);
procedure DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure btnAbajoClick(Sender: TObject);
procedure btnArribaClick(Sender: TObject);
private
procedure SwapRegister(CDS: TClientDataSet; Sentido: TSentido);
public
end;
...
implementation
procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
begin
with ClientDataSet1 do
begin
IndexFieldNames:= 'INDEX';
CreateDataSet;
Open;
for i:= 1 to 13 do
begin
Append;
FieldByName('INDEX').AsInteger:= i;
FieldByName('ID').AsInteger:= i;
FieldByName('NOMBRE').AsString:= 'Campo ' + IntToStr(i);
Post;
end;
First;
end;
end;
procedure TForm1.SwapRegister(CDS: TClientDataSet; Sentido: TSentido);
var
ix1, ix2: Integer;
BM: TBookmark;
begin
ix1:= CDS.FieldByName('INDEX').AsInteger;
BM:= CDS.GetBookmark;
try
case Sentido of
Abajo : CDS.Next;
Arriba: CDS.Prior;
end;
ix2:= CDS.FieldByName('INDEX').AsInteger;
CDS.Edit;
CDS.FieldByName('INDEX').AsInteger:= ix1;
CDS.Post;
CDS.GotoBookmark(BM);
CDS.Edit;
CDS.FieldByName('INDEX').AsInteger:= ix2;
CDS.Post;
finally
CDS.FreeBookmark(BM);
end;
end;
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
ix1,ix2: Integer;
BM: TBookmark;
begin
if (ssShift in Shift) and (Key in [VK_UP,VK_DOWN]) then
begin
if Key = VK_UP then
SwapRegister(ClientDataSet1, Arriba)
else
SwapRegister(ClientDataSet1, Abajo);
Key:= 0;
end;
end;
procedure TForm1.btnAbajoClick(Sender: TObject);
begin
SwapRegister(ClientDataSet1, Abajo);
end;
procedure TForm1.btnArribaClick(Sender: TObject);
begin
SwapRegister(ClientDataSet1, Arriba);
end;
end.
Saludos