Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Cambiar color de fondo en un DBgrid (https://www.clubdelphi.com/foros/showthread.php?t=32259)

Alexis De la Cr 01-06-2006 00:59:31

Cambiar color de fondo en un DBgrid
 
Estimados Colegas del Foro:

Les molesto con un pequeño problema que tengo, les explico. Tengo una base de datos mysql, con la cual me conecto a traves del componente mydac de crlabs. para hacer actualizaciones al dataset lo hago a traves de un edit box, de tal forma que si hay un cambio en el dataset, automaticamente el fondo del registro actual en el dbgrid, se pone en amarillo. hasta aqui no hay problema. el problema es que para cancelar el cambio o para aplicarlo, debo presionar un boton, justo ahi es cuando deseo que el color del registro actual en el dbgrid, retorne a blanco, en caso de cancelarlo, o de algun otro color en caso de aplicar los cambios. He buscado informacion en toda la red, y no he podido encontrar nada sobre esto. todos los ejmplos hacen referencia unicamente cuando se esta llenado el dbgrid con los datos del dataset, pero ningun ejemplo o informacion respecto a sucesos externos como cuando se presiona un boton.

Gracias por la Ayuda.

Alexis De la Cruz Ascencio
Puebla MExico

roman 01-06-2006 02:34:54

La verdad no entiendo. Si logras pintarlo de un color (amarillo), ¿cuál es el problema para pintarlo de cualquier otro color deseado, incluido el blanco? Quizá sea bueno que empieces por explicar qué significa eso de "actualizar un dataset a través de un edit box" y qué es exactamente lo que haces en ese momento para poder pintarlo de amarillo.

Así sin más, lo único que se me ocurre decirte es que en el momento en que quieras "pintar" de un color, utilices el método Repaint del DBGrid para forzarlo a que genere el evento OnDrawColumnCell que es el único método que conozco para pintar un DBGrid.

// Saludos

Alexis De la Cr 01-06-2006 05:46:21

Estimado Roman:
Te agradezco el interes mostrado al contestar mi pregunta. Te explico, tengo una tabla en mysql, la cual contiene como 15 campos. Para facilitarme la navegacion, no trabajo directamente sobre el dbgrid, y los valores de cada campo, los coloco en un edit box respectivamente,( de esta forma puedo ver los 15 campos al mismo tiempo, cosa que trabajando directamente sobre el dbgrid, debo presionar las flechitas hasta que aparezca el campo deseado. en pocas palabras, se pierde tiempo.)

Código Delphi [-]
labelededit1.Text:=myquery1.FieldValues['clave'];
labelededit2.Text:=myquery1.FieldValues['clalt'];
labelededit3.Text:=myquery1.FieldValues['producto'];
labelededit4.Text:=myquery1.FieldValues['mexico'];
labelededit5.Text:=myquery1.FieldValues['puebla'];
labelededit6.Text:=myquery1.FieldValues['dolar'];
labelededit7.Text:=myquery1.FieldValues['ppesos'];
labelededit8.Text:=myquery1.FieldValues['garantia'];
labelededit9.Text:=myquery1.FieldValues['garantiaps'];
labelededit10.Text:=myquery1.FieldValues['ua'];
labelededit13.Text:=myquery1.fieldvalues['porc'];
label9.Caption:=myquery1.FieldValues['mpcr'];

Cuando modifico el valor de un campo hago lo siguiente

Código Delphi [-]
myquery1.Edit;
myquery1.FieldValues['dolar']:=labelededit6.Text;
myquery1.FieldValues['ultmodif']:=DateToStr(Now);
myquery1.Post;

de tal forma que esta accion se refleja en el dbgrid haciendo que el fondo del registro activo se coloree de amarillo, mediante el siguiente codigo en el evento ondrawcolumncell del dbgrid

Código Delphi [-]
if MyQuery1.UpdateResult in [uaFail,uaSkip] then
    TCRDBGrid(Sender).Canvas.Brush.Color:= clRed
  else
    if MyQuery1.UpdateStatus <> usUnmodified then
      begin
      TCRDBGrid(Sender).Canvas.Brush.Color:= clYellow;
      button3.Enabled:=True;
      end;
  TCRDBGrid(Sender).DefaultDrawColumnCell(Rect, Datacol, Column, State);

en este punto yo tengo la opcion (como la tabla esta en modo cachedupdates) de cancelar o de aplicar los cambios, mediante un boton. En Ambos casos, debo hacer un myquery.refreshrecord (antes hacia myquery.refresh y funcionaba perfecto, pero como actualize la version de los componentes mydac, aahora esto me causa un error de access violation), para actualizar los datos. el problema es que el fondo registro en el dbgrid, queda amarillo,y lo que quiero es que si se cancela la actualizacion, el fondo vuelva a su color blanco, y si se procede con applyupdates, dejar otro color distinto para saber que ese registro se actualizo.

Espero no me haya excedido explicando, soy novaton en esto

Gracias de antemano

roman 01-06-2006 17:26:50

¿Y has probado lo que te digo? En OnDrawColumnCell tu código pinta de amarillo el fondo cuando UpdateStatus <> usUnmodified. Cuando aplicas o cancelas los cambios, es de suponerse que UpdateStatus sea igual usUnmodified (si no es así tendrás que revisar que valor toma para considerarlo en el condicional) y por tanto no se usará el color amarillo. Pero esto puede no reflejarse de inmediato pues OnDrawColumnCell ocurrirá sólo cuando el DBGrid necesita pintarse. Por ello, al momento de aplicar o cancelar los cambios conviene que hagas un DBGrid.Repaint para forzar el repintado.

// Saludos

Alexis De la Cr 02-06-2006 22:12:06

Hola Roman, muchas gracias por tu respuesta. Pues bien, ya lo intente lo que me dices, pero no sucede nada cuando ejecuto dbgrid.repaint, queda de color amarillo el fondo y no hay forma (al menos las que yo conozco) de quitarle ese color

roman 02-06-2006 22:25:59

El DBGrid va a pintar exactamente lo que tú le digas. Si el color no cambia es entonces porque UpdateStatus sigue siendo distinto de usUnmodified después de cancelar o modificar. De ser esto tendrás que encontrar otra forma de controlar cuándo va de amarillo.

O bien, aunque no me suena del todo, pon explícitamente el color del canvas en blanco en el else:

Código Delphi [-]
if MyQuery1.UpdateStatus <> usUnmodified then
begin
  TCRDBGrid(Sender).Canvas.Brush.Color:= clYellow;
  button3.Enabled:=True;
end
else
begin
  TCRDBGrid(Sender).Canvas.Brush.Color:= clWhite;
end;

// Saludos


La franja horaria es GMT +2. Ahora son las 02:30:36.

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