Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Drag and Drop entre DBGrids (https://www.clubdelphi.com/foros/showthread.php?t=48281)

pborges36 20-09-2007 16:43:31

Drag and Drop entre DBGrids
 
Hola a todos. Estoy tratando de hacer un Drag and drop entre DBGrids. Gracias a Neftali, quien puso un ejemplo en su pagina, 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

Cita:

Empezado por gluglu (Mensaje 232533)
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 :

Código Delphi [-]
  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

Va tomando forma.
 
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.

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

Aquí tienes el código :

Código Delphi [-]
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 :

Código Delphi [-]
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!!


La franja horaria es GMT +2. Ahora son las 09:14:24.

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