PDA

Ver la Versión Completa : Estado DBGrid para DragandDrop


novato_erick
24-05-2022, 15:48:19
Hola chicos nuevamente un saludo amistoso a todos.

Hoy quise trabajar un DBGrid usando Arrastrar y Soltar o Drag and Drop lo interesante es que cuando mi DBGrid1.DataSource.DataSet esta desactivado el Evento MouseDown funciona pero al activarse por lo registros encontrado no entra a dicho evento.

Este es mi código de ejemplo:

procedure TFrmConsultarArticulo.DbgConsultaArticuloMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
//if (Sender = DbgConsultaArticulo) and (Button = mbLeft) then
if ssLeft in shift then
begin
if DbgConsultaArticulo.DataSource.DataSet.Active = True then
begin
if DbgConsultaArticulo.DataSource.DataSet.RecordCount > 0 then
begin
if frmOrdenCompras <> nil then
begin
Variables.MyCodigoProductoCompra :=
DbgConsultaArticulo.Fields[2].AsString;
Self.DbgConsultaArticulo.BeginDrag(True);
inherited;
end;
end;
end;
end;
end;


esto me imposibilita usar el comportamiento de arrastrar y soltar.
Las propiedades del DBGrid son las Siguientes:
DragMode = dmManual
DragKind = dkDrag

Si tienen alguna idea se lo agradecería

Saludos y Bendiciones a todos;

novato_erick

Neftali [Germán.Estévez]
24-05-2022, 17:23:08
¿Porqué no usas el modo automático que te facilita las cosas?
¿Tampoco explicas exactamente qué quieres hacer? ¿Arrastrar elementos desde el mismo DBGrid o arrastrar desde otros componentes?

novato_erick
24-05-2022, 19:02:52
Gracias por Responder Neftali:

;546983']¿Porqué no usas el modo automático que te facilita las cosas?


En modo automático fué la solución en el Evento OnMouseDown;
Gracias NefTali.

;546983']
¿Tampoco explicas exactamente qué quieres hacer? ¿Arrastrar elementos desde el mismo DBGrid o arrastrar desde otros componentes?

Arrastras a un componente Edit que se encuentra en otro formulario desde el formulario del DBGrid para que haga una consulta con tan solo con la celda de Código o Referencia seleccionado.

Esta forma muestra dos ventanas una con un analitico donde proviene la info y el otro con un formulario de pedido el usuario tiene dos pantallas para hacer más eficiente el proceso de selección de información.


Saludos

pd: me apoyé de este link tuyo Neftali me han siempre ayudado https://neftali.clubdelphi.com/arrastrar-elementos-entre-dos-tlistbox/

Neftali [Germán.Estévez]
25-05-2022, 09:12:03
Si activas el modo Automático de Drag&Drop en ambos componentes, sólo debes obtener el texto que quieres "arrastrar" (este es el paso más complicado) y luego configurar los componentes para que acepten funcionen con el Drag&Drop automático.
Como hablamos de diferentes formularios, puedes usar alguna propiedad para apoyarte en el proceso.

Como he dicho el más complejo es obtener el texto que estás "arrastrando" a partir de las coordenadas del ratón (en un DGBrid); Para eso puedes utilizar un procedimiento como este:

type
THackGrid = class(TDBGrid);

...

function TForm1.GetDBGridText(AGrid:TDBGrid; X, Y: Integer): string;
var
Cell: TGridCoord;
ActRec: Integer;
begin
// Por defecto vacío
Result := string.Empty;
// coordenados del Grid (fila/columna) a partir del ratón
Cell := AGrid.MouseCoord(X, Y);
// ajustar, segun si hay el indicador
if dgIndicator in AGrid.Options then
Dec(Cell.X);
// Ajustar segun si hay títulos
if dgTitles in AGrid.Options then
Dec(Cell.Y);
// Si está activado... seguimos.
if THackGrid(AGrid).DataLink.Active and (Cell.X >= 0) and (Cell.Y >= 0) then begin
ActRec := THackGrid(AGrid).DataLink.ActiveRecord;
try
// Obtener el dato del dataset
THackGrid(AGrid).DataLink.ActiveRecord := Cell.Y;
Result := AGrid.Columns[Cell.X].Field.AsString;
finally
THackGrid(AGrid).DataLink.ActiveRecord := ActRec;
end;
end;
end;

A partir de ahí es utilizar una propiedad para pasar ese TEXTO al segundo formulario, y configurar ambos componentes con el Drag&Drop automático.
En este ejemplo te lo muestro con cualquier texto, pero podrías hacer que para cualquier columna, te devuelva por ejemplo, siempre el código de empleado (si te interesa).

https://i.postimg.cc/bvKQz7J8/Arrastrar-Texto-DBGrid.gif

Te adjunto el ejemplo con el código completo y lo subo al FTP:
http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=DragDropDBGrid.zip

novato_erick
03-06-2022, 16:07:53
;546987']

pero podrías hacer que para cualquier columna, te devuelva por ejemplo, siempre el código de empleado (si te interesa).

https://i.postimg.cc/bvKQz7J8/Arrastrar-Texto-DBGrid.gif

Te adjunto el ejemplo con el código completo y lo subo al FTP:
http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=DragDropDBGrid.zip


Ohhh nooo para nada.... me has ayudado 200 años luz a lo que deseaba. waoo ^\||/^\||/^\||/

Te lo agradezco muchísimo ese gran aporte, ahora es super más interactivo tomar información para procesarla más rápidamente en otro formulario, ya no tienes que hacer click en una lupita para buscar y escoger.

de nuevo gracias muchas gracias...