Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Alternar colores en dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=71698)

duilioisola 07-01-2011 11:11:44

Ahora estoy pensando en agregar una variable más:
CampoOrden para saber por qué campo está ordenado el DataSet y así poder compararlo con la variable ValorAnterior.

Código Delphi [-]
{Global al DataModule CampoOrden string}

procedure TDMMayor.xMayorCalcFields(DataSet: TDataSet);
begin
   {El campo calculado se inicializa a 0. Solo recalculo si es este valor}
   {ValorAnterior siempre guarda el valor del ultimo registro}

   {Si todavía no he establecido el valor del campo calculado}
   if (DataSet.FieldByName('SOMBRA').AsInteger = 0) then
   begin
      {Si el valor cambia, alterno el valor de Sombra}
      if (ValorAnterior <> DataSet.FieldByName(CampoOrden).AsString) then
      begin
         Sombra := not Sombra;
         ValorAnterior := DataSet.FieldByName(CampoOrden).AsString;
      end;
      
      if (Sombra) then
         DataSet.FieldByName('SOMBRA').AsInteger := 1
      else
         DataSet.FieldByName('SOMBRA').AsInteger := 2;
   end;
end;

procedure Ordenar(Orden : string);
begin
   CampoOrden := Orden;
   {Cambiar ORDER BY de SelectSQL}
   xMayor.SelectSQL.Text := SLQBase; {select * from ... where ...}
   xMayor.SelectSQL.Text := xMayor.SelectSQL.Text + ' ORDER BY ' + CampoOrden;
end;

José Luis Garcí 07-01-2011 12:33:24

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

Casimiro Notevi 07-01-2011 13:24:39

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 :D. 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!!! :D, 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 (Mensaje 386884)
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.

Casimiro Notevi 07-01-2011 13:54:41

Cita:

Empezado por José Luis Garcí (Mensaje 386895)
[..] 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.

Chris 07-01-2011 18:06:01

No pensaba en contestarte xq era desvirtuar el hilo. Pero has sido demaciado tosco y necesito contestar tus desagradables palabras.

Cita:

Empezado por Delphius (Mensaje 386887)
Y si me molestó, porque lanzaste un comentario a modo de indirecta a todo aquella persona que ha propuesto una ALTERNATIVA. Repito: ALTERNATIVA, no una solución que sea perfecta, bonita y que te caiga bien a tus propios gustos.

Estamos presentando alternativas, no sabíamos que te tenía que caer bien a vos.

Creo que lo que a tí te molesta es una opinión contraria a tus ideas. No critique a cada una de las personas que propuso una solución, hay muchas soluciones propuestas si te fijas en todo el hilo. Critiqué, no solo la solución propuesta por Roman y desarrollada por tí, sino todas las que usen de muleta a la base de datos. Las critico (en el mejor sentido de la palabra) y lo seguiré haciendo. Creo que mi critica no fue en mal modo, si te fijas, eres el único que la ha tomado a mal. Te has ahogado en un vaso de agua sinceramente.


Cita:

Empezado por Delphius (Mensaje 386887)
¿Y no crees que Casi ha pedido ayuda y aquí entre todos, cada uno desde su lugar hizo o está haciendo un esfuerzo?

Cita:

Empezado por Chris (Mensaje 386883)
... Si tienes problemas para pintar la GUI, pídele ayuda a otro programador, no a la base de datos.

Sabes leer, pero no interpretar. Casimiro hizo lo correcto, vino a pedir ayuda a otros programadores.

Cita:

Empezado por Delphius (Mensaje 386887)
Tu pretendes tildar a Casi y a los demás como incompetente. Evita esas indirectas molestas... aqui ninguno viene con aires de traer la superioridad...

Si así lo quieres ver desde tu distorsionada perspectiva.... allá tú. El que se pretende con aires de superioridad eres tú. No toleras la más mínima critica a tus opiniones o en este caso, a tu manera de solucionar las cosas.


Cita:

Empezado por Delphius (Mensaje 386887)
Sabes que existe algo llamado KISS... a lo siento... tu prefieres seguir rompiéndote la cabeza y no intentar darle un giro a tus ideas. Bien por ti, si quieres seguir complicándote.

No programo desde ayer, sé que es KISS. Yo creo que lo único que sabes es que KISS es la abreviación de "Keep it simple stupid", más no sabes lo que eso conlleva. Puedes aprenderlo aquí.

Cita:

Empezado por Delphius (Mensaje 386887)
No podemos asegurar que sea N segundos, quizá sea N/2 lo cual sería un factor considerable. Y te digo que en ocasiones es preferible que se la aguanten un poquito antes que tener un código que podría tener la posibilidad de estallar en un futuro y ser inestable en cuanto se añadan nuevas mejoras o adiciones.

¿Y como sabes y estás tan seguro que tan deficiente eres? ¿Que carajos sabes de los factores que inducen a la perfomance a la que verá sometido el sistema de Casimiro? Quizá esta consulta la use unas pocas personas, muy pocas veces al día, quizá tenga un buen servidor...
Hay más que mirar, y no necesariamente habrá una perdida considerable de perfomance.

Si no sabías, hay otra regla en el desarrollo de software: NO DES NADA POR SENTADO. Deberías tenerla siempre en cuenta porque es una de la más importantes.

Cita:

Empezado por Delphius (Mensaje 386887)
Si, sigamos con el hilo... que no tiene sentido discutir, menos con alguien que pretende ponerle punto final a un debate de ideas.

Creo que en esa frase te estás reflejando tú. Te juro que no me siento aludido.

Cita:

Empezado por Delphius (Mensaje 386887)
Te aviso además, que no fui el iniciador y motivador principal de la solución por el lado de la base de datos... fue román, si tienes algo que decir y objetar crítica a él. Yo solamente seguí su planteo y propuse una ALTERNATIVA.

Leí la solución propuesta por Roman un minuto después que la propuso. Sé que el tuvo la idea. Pero solo dio una idea, no dijó que fuera la solución. Así lo hemos hecho todos aquí, eso creo. Si tengo algo que decir y objetar será a esta idea, no a él.

Ya sinceramente..... NEEEEXT!!!

Chris 07-01-2011 18:08:59

Cita:

Empezado por Casimiro Notevi (Mensaje 386900)
¿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.

roman 07-01-2011 18:25:16

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

Casimiro Notevi 07-01-2011 19:15:05

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.

José Luis Garcí 07-01-2011 19:18:44

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.

Casimiro Notevi 07-01-2011 19:19:12

Cita:

Empezado por roman (Mensaje 386924)
[..]
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 :D

José Luis Garcí 07-01-2011 19:19:30

1 Archivos Adjunto(s)
Lo siento se me olvido el archivo aquí esta.

José Luis Garcí 07-01-2011 19:31:42

Para los que no quieran bajar el ejemplo aquí dejo una vista del ejemplo con el botón del que hablaba antes enmarcado.


Casimiro Notevi 07-01-2011 19:41:52

Soy un manazas :D
Lo he trasteado un poco y han aparecido dos grupos de asientos juntos y con el mismo color.


roman 07-01-2011 19:52:58

Cita:

Empezado por Casimiro Notevi (Mensaje 386927)
He añadido un sql para crear la BD

¿Los campos de interés son NUMEROASIENTO, LINEAASIENTO Y FECHAASIENTO? Digo, porque no concuerdan exactamente con los que habías mencionado.

// Saludos

Casimiro Notevi 07-01-2011 20:04:44

Cita:

Empezado por roman (Mensaje 386934)
¿Los campos de interés son NUMEROASIENTO, LINEAASIENTO Y FECHAASIENTO? Digo, porque no concuerdan exactamente con los que habías mencionado.
// Saludos

Sí, el usuario pide la fecha (o entre qué fechas) y se ordena por fecha, numeroasiento, lineaasiento.
El campo que debe cambiar de color es numeroasiento.
La imagen que he puesto en el post de antes es del programa de José Luis Garcí.

roman 07-01-2011 20:15:59

1 Archivos Adjunto(s)
A ver, está bien ser realistas pero para efectos de probar lo que nos interesa me parece que podrías haber omitido unos cuantos campos :p

Aquí pongo un extracto de datos para los que quieran usarlo :)

// Saludos

roman 07-01-2011 20:22:15

Cita:

Empezado por Casimiro Notevi (Mensaje 386933)
Soy un manazas :D
Lo he trasteado un poco y han aparecido dos grupos de asientos juntos y con el mismo color.

No es que seas un manazas, es que el código dice:

Código Delphi [-]
case UlDigit(StrToInt(DataSource1.DataSet.FieldByName('ASIENTO').value)) of
    0 :ColorElegido:=ColorA;
    1 :ColorElegido:=ColorB;
    2 :ColorElegido:=ColorC;
    3 :ColorElegido:=ColorD;
    4 :ColorElegido:=ColorE;
    5 :ColorElegido:=ColorA;
    6 :ColorElegido:=ColorB;
    7 :ColorElegido:=ColorC;
    8 :ColorElegido:=ColorD;
    9 :ColorElegido:=ColorE;
end;

o sea, asigna el mismo color a los asientos con terminaciones 0 y 5.

La verdad no termino de entender cómo funciona el método que propone José Luis. La probabilidad de que existan grupos de asientos contiguos con el último dígito igual creo que puede ser muy alta.

// Saludos

ElKurgan 07-01-2011 20:25:57

Dejando aparte el tema, me parece que aqui pasa una cosa curiosa:

1.- Todos nos decimos "novatos"
2.- Pero todos nos enfadamos si no se usan nuestras soluciones
3.- A una petición de ayuda de Casimiro, algunos han empezado guerras particulares...

Yo creo que un poco de humildad en todos nosotros nos hace ser un poco mejores. No olvidar que este foro es lo que es gracias a TODOS los que participamos en él

Saludos

Casimiro Notevi 07-01-2011 20:28:22

Cita:

Empezado por roman (Mensaje 386937)
A ver, está bien ser realistas pero para efectos de probar lo que nos interesa me parece que podrías haber omitido unos cuantos campos :p
Aquí pongo un extracto de datos para los que quieran usarlo :)
// Saludos

Perdón, es que quise que se pareciera lo más posible a la realidad :D

José Luis Garcí 07-01-2011 20:34:57

Como dice Roma no estas equivocado Casimiro, la asignación es para cinco y por eso te pasa el que dos tenga el mismo color, en el caso de los diez dígitos las probabilidades serían menor, claro se puede hacer para cien, mil, etc, pero creo que aun así las probabilidades de que ocurriese siempre existirían. Lo que te expongo es sólo una idea, podrías aplicarle a esta para cinco,para la de dos o la de diez, la siguiente situación si color a asignar es igual ala variable global colorelegido y el valor del campo ASIENTO diferente a la variable global Asiento, dibujo una linea en la parte superior de la presente fila para distinguir mejor los diferentes asientos, aún con el mismo color.

De lo único que estoy seguro es de que no se te desplazarán los colores.

La idea es que quedara así, más o menos




La franja horaria es GMT +2. Ahora son las 14:39:38.

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