Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Drag&Drop entre dos DBGrid con multiselección (https://www.clubdelphi.com/foros/showthread.php?t=65190)

agustibaldo 26-11-2009 15:37:45

Drag&Drop entre dos DBGrid con multiselección
 
Amigos de ClubDelphi, en esta oportunidad les consulto.

Tengo dos grillas desde las cuales tengo que intercambiar (mover) entre una y otra de forma indistinta.
Puede darse el caso de tener que mover un solo registro o varios (haciendo multiselección)

Tengo implementado el proceso de Drag&Drop y funciona "parcialmente" para cuando intento mover un solo registro.

Les paso el código para graficárselos mejor:

Código Delphi [-]
procedure TForm1.DBGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
   Accept := Source IS TDBGrid;
end;

Código Delphi [-]
procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
   DBGrid1.BeginDrag(False,10);
end;

Código Delphi [-]
procedure TForm1.DBGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
   try
       if TDBGrid(Source).Name = 'DBGrid1' then
       begin
          if not Table2.FindKey([Table1Cuenta.AsInteger, Table1Zona.AsInteger, Table1Mes.AsDateTime]) then
          begin
                 Table2.Insert;
                 Table2Cuenta.AsInteger := Table1Cuenta.AsInteger;
                 Table2Zona.AsInteger := Table1Zona.AsInteger;
                 Table2Mes.AsDateTime := Table1Mes.AsDateTime;
                 Table2Sucursal.AsInteger := Table1Sucursal.AsInteger;
                 Table2Importe.AsFloat := Table1Importe.AsFloat;
                 Table2.Post;
          end
          else
          begin
             MessageDlg('El registro que intenta insertar ya existe.', mtError, [mbOk], 0);
          end;
       end;
   finally
       DBGrid1.EndDrag(True);
   end;
end;

Y digo "parcialmente" porque si bien la inserción y el movimiento entre ambas (para el ejemplo solo implementado de izq. a der.) funciona correctamente se me presentan dos cuestiones:
  • Para el caso que mueve un solo registro; al implementar el Begindrag en OnColEnter de la grilla, la 1º vez que lo realizo me captura este evento pero si intento nuevamente arrastrar otro registro pero partiendo de la misma columna, es decir, haciendo click en otro registro pero sobre la misma columna que la anterior no captura el evento. Debo hacer click sobre otra columna de la grilla para que vuelva a capturar y pueda arrastrar el registro.
  • El mayor inconveniente se presenta cuando intento arrastrar mas de un registro.
    Les comento la lógica: habilito el MultiSelect en la grilla y selecciono 2 o más registros manteniendo presionada la tecla Control. Pero cuando suelto Control y quiero hacer click sobre una de las filas seleccionadas para comenzar a arrastrar se despintan las otras seleccionadas y queda solo la que hice clic.

Se les ocurre alguna forma de solucionar estos inconvenientes?

Desde ya, un millón de gracias.


La franja horaria es GMT +2. Ahora son las 23:38:47.

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