Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Desplazamiento vertical en DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=37593)

dvd2000 17-11-2006 09:27:07

Desplazamiento vertical en DBGrid
 
Hola, quería saber como puedo detectar que se ha pulsado en el desplazamiento vertical de un dbgrid. Porque ahora mismo tal como tengo el programa, al pinchar en el desplazamiento del dbgrid, se me mueve al registro anterior o posterior, pero como puedo detectarlo, para hacer que otras bases de datos que dependen de esta primera, tambien se actualice.

Existe una funcion del TTable que es el AFterScroll que no me detecta cuando el puntero pasa de un registro al anterior o posterior. En fin necesito una aclaración.

Espero haberme explicado. Gracias.

Lepe 17-11-2006 10:48:03

el evento AfterScroll es lanzado cuando se cambia de registro activo. Al realizar un scroll con la barra de desplazamiento, no se cambia el registro activo (el que está en azul en el grid), por eso no se "actualiza"

Desde mi punto de vista, es un funcionamiento muy correcto. Cuando hagas un clic de ratón sobre otro registro, se lanza el evento AfterScroll, y desde ese evento, haces la actualización que quieras.

Si quieres que se actualice cuando se usa la barra de desplazamiento, imagina que el usuario vé en el grid 300 registros, al pulsar la barra de desplazamiento para ir al último, según tu forma, se tendría que actualizar 300 veces las demás bases de datos, es ineficiente y en este caso concreto una pérdida de tiempo.

Basta con avisar al usuario que haga un clic en el grid para que se actualice la información.

Saludos

dvd2000 17-11-2006 11:01:10

Se lo que me quieres decir, pero la idea es que si se cambia de registro, en otro dbgrid, se muestren otros datos, es decir, según la información seleccionada en una tabla, en otra tabla se mostrará lo que sea. Y para eso necesito controlar el Desplazamiento Vertical, ya que con esto se puede cambiar de registro, pero no me salta ningun evento, que yo sepa, a partir del cual pueda decirle al programa que actualice la tabla que yo quiera.

Debe existir un evento, en cuanto al desplazamiento vertical se refiere.

Lepe 17-11-2006 13:22:26

A ver si me explico....

Establece en las opciones "dgSelectRow" para que al hacer clic, se seleccione la fila completa. También añade la opción "AlwaysshowSelection"

prepara un botón con el siguiente código:
Código Delphi [-]
   if DBGrid1.SelectedRows.Count > 0 then
      with DBGrid1.DataSource.DataSet do
      begin
         ShowMessage(' Registro activo: ' + Fieldbyname('nombrecliente').AsString;
      end;

Ahora saca un listado que permita hacer un scroll.

Según mis pruebas y usando un rxDBgrid, hago lo siguiente:
- Hago clic en un registro con nombre de cliente: "Pepe".
- Se queda esa fila al completo seleccionada (en azul toda la fila)
- Hago un scroll (usando la barra de desplazamiento)
- En este momento hay 2 cosas seleccionadas (en azul)
  • Por un lado tengo la fila completa seleccionada (en azul), que marca a "Pepe"
  • Por otro, me aparece una sola celda seleccionada (en azul) que corresponde al registro que he hecho el scroll, el Nombre de cliente de este registro es "Manuel"
- Ahora pulso el botón con ese código delphi
- El resultado: Me aparece en el ShowMessage Pepe

Lo que ha sucedido, es que el registro activo no ha cambiado (Pepe), pero la selección del Grid si (el que marca a Manuel).

Prueba a ver si también te ocurre este comportamiento.

Para mí es una falsa sensación de que el registro activo "ha camiado", es decir, Manuel aparece seleccionado, cuando en realidad, el registro Activo es Pepe (y por eso el evento AfterScroll no ha saltado).

Como conclusión, me reafirmo en lo ya dicho: Al hacer un scroll vertical, el registro activo no cambia. Yo al menos, no sé modificar ese "comportamiento extraño del DBgrid"

Quizás añadiendo el "FullRowSelect" (no recuerdo el nombre de la propiedad ahora mismo), sea más intuitivo para tu usuario.

Saludos

dvd2000 18-11-2006 12:21:09

Te agradezco mucho la explicación pero, sigo sin encontrar la solución.

Verás en mi DBGrid,no hay posibilidad de selección multiple, yo lo unico que pretendo es detectar que se ha pinchado en el deslizamiento vertical, para luego proceder a ejecutar un procedimiento.

Eso es todo. Supongo que tendrá que haber un evento que detecte que se ha pulsado en el deslizamiento vertical.

Gracias.

saldanaluis 24-04-2011 01:23:33

Yo también tengo un requerimiento parecido. Mi DBGrid está ligado a una tabla en el Data-Module. Yo cambio de registro en el DBGrid hacia arriba o hacia abajo con las flechas del teclado, y cada vez que me cambio a otro registro, quiero verificar el valor de uno de los campos del registro para saber si habilito o deshabilito un botón.
Tampoco he encontrado la manera de hacerlo.
Cualquier ayuda es bienvenida.
Muchas gracias a todos.

ecfisa 24-04-2011 08:18:15

Hola saldanaluis.

Cita:

Yo también tengo un requerimiento parecido. Mi DBGrid está ligado a una tabla en el Data-Module. Yo cambio de registro en el DBGrid hacia arriba o hacia abajo con las flechas del teclado, y cada vez que me cambio a otro registro, quiero verificar el valor de uno de los campos del registro para saber si habilito o deshabilito un botón.
En realidad no pareciera ser similar a el caso que plantea dvd2000 más arriba:
Cita:

yo lo unico que pretendo es detectar que se ha pinchado en el deslizamiento vertical, para luego proceder a ejecutar un procedimiento.

Creo que en tu caso basta con verificar la condición en el evento AfterScroll de tu TDataSet.
Código Delphi [-]
...
implementation

procedure TForm1.DataSetAfterScroll(DataSet: TDataSet);
begin
   Button1.Enabled:= TuDataSet.FieldByName('Campo_A_Verificar').AsString = 'Dato_A_Evaluar';
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  TuDataSet.AfterScroll:= DataSetAfterScroll;
end;


Un saludo.

saldanaluis 25-04-2011 06:35:35

Muchas Gracias. Me funcionó perfectamente.
Ahora, solo para terminar de entender lo que me diste a conocer aqui.
En los estatutos del FormShow que me mencionas, lo que se está haciendo es el hacer que el evento AfterScroll del dataset que tengo en el DataModule, apunte al procedure que definí en mi forma donde tengo el botón. Por lo que cuando sucede un evento de scroll en el dataset, en lugar de ejecutar, en el caso que lo hubiera, el procedimiento de AfterScroll que estuviese definido en el DataModule, se va a ejecutar el procedure que definí en la forma donde tengo el botón.

Al menos esto es lo que estoy entendiendo, ya que nunca he hecho algo así. Si no estoy en lo correcto, te agradecería me expliques que es lo que se hace con el código que me diste a conocer.

Como verás, soy un programador muy 'light' del delphi 7, y no se muchos de los trucos y por lo tanto el potencial que tiene el delphi para hacer aplicaciones.

Muchas gracias nuevamente.

ecfisa 25-04-2011 23:22:07

Hola saldanaluis.

Si el DataSet permanecerá abierto, es totalmente correcta tu apreciación. ;)

En ese caso, la forma de guardar/restaurar el método asociado al evento sería:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FDataSetNotifyEvent: TDataSetNotifyEvent; // para guardar puntero al método
    procedure DataSetAfterScroll(DataSet: TDataSet);
  public
  end;
...
implementation

procedure TForm1.DataSetAfterScroll(DataSet: TDataSet);
begin
   Button1.Enabled:= DataModule.TuDataSet.FieldByName('Campo_A_Verificar').AsString = 'Dato_A_Evaluar';
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  FDataSetNotifyEvent:= DataModule.DataSet.AfterScroll;  // FDataSetNotifyEvent apunta al último método definido
  DataModule.DataSet.AfterScroll:= DataSetAfterScroll;   // Asignamos nuevo método
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   DataModule.DataSet.AfterScroll:= FDataSetNotifyEvent;  // restauramos el método anterior
end;
...

Un saludo.


La franja horaria es GMT +2. Ahora son las 23:36:08.

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