Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-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: 25
José Luis Garcí Va camino a la fama
Bueno siento ser pesado, pero con unos pequeños cambios os muestro lo que digo.







Código Cambiado

Código Delphi [-]
procedure TForm1.DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var color:TColor;
begin
//     if odd then
     case UlDigit(StrToInt(DataSource2.DataSet.FieldByName('LOTE').value)) of
        0:Color:=RGB(205,150,10);
        1:Color:=RGB(210,160,40);
        2:Color:=RGB(215,170,70);
        3:Color:=RGB(220,180,100);
        4:Color:=RGB(225,190,130);
        5:Color:=RGB(230,200,160);
        6:Color:=RGB(235,210,190);
        7:Color:=RGB(240,220,210);
        8:Color:=RGB(245,230,240);
        9:Color:=RGB(250,240,255);
//        0:Color:=ColorBox10.Selected;
//        1:Color:=ColorBox12.Selected;
//        2:Color:=ColorBox13.Selected;
//        3:Color:=ColorBox14.Selected;
//        4:Color:=ColorBox15.Selected;
//        5:Color:=ColorBox16.Selected;
//        6:Color:=ColorBox17.Selected;
//        7:Color:=ColorBox18.Selected;
//        8:Color:=ColorBox19.Selected;
//        9:Color:=ColorBox20.Selected;
     end;
     DBGrid2.Canvas.Brush.Color := Color;
     Dbgrid2.Canvas.FillRect(Rect);
     dbGrid2.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 05-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
mmm... comparto la opinión de casimiro, las soluciones presentadas son como cañonazos.

Por mi parte creo que este problema necesita nada más que una especie de switch, o alternador. Una simple variable booleana que controle el color utilizado.

Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
    background_colors: array[0..1] of TColor = (clBtnFace, clWhite);
begin
if Dataset.FieldByName('asiento').Value <> UltimoValor then
    BoolSwitch := (not BoolSwitch);

TDBGrid(Sender).Canvas.Brush.Color := background_colors[BoolSwitch];
TDBGrid(Sender).DefaultDrawColumnCell( ... );
UltimoValor := Dataset.FieldByName('asiento').Value;
...
end;

BoolSwitch y UltimoValor son variables privadas del formulario.

Creo que con este código se pudiera solucionar el problema. Sino pues creo que de él se puede partir.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web

Última edición por Chris fecha: 05-01-2011 a las 19:40:16.
Responder Con Cita
  #3  
Antiguo 05-01-2011
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 16
pacopenin Va por buen camino
Estoy siguiendo este hilo con interés. En algún momento voy a verme en la tesitura de implantar algo similar. Y creo que el principal problema no es "pintar" las filas cuando se "cargan" los datos. Eso, con los sistemas de switch que se van comentando es fácil. Yo creo que el principal problema es la navegación, el hacer click en cualquier sitio. Creo que si en el registro de la tabla no hay una información que nos indique si hay que pintar esa celda de un color o de otro, los valores del "switch" no van a ser válidos. Mi opinión en que "debe haber una información en el registro que indique de color hay que pintar esa celda".

Saludos,
__________________
http://www.gestionportable.com
Responder Con Cita
  #4  
Antiguo 05-01-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.675
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por pacopenin Ver Mensaje
[..] Mi opinión en que "debe haber una información en el registro que indique de color hay que pintar esa celda".
Saludos,
Después de probar las distintas opciones aportadas por los compañeros, debo ecir que no funcionan "totalmente" bien... o yo no he sabido implementarlas, que todo puede ser.

Así que creo que la única opción es la del campo que indique el color o algo así.

Pero todavía se aceptan más propuestas... habrá premio al que obtenga el resultado correcto
Responder Con Cita
  #5  
Antiguo 05-01-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Pues yo no veo otra salida amigo. Ya sea que se lleve una estructura fuera o en el mismo dbgrid con un campo calculado y el uso de técnicas "flags booleanas" es necesario contar con un artilugio para llevar ese conteo y poder determinar con que color pintar cada registro.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 06-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
Mejorando código....

Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
    background_colors: array[0..1] of TColor = (clBtnFace, clWhite);
begin
if Dataset.FieldByName('asiento').Value <> UltimoValor then
    BoolSwitch := (not BoolSwitch);

TDBGrid(Sender).Canvas.Brush.Color := background_colors[BoolSwitch];

// el grupo ya fue pintado?
if Pos(Format('-%s-', [Dataset.FieldByName('asiento').Value]), GrupoImpar) > 0 then
    TDBGrid(Sender).Canvas.Brush.Color := background_colors[0];
   
TDBGrid(Sender).DefaultDrawColumnCell( ... );
UltimoValor := Dataset.FieldByName('asiento').Value;

// guarlar una lista de los grupos impares
if (not BoolSwitch) and (Pos(Format('-%s-', [Dataset.FieldByName('asiento').Value]), GrupoImpar) = 0) then
    GrupoImpar := (GrupoImpar + Format('-%s-', [Dataset.FieldByName('asiento').Value]);
...
end;

Es un gasto de memoria, es cierto. Pero la solución en el código es una simplificación de la solución primera propuesta por delphius.

Aún no funciona? Dinos que esto ya lo tomamos como reto

EDITO: Aclaro que GrupoImpar es una variable global privada
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web

Última edición por Chris fecha: 06-01-2011 a las 23:33:58.
Responder Con Cita
  #7  
Antiguo 06-01-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Hola de nuevo.

No quiero ser pesado, pero ya lo comenté en un post anterior. Se hace un procedimiento almacenado y se llama al mismo poniendo la where que se quiera, ya que puede ser invocado como una tabla o query. esta where puede ser montada 'al vuelo'.

Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE PRUEBA 
returns (
    idpresupuesto integer,
    color integer)
as
declare variable widpresupuesto integer;
begin
  /* Procedure Text */
  widpresupuesto = -1000;
  for
  SELECT IDPRESUPUESTO FROM b_lineapresupuesto order by idpresupuesto
  into :idpresupuesto
  do
  begin
    if (widpresupuesto = idpresupuesto) then
    begin
      if (color = 1) then COLOR = 1;
      else color = 0;
    end
    else
    begin
      if (color = 1) then COLOR = 0;
      else color = 1;
    end
    widpresupuesto=idpresupuesto;
    suspend;
  end
end^

SET TERM ; ^
Llamadas
Código SQL [-]
SELECT * from prueba WHERE IDPRESUPUESTO > 40

ó 

SELECT * from prueba WHERE IDPRESUPUESTO >= 40 AND IDPRESUPUESTO <= 200

Espero que sea de utilidad.

Saludos
Aupa Casi, no desfallezcas ahora !!
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #8  
Antiguo 07-01-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.675
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por Chris Ver Mensaje
[..]
if Dataset.FieldByName('asiento').Value <> UltimoValor then
BoolSwitch := (not BoolSwitch);


C
reo que se está llegando a la conclusión de que esa parte es la que no funciona en este sistema, no se puede comparar con el valor del "último valor" porque puede ser cualquier registro, por ejemplo cuando ha llegado al último registro y ahora se posiciona en el primero, los colores pueden ser iguales, o no, depende de si el número de "asientos" es par o impar.
O sea, pintarlo, lo pinta perfecto, tanto ese método como todos los demás que se han sugerido, pero en cuanto empiezas a moverte por el grid arriba y abajo, con teclas o con el ratón, yendo al primero o al último con ctrl-inicio y ctrl-fin, página arriba y abajo, etc. siempre acaba descontrolando los colores por lo dicho anteriormente, el "anterior" no tiene por qué ser el que está "antes" en el dbgrid.

Entonces las únicas soluciones posibles son las que sacan el color del propio registro, independientemente de lo que tengan los otros registros anteriores o posteriores.
Ya sea mediante procedimiento almacenado, tabla en memoria, etc.

Bueno, esto que comento es lo que me parece según lo visto, puedo estar totalmente equivocado y ahora alguno expone un código que consigue el resultado esperado.
Responder Con Cita
  #9  
Antiguo 06-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
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Después de probar las distintas opciones aportadas por los compañeros, debo ecir que no funcionan "totalmente" bien... o yo no he sabido implementarlas, que todo puede ser.

Así que creo que la única opción es la del campo que indique el color o algo así.
No creo que funcione ninguna de las técnicas propuestas. Ja, ja, qué pesimista. Pero es que todas se basan en el "orden" en que se van pintando las celdas pero, en teoría, no es posible saber en qué orden se pintan. Dicho de otra forma, el pintado de celdas no necesariamente es secuencial sino que depende de muchos factores visuales que determinan cuáles celdas son las que requieren repintado. Por ello es que se usa el evento DrawColumnCell. Cuando la VCL detecta que una celda necesita repintarse, lanza el evento.

Por otra parte, la opción de un campo calculado que determina el coor con el que debe pintarse, pues me suena extraña. El valor de un campo calculado, normalmente, debe determinarse en términos de otros valores en el mismo registro, y si podemos usar valores en el mismo registro para saber de qué color hay que pintar, entonces no necesitamos el campo calculado sino simplemente hacer el cálculo en el evento DrawColumnCell.

// Saludos
Responder Con Cita
  #10  
Antiguo 06-01-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.675
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Entonces, ¿qué sugieres?
Que llevo tres días con esta tontería y no termina de ir bien, algo tan "simple" :S
Responder Con Cita
  #11  
Antiguo 06-01-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
No se que dirán ustedes pero creo que acabamos de encontrar el nuevo reto delphi

Yo digo que el gran maestros de maestros de centésimo dan Román nos ilustre Yo no tener más neuronas.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #12  
Antiguo 06-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 24
Aleca Va por buen camino
Cita:
Empezado por roman Ver Mensaje
....
Por otra parte, la opción de un campo calculado que determina el coor con el que debe pintarse, pues me suena extraña. El valor de un campo calculado, normalmente, debe determinarse en términos de otros valores en el mismo registro, y si podemos usar valores en el mismo registro para saber de qué color hay que pintar, entonces no necesitamos el campo calculado sino simplemente hacer el cálculo en el evento DrawColumnCell.

// Saludos
me parece que estos caminos no nos llevan a buen puerto, hay que replantearse la solución, a ver tenemos que encontrar la forma de que cada fila pueda tener el color para pintar y que no se cambie mientras nos movemos dentro de la grilla, el problema en la practica que veo es la posibilidad de tener muchos registros estariamos usando el tiempo en saber el color.

Casimiro, una pregunta, porque necesitas hacerlo de esta forma?

Saludos
__________________
Aleca
Responder Con Cita
  #13  
Antiguo 06-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
Cita:
Empezado por Aleca Ver Mensaje
Casimiro, una pregunta, porque necesitas hacerlo de esta forma?
Quizá es muy simple mi respuesta pero yo diría que para poder distinguir fácilmente los grupos

// Saludos
Responder Con Cita
  #14  
Antiguo 05-01-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.675
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por José Luis Garcí Ver Mensaje
Bueno siento ser pesado, pero con unos pequeños cambios os muestro lo que digo.
No, hombre, no eres pesado, al contrario, se agradece la idea, aunque no creo que me lo acepten de esa forma, pero por probar que no quede
Responder Con Cita
  #15  
Antiguo 06-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: 25
José Luis Garcí Va camino a la fama
Casimiro, puedes adaptar el mismo código, para 5 colores o para 2, cambiado solamente lo siguiente en el case

........................................C..O..L..O..R.......A......U..S..A..R
Color............terminación......Para 10.......Para 5...........Para 2
0------------------0-----------0----------0-------------0
1------------------1-----------1----------1-------------1
2------------------2-----------2----------2-------------0
3------------------3-----------3----------3-------------1
4------------------4-----------4----------4-------------0
5------------------5-----------5----------0-------------1
6------------------6-----------6----------1-------------0
7------------------7-----------7----------2-------------1
8------------------8-----------8----------3-------------0
9------------------9-----------9----------4-------------1


Ventajas de este sistema, permite un mayor control, ya que no descuadra el color, ya que el color es según el termino del Lote (asiento en tu caso y al subir o bajar no pierde el color.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"

Última edición por José Luis Garcí fecha: 06-01-2011 a las 17:59:59.
Responder Con Cita
  #16  
Antiguo 06-01-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.675
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por José Luis Garcí Ver Mensaje
Ventajas de este sistema, permite un mayor control, ya que no descuadra el color, ya que el color es según el termino del Lote (asiento en tu caso y al subir o bajar no pierde el color.
Creo que no termino de entenderlo, ¿te refieres a cambiar el color según el número de asiento?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 08:45:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi