Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   TDBGrid + DragDrop + PopUp + Multiselect (https://www.clubdelphi.com/foros/showthread.php?t=85680)

mjjj 16-04-2014 23:01:11

TDBGrid + DragDrop + PopUp + Multiselect
 
Estimados, como el titulo lo dice, necesito combinar en un TDBGrid la posibilidad de activar el Drag and Drop junto con un PopUp, y la propiedad multiselect.

Para el drag and Drop, utilizo el siguiente codifo en el evento OnColEnter

Código Delphi [-]
dbgrid.BeginDrag(false, 10);

Sin embargo, cuando utilizar este código el popup por defecto no funciona!!

Como puedo combinar todas estas opciones ??

Espero me puedan ayudar.

ecfisa 17-04-2014 01:14:38

1 Archivos Adjunto(s)
Hola mjjj.

Vas a tener que reescribir el método MouseDown del TDBGrid:
Código Delphi [-]
...
type
  TDBGrid = class(DBGrids.TDBGrid)
  public
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);override;
  end;

  TForm1 = class(TForm)
  ...
  end;
...
implementation

procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ...
  inherited;
end;
Para simplificar la explicación te adjunto un ejemplo con la tabla country de dbdemos (incluida) que copia el/los campos de las filas seleccionadas a un ListBox.
Recuerda luego de una selección múltiple, el drag&drop deberas hacerlo sin levantar el botón del mouse. Es decir, luego de la última selección mantene el botón presionado y arrastra hacia el ListBox de otro modo perderás la selección ante el segundo click.

Para el ejemplo la acción del PopupMenu es la misma (copiar al ListBox) , crea una carpeta y descomprimí el adjunto allí.

Saludos :)

mjjj 17-04-2014 17:14:33

Excelente, muchas gracias !!
Era lo que necesita.

Saludos.

mjjj 17-04-2014 17:46:12

Utilizando el ejemplo me surgió un problema, resulta que cuando intento modificar el tamaño de la columna no me deja, ya que comienza el BeginDrag.

Como puedo descartar el BeginDrag en el evento MouseDown, si el cursos esta en el titulo del TDBGrid ??

Existe otra forma de hacerlo ??

ecfisa 21-04-2014 08:07:36

Hola mjjj.

Disculpas, recién veo tu última consulta.

En el evento MouseDown, deberías controlar que el cursor no esté sobre el título:
Código Delphi [-]
procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  P: TPoint;
begin
  case Button of
    mbLeft: if MouseCoord(X,Y).Y <> 0 then BeginDrag(True); // <- aquí
    mbRight: begin
               P:= ClientToScreen(Point(X,Y));
               PopupMenu.Popup(P.X,P.Y);
             end
  end;
  inherited;
end;

Saludos :)

mjjj 21-04-2014 15:18:40

Gracias, funcionó perfecto.

Saludos


La franja horaria es GMT +2. Ahora son las 22:43:06.

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