Ver Mensaje Individual
  #3  
Antiguo 14-03-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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;
    // Campos persistentes
    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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita