Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Alternar colores en dbgrid

Hola, ya sé que esto es de lo más común, pero no consigo hacer que funcione, así que pregunto a los expertos.

A diferencia de lo habitual, que cambia de color por cada registro, en este caso es por uno de los campos.

Aunque en la imagen aparece ordenado, lo normal es que no esté ordenado por ese campo (asiento), sino por el campo fecha.



He usado una variable para guardar el contenido del último asiento, si el nuevo es distinto... se cambia de color.
No sé si ya estoy encabezonado con esto, pero no consigo que salga bien.

¿Alguna idea?
Responder Con Cita
  #2  
Antiguo 04-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Casimiro.

¿ Queres que los registros recién ingresados tengan otro color ?

Edito: ( lo que vió Casimiro )
Probá este código:
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Odd(DBGrid1.DataSource.DataSet.RecNo) then
    DBGrid1.Canvas.Brush.Color := clMoneyGreen
  else
    DBGrid1.Canvas.Brush.Color := clCream;
  DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-01-2011 a las 20:41:42.
Responder Con Cita
  #3  
Antiguo 04-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pero de ese manera va a alternar el color por cada registro y necesito que sea por cada vez que cambia de 'asiento'
Responder Con Cita
  #4  
Antiguo 04-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
jajaja... has editado tu respuesta y ahora he contestado a algo inexistente
Responder Con Cita
  #5  
Antiguo 04-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Es una simple consulta sql, nada más, y quiero que cambie de color cada vez que cambie el valor del campo asiento.
Responder Con Cita
  #6  
Antiguo 04-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 21
Aleca Va por buen camino
algo asi te puede servir?
Código Delphi [-]
procedure TForm1.DBGDatosDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if State = [] then
  begin
    TDBGrid(Sender).Canvas.Font.Color := clBlack;
    if TblArticulosARTI_BAJA.AsBoolean then
    begin
      TDBGrid(Sender).Canvas.Font.Color := clWhite;
      TDBGrid(Sender).Canvas.Brush.Color := clGreen;
    end;
  end
  else
    TDBGrid(Sender).Canvas.Font.Color := clWhite;
  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
lo uso para mostrar los articulos dados de baja.
__________________
Aleca
Responder Con Cita
  #7  
Antiguo 04-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Si me dí cuenta de mi confusión, pero no fuí tan rápido para modificar ...

Ya la agrego para que el hilo sea coherente...
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 07-01-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 22
José Luis Garcí Va camino a la fama
Casimiro he subido al Ftp del club lo que te comentaba en este caso tienes las opciones de 2 o 5 colores y de usar por asiento o por cambio de asiento, con control por variables, pero en este último caso, pasa lo que comentas de perder el color y demás, pero en el otro no.

En el primer caso, te recomendaría el usar un color por terminación del 0 al 9, pero te he expuesto el ejemplo a dos colores y a cinco.

En la misma carpeta tienes la base de datos Firebird 2.0 ten en cuenta que tendrás que cambiar la ruta para acceder a ella.

El Archivo es Prueba Grid Coloreado.zip y pesa unos 800K

Espero te pueda echar una mano
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #9  
Antiguo 07-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bueno, en principio... ¡¡¡haya paz!!!, es lo único que he pedido a los reyes magos, así que ayer no encontré ningún regalo junto al árbol de navidad , entonces supongo que se cumplirá mi deseo . Todas las propuestas me parecen estupendas, las valoro muchísimo y no desmerezco ninguna, al contrario, es algo que agradezco muchísimo porque sé el tiempo que lleva pensarlo, probarlo, comentarla aquí y defenderla
MUCHÍSIMAS GRACIAS A TODOS, sin excepción.


Ante tanta avalancha de soluciones posibles... ¡¡¡no me da tiempo de probarlas todas!!! , porque tengo que implementarlas bien en mi código para decidir si realmente no terminan de funcionar bien o es que simplemente yo no lo he implementado correctamente. Y no me gustaría desechar ninguna propuesta sugerida por vosotros que resulte que sí funcione correctamente y que sea yo el culpable de no haberla probado bien.

Cita:
Empezado por Chris Ver Mensaje
Solo una pregunta. Independientemente del número en que se inicie el valor del campo ASIENTO, ya sea 5,6,7, etc. los números siempre serán consecutivos? Si fuese así, puedes utilizar el valor del número más bajo. Hacer una resta y del residuo calcular si es par o impar. Par un color, impar otro color.
Tan sólo aclarar que la consulta, después de que el usuario ha escogido una serie de filtros más o menos amplios, se trae los registros ordenados por: fecha, numeroasiento, numerolinea. Y el campo que hay que controlar para el cambio de color es numeroasiento.
Un asiento tiene sus lineas todos con la misma fecha, los asientos normalmente estarán ordenados también, aunque no siempre. Las líneas siempre. Lo principal es que los asientos están agrupados.

---fecha---asiento---linea---
05.01.2011----20-------1-----
05.01.2011----20-------2-----
05.01.2011----20-------3-----
05.01.2011----32-------1-----
05.01.2011----32-------2-----
08.01.2011----28-------1----- <-- en este caso no está ordenado por asiento
08.01.2011----28-------2-----
08.01.2011----29-------1-----
08.01.2011----29-------2-----
08.01.2011----29-------3-----
-----------------------------

Y repito, el problema no es pintarlos cuando se se hace el select y se presenta en el grid, el problema viene después cuando te mueves por el grid con teclas o ratón.

Última edición por Casimiro Notevi fecha: 07-01-2011 a las 13:28:05.
Responder Con Cita
  #10  
Antiguo 07-01-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow Para tener en cuenta

Cita:
Empezado por Casimiro Notevi Ver Mensaje
...
Y repito, el problema no es pintarlos cuando se se hace el select y se presenta en el grid, el problema viene después cuando te mueves por el grid con teclas o ratón.
A mi me late que la solucion a tu problema ya ha sido resuelta con tanta alternativa que te han dado , pero nada mas se han olvidado de mencionarte algo que es lo siguiente:
Por experiencia propia (y no solo me ha pasado a mi, sino tambien a muchos ) que cuando utilizamos el evento OnDrawColumnCell del DBGrid para por ejemplo pintar algunas filas o celdas del Grid, por algunas extraña razon(Que tengo que invetigarla mas a fondo) al mover el scroll (movernos por los registros)del DBGrid ya sea con el mouse o con el teclado, Windows no dibuja por completo el DBGrid,es decir, pareciera que tiene un comportamiento extraño, por eso es que quizas te ha parecido que las soluciones que te han propuesto no te funcionan bien.
Para solucionar ese problema y hacer que windows redibuje el DBGrid cada ves que te muevas por los registros, es necesario llamar al método Invalidate del DBGrid en algun evento específico, por ejemplo yo utilizo el evento OnDataChange del DataSouce al que está enganchado el DBGrid para hacer el repintado ya que lo veo el más adecuado para hacerlo.
Código Delphi [-]
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
DBGrid1.Invalidate; //<- Hago que mi DBGrid se redibuje, eso implica que
             // internamente se ejecuta el evento OnDrawColumnCell del DBGrid
end;
Espero haberte aclarado un poco el panorama.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 07-01-2011 a las 22:10:56.
Responder Con Cita
  #11  
Antiguo 07-01-2011
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Una pequena optimizacion de codigo que propuse anteriormente.

Código Delphi [-]
 Sombra:Boolean;
    List:TStrings;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ESTE ES EL CODIGO QUE SE REQUIERE...}
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
   index:Integer;
   fColor:TColor;
begin
      if Not Assigned(List) then
         List:=TStringList.Create;

      with TDBGrid(Sender) do
      begin
         if (gdFocused in State) then
         begin
            Canvas.Font.Color := clWhite;
            Canvas.Brush.Color := clHighlight;
         end
         else
         begin
              Index:=List.IndexOf(DataSource.DataSet.FieldByName('ASIENTO').AsString);
              if Index=-1 then
              begin
                   if Sombra then fColor:=clYellow  else fColor:=clInfoBk;
{Para usar multicolores aleatorios descomentar esta linea...}
                   //fColor:=RGB(Random(205),Random(205),Random(205));

                   index:=List.AddObject(Datasource.Dataset.FieldByName('ASIENTO').AsString, Pointer(fColor));

                   Sombra := not Sombra;
              end;

              Canvas.Font.Color := clBlack;
              Canvas.Brush.Color := TColor(List.Objects[index]);

              DefaultDrawColumnCell(Rect, DataCol, Column, State);
          end;
      end;
end;

Saludos cordiales
Responder Con Cita
  #12  
Antiguo 07-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por José Luis Garcí Ver Mensaje
[..] En la misma carpeta tienes la base de datos Firebird 2.0 ten en cuenta que tendrás que cambiar la ruta para acceder a ella.
¿Puedes poner el metadata para crear la BD yo mismo?, o haces un backup transportable para que yo la restaure, es que tengo fb1.5 y 2.1. Y con ninguna de ellas puedo acceder a esa BD.
Responder Con Cita
  #13  
Antiguo 07-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Puedes poner el metadata para crear la BD yo mismo?, o haces un backup transportable para que yo la restaure, es que tengo fb1.5 y 2.1. Y con ninguna de ellas puedo acceder a esa BD.
También espero la metadata. Ya esto se volvió un reto. Es lo que me detiene a probar un código productivo, que no tengo datos para hacer las pruebas. Pero sin embargo, creo que el mejor podría proporcionar una base de donde partir es casimiro. Digo, danos una tierra fértil (una GUI y datos adecuados al problema) para hacer fertilizar ideas.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #14  
Antiguo 07-01-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

Concuerdo con Chris en no usar al servidor de datos como muletilla para lo que es GUI. En ningún momento tomé sus palabras como una ofensa.

Por otra parte, si buen concuerdo, como dije, con Chris; también creo que hay veces en que a falta de una buena solución hay que hacer uso de los recursos de que dispongamos aunque no sean los ideales.

Hasta el momento creo que ninguna de las soluciones puramente GUI funciona al 100% (*) y entre traer todos los registros al cliente o usar un SP, prefiero lo segundo (aunque yo, en lo personal prefiero mi solución je, je).

Creo que hay rejillas de terceros que manejan esto de forma sencilla, pero también hay que tener en cuenta lo del cero presupuesto que menciona Casimiro. Así que, un pequeño tiempo extra en la consulta bien compensa la falta de presupuesto.

De todas formas, si se encuentra una solución puramente GUI será mucho mejor.





(*) He estado probando la solución de duilioisola pero también tiene sus bemoles. Por alguna razón, al dar click sobre la barra de desplazamiento vertical los colores se alternan (lo que estaba sombreado deja de estarlo y viceversa), lo que produce un efecto feo. Además, si la selección esta en ciertos registros, dicho click produce un sombreado incorrecto a partir de la selección.

// Saludos

Última edición por roman fecha: 07-01-2011 a las 18:28:52.
Responder Con Cita
  #15  
Antiguo 07-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bueno, aquí he puesto un ejemplo sencillo para poder trabajar sobre él.
No recuerdo de qué compañero es, pero tiene el mismo inconveniente, en según qué casos alterna los colores incorrectamente.
Yo ya estoy pensando que es un fallo mío, no sé, en fín, ahí está.
He añadido un sql para crear la BD por si acaso tenéis una versión distinta a la FB2.1 y además se le añaden un montón de registros de pruebas.
Concretamente las pruebas que estoy haciendo son con fechas 16/12/2010, luego el día 17, luego el 18 y así en adelante, ninguna de las propuestas presentadas ha llegado a presentar correctamente los datos cuando la fecha es 19/12/2010, si vamos al último registro con las flechas y luego subimos hasta el principio... los colores se han alternado. Lo que era claro se convierte oscuro y lo oscuro se convierte en claro.
Responder Con Cita
  #16  
Antiguo 07-01-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 22
José Luis Garcí Va camino a la fama
Perdonar por no responder antes, pero tuve que salir a llevar a mi hija a casa de unas amigas.


En cuanto a la metadata he probado en el Ib Expert y lo que me saca ee con todos los registros, así que opte por imprimir la estructura a un PDF, recordar que la base de datos en este caso es DEPRUBA.FDB, con una única tabla MOVIMIENTOS.

En Cuanto a los Registros no os preocupéis ya que el programa tiene un botón que crea 100 registros aleatorios cada vez que lo pulséis.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #17  
Antiguo 07-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
[..]
Hasta el momento creo que ninguna de las soluciones puramente GUI funciona al 100% (*) y entre traer todos los registros al cliente o usar un SP, prefiero lo segundo (aunque yo, en lo personal prefiero mi solución je, je).
Realmente es muy ingeniosa, qué pena que firebird no permita hacer algo así, al menos yo no sé cómo hacerlo.
Sí, vaaaaleeee... mysql también tiene cosas buenas
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Alternar dos colores en las lineas de un DBGrid. jealousy OOP 4 07-05-2014 15:45:23
colores en un dbgrid frf_84 Gráficos 2 07-12-2004 12:14:57
dbgrid con colores Giniromero Conexión con bases de datos 7 08-07-2004 16:26:29
dbgrid en colores sebas Conexión con bases de datos 2 09-07-2003 09:16:14
Colores en una DBGrid REDCOM Varios 2 26-05-2003 20:42:58


La franja horaria es GMT +2. Ahora son las 19:53:13.


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
Copyright 1996-2007 Club Delphi