Colorear una fila seleccionada...
Hola foro!!!
Estoy buscando la manera de colorear una fila completa de un dbgrid, estuve buscando y no encontre nada. El tema es el siguiente, tengo un dbgrid con una serie de informacion ahora cuando hago dbl click en una fila determinada que puede ser cualquiera ahi recien se tiene que colorear la misma, se puede hacer esto de alguna manera? De antemano, Gracias! |
Hola,
Mira los eventos OnDrawDataCell y OnDrawColumnCell del grid, Allí puedes colorear a tu gusto. El problema es que vas a tener que guardar el estado de la fila en algun sitio (campo) porque las filas no se pintan cuando tu quieres sino cuando el grid lo decide. O sea que tu clic debe cambiar el valor de algun campo en el dataset que hay detrás del grid para poder pintar luego segun al valor del campo. p.e. añades un campo "estado" de tipo integer, que al hacer doble clic se cambie de zero a 1.
Cordialmente, Gerard. |
Cita:
Si he entendido bien lo que tú necesitas, el problema y lo complicado en tu caso, es que no quieres pintar filas segun un valor existente en el DBGrid, sino a medida que vas pulsando click en ellas. Para eso lo único que se me ocurre es que al pulsar doble click sobre la fila modifiques el valor de ese registro (un campo interno llamado COLOREAR, por ejemplo) y lo actives (UPDATE a TRUE). No es necesario que ese campo esté visible si no lo necesitas. Ese mismo campo es el que debes utilizar para colorear las filas del DBGrid de la forma estandard utilizando el evento OnDrawColumn. |
Saludos
Ah que te refieres cuando dices que lo active???
Podrías ser mas específico, yo tengo el mismo problema no quiero depender del valor de un registro de una BD por que como la mia esta en Internet, es muy tardado, quisiera que fuera algo directo |
Hola flystar, Neftalí se refiere a hagas lo siguiente:
. Crees un campo calculado "tbPintar" por Ej. y pongas la propiedad del DBGrid: Options -> dgRowSelect igual a True. . En el evento OnDblClick Pones a True tbPintar. (1) . Pintas en el evento OnDrawColumnCell. (2) (1) Código:
procedure TForm1.DBGrid1DblClick(Sender: TObject); Código:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; |
Muchas Gracias.
Muchas Gracias por la respuesta, es una excelente slución! :rolleyes::rolleyes::rolleyes::rolleyes:
|
¿Esto funciona? Lo he probado pero, si bien me permite colorear una fila, al desplazarme a otro registro se pierde el valor del campo calculado.
// Saludos |
Cita:
|
Sí, lo sé. La pregunta era más bien para ecfisa, pues me extrañó que pudiera modificarse un campo calculado.
// Saludos |
Gracias
Lo mas adecuado es guardar el valor de la fila seleccionada en una variable global.
luego forzar un Refresh de la tabla y en el evento ondraw comparar el valor de cierto campo que se esta dibujando con la variable y si es igual entonces se pinta. Asi no hay tardanza!!! Código:
filapintada:=ModuloDeDatos.QSeguimientoProspectacion.fieldbyname('idprospecto').asinteger; Código:
if modulodedatos.QSeguimientoProspectacion.fieldbyname('idprospecto').asinteger=filapintada then |
Nota
Cabe señalara que obviamente los eventos y valores dependen del componente que usen como grid...
yo uso uno DXDBGRID (muy bueno) El problema de usar campos de una BD es que si es por internet se pone lenta la seleccion y el pintado y el cliente o Jefe buscan rapidez.. a ellos no les importa lo que suframos para lograr sus peticiones. jjeje |
Bueno ..creo con en éste hilo ya se te ha respondido y dado solucion, ya sea el uno u otro caso.;)
Saludos...:) |
He estado viendo esto un rato y me parece que puede lograrse usando simplemente la propiedad SelectedRows del DBGrid pero poniendo en false la opción dgMultiSelect.
En el evento OnDblClick del DBGrid pondríamos:
y en el evento OnDrawColumnCell:
// Saludos |
Hola a todos.
Cita:
Pero según expone flystar en el texto mencionado; sólo quiere que la fila seleccionada se coloree cuando haga doble click sobre ella. En ningún momento entendí que quisiera utilizar el valor del campo extra para algún fin. Y utilizando el campo calculado se evita "ensuciar" la tabla original. De todos modos parece que era lo que andaba buscando... :) Neftalí: No cometiste un error, fuí yo que hice una libre interpretación del texto... :) Casimiro: Probé el ejemplo sin problemas asignando el valor al campo calculado. Saludos. |
Hola.
Donde dice: Cita:
Queria decir: Roman:Probé el ejemplo sin problemas, asignando el valor al campo calculado. Era tarde y andaba con la red neuronal en corto... :D Román: Tu código también funciona, la diferencia es que deja seleccionadas las filas donde se hizo doble click, no digo con esto que esté mál. Ambos comportamientos pueden ser deseados. Saludos y perdón por la confusión. |
Hola
Estaba revisando esto, y necesito hacer algo parecido, solo debo pintarla, el otro problema es que el foco no lo tengo asignado al DBGrid... Mi consulta es si le asigno el campo calculado al DBGrid (esto no lo he probado.. asi que ahora le meteré manos...)y sin asignación de focus, este me lo pintará.... Salu2...:p:cool: se me olvidaba... para seleccionar la fila, lo hago en el Query que esta asignado al DBGrid, de la siguiente forma
|
Hola BlueSteel.
Si te entendí bién, este código debería hacer lo que buscas. Lo asigné al evento OnClick de un TButton, pero vos podés ponerlo en el evento que te convenga para el caso. Hice en el DataSet un campo calculado que bauticé: Q_IngresoGralPintarGrid (en honor al DataSet:)) y usé el editor de columnas del DBGrid para evitar visualizarlo. Un TEdit recibe el dato que se le pasará al Locate en el evento OnClick del TButton.
Llamada:
El código deja pintada la fila en que te ubicaste con Locate hasta que realices un nuevo posicionamiento, sin que haya necesidad de darle el foco al TDBGrid. Un saludo. |
Excelente....
Era justo lo que estaba buscando.... te confieso que al principio no entendí mucho de donde crear el campo calculado, asi que me puse a instrusear... y es muy facil... Y como tengo dos DBGrids en donde se muestran los datos de ingresos por la puerta actual y los ingresos que se realizan por todas las puertas, tube que realizar esto para que me pintará el dato de la puerta actual solo si ha ingresado por ahí
Gracias Salu2:p:cool: |
La franja horaria es GMT +2. Ahora son las 17:44:44. |
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