Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Mover registros en ClientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=16856)

mglucero 14-12-2004 16:34:53

Mover registros en ClientDataSet
 
Hola a todos, este es mi desafio. Tengo un ClientDataSet que lleno a "mano" y esta relacionado con un DBGrid que muestra sus datos. Lo que necesito hacer es posicionarme en la grilla sobre un registro y cuando presione el boton "Arriba" me mueva ese registro una posición mas arriba de la grilla. Igual con el botón "Abajo", pero que me mueva el registro un lugar hacia abajo en la grilla. El algoritmo en la cabeza lo tengo mas o menos planteado, pero necesito saber si exite una forma directa de hacerlo o que propiedades o procedimientos me combiene usar. Espero que haya sido claro. Gracias y hasta luego.:)

bulc 13-03-2014 22:14:41

¿Y las teclas de control preestablecidas?
 
En un DBGrid, al pulsar VK_Down bajas un registro. Es el comportamiento por defecto. Por tanto, debería anularlo o usar [Ctrl+TeclaDown] para eso que quieres hacer. Pero, ¿qué harías con el Nº de registro? Si el 3 pasa debajo del 4, deberías anular el orden de índice previo. Si es con botones, ¿bastaría con cambiarles el nº, luego al indizar de nuevo te aparecerían colocado tal como buscas.
No le veo mucho sentido. ¿Habría que coger el valor de todos los campos, o serviría cambiarles de número?
1,2,3,4 y luego de la pulsación esa 1,2,4,3... Creo que anularía los índices y cambiaría los números. No le veo a qué importancia tiene su colocación. ¿O sí?
Saludos.

ecfisa 14-03-2014 03:47:44

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 :)


La franja horaria es GMT +2. Ahora son las 01:55:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi