Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Estado DBGrid para DragandDrop (https://www.clubdelphi.com/foros/showthread.php?t=95700)

novato_erick 24-05-2022 15:48:19

Estado DBGrid para DragandDrop
 
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:
Código Delphi [-]
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

Estado DBGrid para DragandDrop (Solucionado)
 
Gracias por Responder Neftali:

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 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.

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 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/arras...-dos-tlistbox/

Neftali [Germán.Estévez] 25-05-2022 09:12:03

1 Archivos Adjunto(s)
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:

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



Te adjunto el ejemplo con el código completo y lo subo al FTP:
http://terawiki.clubdelphi.com/Delph...DropDBGrid.zip

novato_erick 03-06-2022 16:07:53

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 546987)

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



Te adjunto el ejemplo con el código completo y lo subo al FTP:
http://terawiki.clubdelphi.com/Delph...DropDBGrid.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...


La franja horaria es GMT +2. Ahora son las 04:48:11.

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