Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Posición fija en DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=49755)

chona 29-10-2007 18:33:27

Posición fija en DBGrid
 
Hola amigos, estoy con delphi 5, en una pantalla muestro un dbgrid que está enlazado con un query que se actualiza cada un segundo por medio de un timer, la consulta es la siguiente. Si selecciono un registro del dbgrid (por ejempro el tercero) no lo puedo mantenerlo seleccionado porque se vuelve a ejecutar el query (dentro del timer) y me vuelve al primer registro del dbgrid.
Cómo podría mantenerlo seleccinado?
Gracias.

marcoszorrilla 29-10-2007 19:25:53

Suponiendo que tengamos una clave única que lo identifique unívocamente, podrías buscar dicho registro con un Locate, despues de cada actualización, sino lo veo difícil pues cada actualización haría que este se encontrara en lugares distintos y además sería un registro nuevo, puesto que cada activación del cursor arrojaría un conjunto de datos nuevo.


Un Saludo.

chona 29-10-2007 19:42:31

que parámetros toma Locate

gluglu 29-10-2007 19:43:06

Sólo añadir, que aunque con el Locate (también podrías utilizar un TBookmark) logres posicionarte en el mismo registro, eso no significa que ese registro se encuentre en el mismo lugar respecto de la fila inicial que se mostraba en el DBGrid en ese momento, es decir, si por ejemplo el primer registro que se muestra en el DBGrid en un momento dado es el nº 15 (por poner un ejemplo) (ya que se hizo Scroll con el ratón o con la barra de desplazamiento), y el registro seleccionado es el nº 19 (por lo tanto, la 5ª posición en el DBGrid empezando desde arriba), aunque logres volver a posicionar la barra del DBGrid en el registro nº 19 de tu consulta, eso no significa necesariamente que vuelva estar seleccionada en la 5ª línea del Grid.

Además quiero comentarte que creo que actualizar el Query cada segundo me parece un intervalo de tiempo bastante corto. :rolleyes:

gluglu 29-10-2007 19:45:35

Para saber más acerca de la función Locate podrías hacer referencia a la propia ayuda del Delphi, aunque pienso que también dependerá de los componentes Query que utilizes.

Cita:

Class TIBCustomDataSet

Syntax
function Locate(const KeyFields: string; var KeyValues: Variant; Options: TLocateOptions): Boolean; override;

Description
Call Locate to search a dataset for a specific record and position the cursor on it.

KeyFields is a string containing a semicolon-delimited list of field names on which to search.

KeyValues is a variant that specifies the values to match in the key fields. If KeyFields lists a single field, KeyValues specifies the value for that field on the desired record. To specify multiple search values, pass a variant array as KeyValues, or construct a variant array on the fly using the VarArrayOf routine.

For example:
Código Delphi [-]
        with CustTable do
  Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver', 'P', '408-431-1000']), [loPartialKey]);
     TLocateOptions Opts;
  Opts.Clear();
  Opts << loPartialKey;
  Variant locvalues[3];
  locvalues[0] = Variant("Sight Diver");
  locvalues[1] = Variant("P");
  locvalues[2] = Variant("408-431-1000");
  CustTable->Locate("Company;Contact;Phone", VarArrayOf(locvalues, 2), Opts);

Options is a set that optionally specifies additional search latitude when searching on string fields. If Options contains the loCaseInsensitive setting, then Locate ignores case when matching fields. If Options contains the loPartialKey setting, then Locate allows partial-string matching on strings in KeyValues. If Options is an empty set, or if KeyFields does not include any string fields, Options is ignored.

Locate returns true if it finds a matching record, and makes that record the current one. Otherwise Locate returns false.

Locate uses the fastest possible method to locate matching records. If the search fields in KeyFields are indexed and the index is compatible with the specified search options, Locate uses the index. Otherwise Locate creates a filter for the search.

marcoszorrilla 29-10-2007 19:46:39

Hola Gluglu:

Yo había pensado en utilizar un BookMark, pero no lo manifesté porque habla de lanzar la consulta cada x tiempo y que yo sepa el BookMark sirve para desplazarse en conjuntos de datos y luego recuperar la posición después de un desplazamiento, yo de hecho lo utilizo mucho, pero creo que en este caso no funcionaría, ya que estamos hablando de una posición de un conjunto de datos que ya no existe.

Un Saludo.

gluglu 29-10-2007 19:50:47

Yo utilizo también el Bookmark para estos casos y hasta el momento no me ha dado problemas.

Entiendo que el Bookmark es algo que el propio Delphi crea en base a los valores de los campos de cada registro.

Hasta el momento he podido comprobar que a pesar de cerrar y abrir un DataSet, o hacer una nueva consulta, Delphi siempre devuelve el mismo Bookmark para un mismo registro con unos valores si no se han modificado.

Por ello, si el registro sobre el cual vamos a utilizar un Bookmark no es borrado de la base de datos, siempre volveremos al mismo registro con su correspondiente Bookmark.

Lo dicho, en su momento hice pruebas y comprobé este extremo, y a mi me funciona correctamente.


La franja horaria es GMT +2. Ahora son las 16:59:26.

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