PDA

Ver la Versión Completa : Drag and Drop entre DBGrids


pborges36
20-09-2007, 16:43:31
Hola a todos. Estoy tratando de hacer un Drag and drop entre DBGrids. Gracias a Neftali, quien puso un ejemplo en su pagina (http://neftali.clubdelphi.com/), pude lograrlo.
El procedimiento entre las DBGrids funciona de 10, pero cuando hago click en alguna de ellas para seleccionar un registro, no pasa nada. Solo puedo seleccionar un registro con el teclado, no con el mouse. Habra alguna propiedad que me permita seleccionar un registro con el mouse?
Desde ya muchas gracias.

gluglu
20-09-2007, 16:57:02
Como empiezas entonces el Drag&Drop, con el ratón, no ?

No he entendido bien tu pregunta, dices que si hacer Click con el ratón en alguno de los DBGrid's no te selecciona el registro correspondiente que tienes justo debajo del cursor del ratón ?

Eso lo debería hacer el propio DBGrid sin más. :confused:

pborges36
20-09-2007, 17:04:50
hacer Click con el ratón en alguno de los DBGrid's no te selecciona el registro correspondiente que tienes justo debajo del cursor del ratón ?


Eso es exactamente lo que sucede, cosa que no sucedia antes de hacer esto de Drag and Drop.

Paoti
20-09-2007, 17:08:47
prueba a activar el drag and drop no en el evento onclic sino en el doble click, seria la solución


proque al hacer clic se activa el drag y no la selección.

gluglu
20-09-2007, 17:31:10
En este caso lo que yo no utilizaría el Doble Click, ya que nadie está acostumbrado a empezar un Drag&Drop con un Doble Click del ratón.

La solución pasa por activar el Drag&Drop de forma manual y no automática. Para ello pon la propiedad DragMode a dmManual (por defecto), y en el evento OnMouseClick de cada uno de los DBGrid's pon :

if (Button = mbLeft) and (not IBDataSet1.IsEmpty) then
DBGrid1.BeginDrag(False,10);

siendo IBDataSetX el DataSet asociado a cada Grid, y DBGridX el DBGrid correspondiente.

Ello te provocará que el Drag&Drop no comienze hasta que muevas el cursor del raton 10 pixel's, y de esta manera mantengas total funcionalidad en la selección de los registros.

Espero te ayude. Saludos ;)

pborges36
20-09-2007, 17:44:07
muchas gracias gluglu, Hice lo que dijiste y funciona, solo un detalle: Para arrastrar debo hace click en la parte vacia del DBGrids, si hago click sobre un registro no hace nada. Para mi que tiene algo que ver con alguna propiedad del DBGrid. Puede ser?

gluglu
20-09-2007, 18:19:20
Pues tienes razón. No lo había probado con el TDBGrid normal.

Resulta que tengo un DBGrid mínimamente modificado para poder hacer selecciones múltiples en el DBGrid con Shift. Esto ya lo comenté en su día aqui (http://www.clubdelphi.com/foros/showthread.php?t=44249&highlight=BeginDrag).

Para ello me he tenido que derivar mi propio DBGrid que me permite MultiSelección.

Aquí tienes el código :

unit DBMultiSelectGrid;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids;

type

TDBMultiSelectGrid = class(TDBGrid)
private
{ Private declarations }
FOnMouseDown: TMouseEvent;
protected
{ Protected declarations }
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
published
{ Published declarations }
property Row;
property OnMouseDown read FOnMouseDown write FOnMouseDown;
end;

procedure Register;

implementation

procedure TDBMultiSelectGrid.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOnMouseDown) then
FOnMouseDown(Self, Button, Shift, X, Y);
inherited MouseDown(Button, Shift, X, Y);
end;

procedure Register;
begin
RegisterComponents('Data Controls', [TDBMultiSelectGrid]);
end;

end.

Como podrás observar, redefino el evento OnMouseDown. De esta manera funciona. No sabría ahora mismo como hacerlo sin derivar tu propio componente DBGrid particular como lo he indicado.

Por otro lado me he dado cuenta con tu indicación que con el DBGrid normal y estandar no funciona. :o

Saludos. ;)

gluglu
20-09-2007, 18:40:59
Por qué hacerlo fácil se si puede hacer complicado, no es verdad ?

Todo mi comentario anterior se puede olvidar y resumir el asunto en esto :

procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
DBGrid1.BeginDrag(False,10);
end;

:o :o :o

Paoti
20-09-2007, 19:09:35
wow gluglu, felicidades...

y si, en el dobliclick seria incongruente...

buena respuesta

pborges36
20-09-2007, 22:25:47
Efectivamente, gluglu, eso es lo que necesitaba. Funciona a la perfeccion. Muchas Gracias!!