Foros Club Delphi

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

radge 03-07-2008 12:54:05

DBGrid
 
Buenas tengo un dbgrid , con unos 100 registros , y en el evento "onCellChanged" hago una serie de instrucciones.

Cuando termino el dbgrid se refresca y pòr lo tanto el puntero vuelve arriba del todo , cuando tienes 3 o 4 registros no pasa nada pero cuando tienes más de 50 si.


Habria alguna forma de que se quede en el ultimo puntero seleccionado ? o en el siguiente ?

salu2 radge

tcp_ip_es 03-07-2008 13:03:30

antes del refresh quedate con la clave del registro en el que estes y luego realiza el refresh y después haz un locate con la clave que habías guardado

Saludos, Tony

coso 03-07-2008 13:06:27

Hola, lo mas interesante seria que no movieses el puntero con las instrucciones del OnCellChanged. Si no puedes evitarlo, entonces puedes probar de salvar algun dato identificador del registro actual antes de esas instrucciones y luego mediante un locate recolocarlo. Podrias tambien colocar DBGrid.DataSource = nil y luego restaurar la original, por tal de no ver el puntero moviendose por pantalla. Todo y eso, la opcion de no mover el puntero es la mejor y mas limpia. Saludos.

Caro 03-07-2008 13:32:35

Hola radge, lo que yo haría es crearme un marcador para almacenar la posición actual del registro y despues restaurar a esta posición, esto se hace con un BookMark.

Código Delphi [-]
var
 Marca : TBookMarkStr;
begin
 Marca := Query1.Bookmark; //Creamos la marca del registro actual
 ........ 
 //hacemos todas nuestras operaciones
 ........
 Query1.Bookmark := Marca; //restauramos a la posición del registro que tiene la marca

Saluditos

Caro 03-07-2008 13:44:28

Cita:

Empezado por coso (Mensaje 297957)
Podrias tambien colocar DBGrid.DataSource = nil y luego restaurar la original, por tal de no ver el puntero moviendose por pantalla.

A parte de lo que te dice el amigo coso, sino quieres ver el puntero moviendose, también lo puedes con:

Código Delphi [-]
 Query1.DisableControls; //desactivamos nuestros controles asociados a nuestro DataSet
 //hacemos nuestras operaciones
 Query1.EnableControls; //Volvemos a activar dichos controles

Saluditos

coso 03-07-2008 13:45:40

vaya gracias caro, desconocia esas funciones

Caro 03-07-2008 13:52:59

No es nada amigo coso, me alegra que te haya servido :).

Saluditos

radge 03-07-2008 15:02:46

Gracias !!! Es perfecto !!! Lo del bookmark me ha ido de perlas muchas gracias.

Pero una pregunta , imaginaros que tengo el dbgrid con 10 registros , con un check los marco y van desapareciendo , a la que desmarco el último al intentar recuperar el bookmark me falla , normal.

Como podria solucionar lo ? Porque no devuelve un integer.

salu2 radge

coso 03-07-2008 15:04:11

Código Delphi [-]
...
if marca = nil then exit;
...

radge 03-07-2008 15:10:19

Cita:

Empezado por coso (Mensaje 297981)
Código Delphi [-]
...
if marca = nil then exit;
...



[Error] SupVision.pas(210): Incompatible types: 'String' and 'Pointer'

coso 03-07-2008 15:15:20

ah, pues marca = ''

coso 03-07-2008 15:17:18

o if recordcount = 0 ...

Caro 04-07-2008 07:24:55

Holas, TBookMarkStr es una cadena que tiene el valor del BookMark del DataSet, por lo que no estará vacío cuando hagas el borrado, ademas según la ayuda el formato depende del tipo del DataSet. Talvez sea mejor que manejes una banderita y la activas cuando tu DataSet este con estado dsInsert o dsEdit y solo actualizas la marca cuando tu banderita este activa.

Saluditos

Cañones 08-07-2008 22:25:44

Gracias caro por el dato, Yo queria hacer eso, pero no daba con el tipo de variable que definia y por ese motivo no me funcionaba.
Gracias nuevamente.
Saludos


La franja horaria es GMT +2. Ahora son las 05:04:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi