Ver Mensaje Individual
  #1  
Antiguo 26-11-2009
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Reputación: 18
agustibaldo Va por buen camino
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.
Responder Con Cita