PDA

Ver la Versión Completa : TDBGrid + DragDrop + PopUp + Multiselect


mjjj
16-04-2014, 23:01:11
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


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
Hola mjjj.

Vas a tener que reescribir el método MouseDown del TDBGrid:

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

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