Club Delphi  
    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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #121  
Antiguo 08-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por cloayza Ver Mensaje
Amigo he implementado el codigo en ejemplo de Chris, y me anda de maravillas...
Te copio el codigo completo de la unidad.
Saludos cordiales

Me sigue saliendo mal en el mismo sitio que antes :

Responder Con Cita
  #122  
Antiguo 08-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
ahora si.
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Query.Open;
end;
 
procedure TForm1.QueryAfterOpen(DataSet: TDataSet);
var
  nValorAnt: Integer;
  lColor: Boolean;
begin
  nValorAnt := 0;
  lColor := False;
  mTabla.Open;
  while not Query.Eof do
  begin
    if QueryID_GRUPO.AsInteger <> nValorAnt then
    begin
      nValorAnt := QueryID_GRUPO.AsInteger;
      lColor := not lColor;
      mTabla.Append;
      mTablaAsiento.Value := nValorAnt;
      mTablaCOLOR.Value := lColor;
      mTabla.Post;
    end;
    Query.Next;
  end;
  mTabla.SortOnFields('ASIENTO');
  Query.First;
  Grilla.DataSource := DataSource1;
end;

 
procedure TForm1.GrillaDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  FColor, BColor: TColor;
begin
  if mTabla.Locate('ASIENTO', QueryID_GRUPO.AsInteger, []) then  //      nColor
    if mTablaCOLOR.AsBoolean then
    begin
      FColor := clWhite;
      BColor := clGreen;
    end
    else
    begin
      FColor := clBlack;
      BColor := clWhite;
    end;
  TJvDBUltimGrid(Sender).Canvas.Font.Color := FColor;
  TJvDBUltimGrid(Sender).Canvas.Brush.Color := BColor;
  TJvDBUltimGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
...
con una tablita auxiliar, funciona, no se si te será practico o no.
estoy convencido que la mosca la mate, ahora no se como te quedo la casa

Saludos.
__________________
Aleca
Responder Con Cita
  #123  
Antiguo 08-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
jaja... eso es trampa

He estado probando a fondo las distintas metodologías que se han propuesto y todas terminan por "fallar" en alguna condición, aunque es cierto que "casi no se enteraría nadie" y no le darían mucha importancia, pero si se quiere hacer las cosas bien entonces he tenido que desestimar todas las que usan el método de controlar los registros anteriores y similares. Simplemente no pueden funcionar, por lógica, salvo que el usuario se mueva de principio a fin con las teclas, registro a registro, y eso no suele ser lo más habitual en este caso, ya que es el grid de consulta principal del programa y además donde se validarán los registros que se "dan por buenos", en fin, que va a ser seguramente lo más muy usado del programia.
Creo que ha quedado demostrado que la única opción totalmente segura y válida para esta tarea es que en el propio registro se tenga un campo o dato del que se extraiga el color, así es independiente por completo de los movimientos que haga el usuario por el grid, use tecla o ratón, haga lo que haga. Siempre se pintará el registro con los datos extraidos de sí mismo, no hay error.
Pensé de hacerlo con una tabla en memoria pero no me convencía porque tras hacer el select había después que pasar los datos a esa tabla, no sólo por el tiempo (que es rápido normalmente) sino también por consumo de memoria ram y porque habría que traerse todos los registros, y esto es algo que nunca me ha gustado hacer.
Finalmente he optado por el método de la base de datos, concretamente es un Store Procedure que además de los campos del registro se trae también un campo 'color'.
No es tampoco lo que me hubiese gustado hacer porque son muchos filtros los que puede usar el usuario y hay que pasarle muchos parámetros al SP, la mayoría son del tipo "si pasas este parámetro no hay que pasar el otro", así que finalmente he tenido que optar por una opción 'híbrida', desde delphi se monta la sentencia sql y se llama al SP únicamente con ese parámetro, luego en el SP se hace un 'execute statement sentencia' y listo.
He estado haciendo pruebas y de momento, por lo que he podido ver, va bien, es ágil y parece que funciona correctamente con todas las combinaciones.
Y ya está bien por hoy, que son casi las 8 de la mañana y aquí estoy todavía, ya creo que no me voy a ir a dormir, enlazaré el día... bueno, voy a prepararme un café y a asomarme a la ventana, que empieza a amanecer

Quiero dar las gracias a todos porque me ha servido para ir probando distintas modalidades y finalmente optar por la que pienso que me viene mejor. Sin vuestra ayuda hubiese tardado muchísimo más. Os debo una invitación de "tapa de jamón y cerveza"

MUCHAS GRACIAS A TODOS


p.d.: Y no doy esto por cerrado, si alguien descubre una manera fiable de hacerlo mediante la GUI... se lleva el jamón
Responder Con Cita
  #124  
Antiguo 08-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 se que das el tema por sanjado, pero me quedo la duda de como quedaría con la linea en el grid y la verdad me sorprendió la sencillez de la respuesta, te pongo unas imágenes y al final el código por si sirve de utilidad a algún compañero. Por cierto de momento en todas mis pruebas no me ha dado fallo.

Con linea y cinco colores



Con linea y dos colores



Con linea y sin colores




y por último el código

Código Delphi [-]

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var Linea:Integer;
begin
     Linea:=0;
     if Asiento<>DataSource1.DataSet.FieldByName('ASIENTO').AsString then
     begin
         if Column.FieldName='HABER' then  Asiento:=DataSource1.DataSet.FieldByName('ASIENTO').AsString;
         Linea:=1;
     end;
     if CheckBox3.Checked=false then
     begin
       if CheckBox1.Checked=true then
       begin
           if CheckBox2.Checked=true then
           begin
            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;
           end else
           begin
            case UlDigit(StrToInt(DataSource1.DataSet.FieldByName('ASIENTO').value)) of
                0 :ColorElegido:=ColorA;
                2 :ColorElegido:=ColorA;
                4 :ColorElegido:=ColorA;
                6 :ColorElegido:=ColorA;
                8 :ColorElegido:=ColorA;
                1 :ColorElegido:=ColorB;
                3 :ColorElegido:=ColorB;
                5 :ColorElegido:=ColorB;
                7 :ColorElegido:=ColorB;
                9 :ColorElegido:=ColorB;
            end;
           end;
       end else
       begin
         if Asiento<>DataSource1.DataSet.FieldByName('ASIENTO').AsString then
         begin
           //  Asiento:=DataSource1.DataSet.FieldByName('ASIENTO').AsString;
             case SelectMiColor of          //Para invertir La Seleccion
                0:begin
                     ColorElegido:=ColorB;
                     SelectMiColor:=1;
                  end;
                1:begin
                     ColorElegido:=ColorA;
                     SelectMiColor:=0;
                  end;
             end;
         end;
       end;
       DBGrid1.Canvas.Brush.Color := ColorElegido;
       Dbgrid1.Canvas.FillRect(Rect);
       dbGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
     end;
     if Linea=1 then
     begin
         DBGrid1.Canvas.Pen.Color:=clNavy;
         DBGrid1.Canvas.Pen.Width:=3;
         DBGrid1.Canvas.MoveTo(Rect.Left, Rect.Top+1);
         DBGrid1.Canvas.LineTo(Rect.Right, Rect.Top+1);
     end;
end;
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"

Última edición por José Luis Garcí fecha: 08-01-2011 a las 11:38:11.
Responder Con Cita
  #125  
Antiguo 08-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Lo de los colores es que no me sirve ese método, sólo puedo usar el típico claro/oscuro, no más.
Sin embargo, lo de la raya sí que está muy bien y funciona perfectamente porque se controla un campo/dato del propio registro, por ejemplo que la línea sea el 1, así no hay problema.
Además el código es mínimo:

Código Delphi [-]
procedure TForm24.gr1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if TDBGrid(Sender).DataSource.DataSet.FieldByName('LINEAASIENTO').AsInteger=1 then
  begin
    gr1.Canvas.Pen.Color:=clNavy;
    gr1.Canvas.Pen.Width:=3;
    gr1.Canvas.MoveTo(Rect.Left, Rect.Top+1);
    gr1.Canvas.LineTo(Rect.Right, Rect.Top+1);
  end;
end;



Por lo que seguramente lo implemento también y en otros grids más que tengo por ahí.

Muchísimas gracias por la ayuda
Responder Con Cita
  #126  
Antiguo 08-01-2011
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
jaja... eso es trampa

He estado probando a fondo las distintas metodologías que se han propuesto y todas terminan por "fallar" en alguna condición, aunque es cierto que "casi no se enteraría nadie" y no le darían mucha importancia, pero si se quiere hacer las cosas bien entonces he tenido que desestimar todas las que usan el método de controlar los registros anteriores y similares. Simplemente no pueden funcionar, por lógica, salvo que el usuario se mueva de principio a fin con las teclas, registro a registro, y eso no suele ser lo más habitual en este caso, ya que es el grid de consulta principal del programa y además donde se validarán los registros que se "dan por buenos", en fin, que va a ser seguramente lo más muy usado del programia.
Creo que ha quedado demostrado que la única opción totalmente segura y válida para esta tarea es que en el propio registro se tenga un campo o dato del que se extraiga el color, así es independiente por completo de los movimientos que haga el usuario por el grid, use tecla o ratón, haga lo que haga. Siempre se pintará el registro con los datos extraidos de sí mismo, no hay error.
Pensé de hacerlo con una tabla en memoria pero no me convencía porque tras hacer el select había después que pasar los datos a esa tabla, no sólo por el tiempo (que es rápido normalmente) sino también por consumo de memoria ram y porque habría que traerse todos los registros, y esto es algo que nunca me ha gustado hacer.
Finalmente he optado por el método de la base de datos, concretamente es un Store Procedure que además de los campos del registro se trae también un campo 'color'.
No es tampoco lo que me hubiese gustado hacer porque son muchos filtros los que puede usar el usuario y hay que pasarle muchos parámetros al SP, la mayoría son del tipo "si pasas este parámetro no hay que pasar el otro", así que finalmente he tenido que optar por una opción 'híbrida', desde delphi se monta la sentencia sql y se llama al SP únicamente con ese parámetro, luego en el SP se hace un 'execute statement sentencia' y listo.
He estado haciendo pruebas y de momento, por lo que he podido ver, va bien, es ágil y parece que funciona correctamente con todas las combinaciones.
Y ya está bien por hoy, que son casi las 8 de la mañana y aquí estoy todavía, ya creo que no me voy a ir a dormir, enlazaré el día... bueno, voy a prepararme un café y a asomarme a la ventana, que empieza a amanecer

Quiero dar las gracias a todos porque me ha servido para ir probando distintas modalidades y finalmente optar por la que pienso que me viene mejor. Sin vuestra ayuda hubiese tardado muchísimo más. Os debo una invitación de "tapa de jamón y cerveza"

MUCHAS GRACIAS A TODOS


p.d.: Y no doy esto por cerrado, si alguien descubre una manera fiable de hacerlo mediante la GUI... se lleva el jamón
Estoy con Casimirro.
Desde el primer momento me pareció que la solución estaba en tener la infomación en los registros. No he tenido tiempo de pensar en código ni de probar las soluciones que se daban.
Valoré, en un primer momento la posibilidad de las tablas en memoria, pero lo descarté por las mismas razones, y que en entornos multipuesto pueden llegar a "mentir" bastante (si no se recargan convenientemente).
Desde mi punto de vista, una solución que no debe costar (ni tiempo ni dinero, creo que era una premisa) es válida si no es demasiado mala. Es decir, que a veces, pequeñas "trampas" son necesarias en busca de la productividad.
En este caso, con el Store Procedure, si hay pocos puestos, no creo que la pérdida de rendimiento sea significativa. Y si hay muchos, probablemente habrá recursos suficientes para tomar medidas (unas pocas horas más para hacer pruebas, o gastar un poco de dinero en "algo" que lo resuelva).
No defiendo el todo vale mientras funcione. Pero en entornos empresariales, hemos de optimizar sobre todo el tiempo. Si necesito 10-12 horas para resolver un tema como este, me compensa más comprar un componente (que no se si lo hay) de 300 €, que además me dará otras ventajas que no tengo en un grid normal.
El código (o la solución en general), es mejor o peor si se puede comprobar que en situaciones similares, ofrecen respuestas distintas. Si el resultado es similar (tiempo de respuesta, uso de CPU y/o memoria, etc) ambos son válidos como solución. Otra cosa es comparar códigos fuente, horas de programación, legibilidad, etc.

Todo esto son opiniones personales y no afirmaciones categóricas.

Saludos,
__________________
http://www.gestionportable.com
Responder Con Cita
  #127  
Antiguo 08-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
Me alegro haberte podido ayudar un poco, son muchas más las que tú y los compañeros me ayudáis a mi y considero, que es justo ayudar cuando se puede, por lo menos intentarlo.

Lo único, es que los compañeros, se han alterado algo a lo largo de este tema, espero sinceramente, que todo quede en aguas de borraja, ya que creo la intención es la misma por todos los pertenecientes al Club y aveces los malos entendidos provocan roces. Personalmente, el colaborar en este o cualquier otro hilo, me repercute une satisfacción personal, independientemente que mi ayuda haya sido escogida/valorada o no, en primer lugar demuestra que mi capacidad de asimilar el lenguaje a aumentado, aunque sean pequeñas aportaciones o trozos de código ridículos, Estoy seguro de que hace un año, no hubiese podido ayudar de la misma manera que ahora. Reconoscamoslo, aquí hay compañeros con un nivel muy alto, y yo y muchos más estoy seguro, nos perdemos o nos cuesta seguir los pasos de estos gigantes, pero luego son capaces de estos mismos ayudarnos y explicarnos cuando lo solicitamos.

Creo que esta es la finalidad del club, la ayuda e intercambio de conocimientos, sin importar tú nivel ni experiencia.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #128  
Antiguo 10-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 18
Chris Va por buen camino
@Delphius: Primero que todo, te pido disculpas si te sentiste ofendido por mis palabras. Dicen que para hacer negocios con personas de distinta cultura, primero tienes que aprender su cultura. No sé la significacia que tendría la palabra Muletas en Argentina, pero en mi país, no es ofensiva a cómo puedo persivir que la has tomado. Creo que esto fue un mal entendido del que NewChris y NewDelphius nos encargamos de poner caliente.

Lo que me queda dando vueltas en la cabeza es esa persección que tienes de mí, la de gladiador dando estocadas finales Si tienes esa imagen, creo que no te he sabido transmitir mis ideas. Todo lo contrario, soy amante de la discusión sin entrar en enfrentamientos, soy amante de la democracia -aunque no sea perfecta, pero es lo mejor que tenemos-. Soy amante de las libertades y de la igual de todos. Te veo a tí y a todos los miembros participantes del club por igual -no podría ser de otra forma-.

Cada uno tenemos nuestras ideas y formas de hacer las cosas y todas merecen ser escuchadas y respetadas. Pero decir que no comparto una de ellas y talvez la menosprecie no quiere decir que no debería ser ni existir. Cuando veo un hilo y considero que la solución que se está desarrollando va por un camino que no está conforme a mí parecer, siento la necesidad de intervenir y hacer ver lo que está mal desde mi punto de vista. Pero cuando lo hago jamás es mi intención ofender a todos los participantes. Como todo el mundo, espero que mis palabras sean escuchadas, pero no así pienso obligar a alguien a escribir mi código y mi idea.

Por último, mis convicciones en lo referente a lo tratado en este hilo no han cambiado. Creo que me vuelvo viejo, y como buen viejo, soy bien terco y cerrado. Dislumbro la solución, pero no tengo Delphi a mano para desarrollarla. Pero como casimiro no tiene tiempo, apoyo la solución que ha tomado. Solo me queda dar un último consejo: Para este caso evita encuadrar demaciado el SP a la necesidad del momento. Mejor utiliza un SP sin paramentros, que sea el espejo de la tabla sobre la que residen los datos. No te olvides que puedes utilizar WHERE's, ORDER's, HAVING's, etc. para seleccionar los registros devueltos por el SP.

Es todo por el momento. Saludos, Chris.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #129  
Antiguo 10-01-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Cris,
Yo también debo disculparme por el modo en que te he respondido. Tal vez si dejamos salir, demasiado, a NewDelphius y a NewCris

Yo más que nada apuntaba a la forma en como te expresaste. El término muleta tiene diversas connotaciones, ya bien conocidas y universales... su significado va desde aquel instrumento de apoyo (uno de los significados que tu empleaste) y el de mula, tonto, terco, y cerrado. En tu frase estaban ambos metidos.
La otra expresión que estaba fuera de lugar fue el decir "Y punto". Eso es una manera obstinada y grosera de decir "y no se discute más. YO tengo la razón".

Y disculpa que lo diga, pero en otras ocasiones también has dejado salir esos "aires".

Trataré en lo sucesivo evitar armar más problemas.

Respecto a lo que comentas sobre dejar al SP lo más limpio de parámetros comparto enteramente lo que dices. Aunque, si es que no recuerdo bien lo que he leído de la documentación de Firebird en la versión 1.5 hay algunas cosas que no estaban totalmente soportadas en un SP. No estoy totalmente seguro, pero tengo un vago recuerdo de que por ejemplo un HAVING y el GROUP BY no son permitidos en un "Select SP"... en la 1.5; que creo que es la versión que está utilizando Casimiro.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #130  
Antiguo 10-01-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.457
Poder: 20
newtron Va camino a la fama
Hola, he estado siguiendo atentamente este hilo porque yo tengo exactamente el mismo problema en mi programa de contabilidad. Al mismo tiempo he estado cavilando distintas soluciones pero no he escrito ningún post porque no iba a aportar nada nuevo. En mi caso en particular como habitualmente los asientos los saco ordenados por número de asiento lo tenía solucionado asignando un color dependiendo de que el asiento sea par o impar. Creo la idea de pintar una raya en cada cambio de asiento es bastante buena y puede paliar la de no poder colorear cada asiento, cosa que seguramente implementaré aparte del color por par/impar.

Todo este rollo os lo cuento porque realmente quería decir algo y me parecía muy frío soltarlo de golpe y es....

Delphius....Chris... venga.... ahora que sois amigos... un besito .

Saludos a todos
Responder Con Cita
  #131  
Antiguo 10-01-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.408
Poder: 22
fjcg02 Va camino a la fama
Hola a todos,
bajo mi modesta opinión, cunado encaramos un problema, debemos buscar la solución que sea más eficiente, teniendo en cuenta que la solución más eficiente dependerá en muchas ocasiones del contexto.

Dicho esto, bajo mi punto de vista, la solución vía SP , en este caso , es la mejor - que no la única - alternativa viable para la solución de los colores.

Ahora bien, finalmente la solución aportada por José Luis, por simple y efectiva, resuelve la problemática de otra manera , que si no se hubiera planteado el debate, no hubieramos conocido.

Finalmente, después de leer el hilo completo, nos llevamos en la mochila diferentes maneras de solucionar un problema, que si las hemos estudiado a fondo, son buenas tanto para los que hemos participado en el hilo como para los que lo han seguido, que seguramente no son pocos.
Además, las soluciones aportadas, creo que son muy válidas y aplicables para nuestras aplicaciones ya implantadas como para nuestros futuros desarrollos.

Un cordial saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #132  
Antiguo 10-01-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por newtron Ver Mensaje

Delphius....Chris... venga.... ahora que sois amigos... un besito .
Yo le voy a Necaxa...
Podríamos darnos un apretón de manos o cuanto mucho un abrazo pero eso de besito... ¡ni por todo el oro y las mujeres del mundo!

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #133  
Antiguo 10-01-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 18
Chris Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
Yo le voy a Necaxa...
Jajajaja.... frace escrita en oro x don ramón!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #134  
Antiguo 16-03-2017
poniente poniente is offline
Registrado
 
Registrado: ene 2006
Posts: 9
Poder: 0
poniente Va por buen camino
Lo conseguí

Buenas tardes a todos, después de estar leyendo todo el hilo y cogiendo ideas creo que lo he conseguido, por lo menos a mí me funciona y no he encontrado todavía un caso que me falle. Voy a ello...
Mi caso era parecido al de casimiro, tengo un dbgrid en el que aparecen una columna "Unidad de producción" (integer), esta columna se puede repetir en el formulario 1 o más veces. La idea es alternar (en mi caso con gris y blanco) los grupos de filas con la misma Unidad de Producción para facilitar visualmente al usuario la detección de estas filas. Al lío...
He utilizado dos arrays (color y ud_producción) del mismo tamaño que la consulta que me devuelve las filas del dbgrid, la idea es guardar en uno el color actual de cada fila y en el y en el otro la ud. de producción. De esta manera cuando voy pintando en el drawcolumncell voy comparando siempre con el valor de ud. producicón de la fila anterior para saber si tengo o no que cambiar el color. Pongo el código porque quizás estoy liando un poco con la explicación.

Código Delphi [-]
procedure TFMFinalizaOrdMan.DBGDetalle_lineaDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  cambia_color, fila, fila_ant : SmallInt;
begin
  //Pintamos las filas alternas en funcion de la ud de producción
  fila := (sender as TDBGrid).datasource.dataset.RecNo - 1;
  if fila = 0 then
    fila_ant := 0
  else
    fila_ant := fila - 1;

  cambia_color := 0;

  if v_ud_produccion[fila] = 0 then
  begin

    v_ud_produccion[fila] := Column.Field.Dataset.FieldbyName('UD_PRODUCCION').AsInteger;
    if v_ud_produccion[fila] <> v_ud_produccion[fila_ant] then
      cambia_color := 1
    else
      v_color[fila] := v_color[fila_ant];

    if cambia_color = 1 then
    begin
      if v_color[fila_ant] = 1 then
        v_color[fila] := 0
      else
        v_color[fila] := 1;
    end;
  end;

  with (Sender as TDBGrid) do
  begin
    if v_color[fila] = 1 then
      Canvas.Brush.Color := clBtnFace
    else Canvas.Brush.Color := clWindow;

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

//Como el dbgrid permite ordenar haciendo click en el título vacío los arrays
// para que después el ondrawcolumncell los vuelva a rellenar
procedure TFMFinalizaOrdMan.DBGDetalle_lineaTitleClick(Column: TColumn);
var
  i : SmallInt;
begin
  for i := 0 to (length(v_color)-1) do
  begin
    v_color[i] := 0;
    v_ud_produccion[i] := 0;
  end;
end;


Creación de los array en el public del formulario
Código Delphi [-]
  public:     
     v_ud_produccion : array of Integer;     
     v_color : array of Integer;

Después de recargar el dataset asigno el tamaño de los arrays
Código Delphi [-]
  SetLength (v_ud_produccion, DMFinalizaOrdMan.QMTabla.RecordCount+1); 
  SetLength (v_color, DMFinalizaOrdMan.QMTabla.RecordCount+1);

En mi caso tengo un para de botones que filtran lanzando de nuevo el dataset, en cada uno de ellos vacío los arrays con las mismas instrucciones
Lo suyo sería hacer un procedure que lo haga y se llame desde los sitios en los que cambie el dataset pero estoy haciéndolo un poco rápido.(perdón)

Código Delphi [-]
  
  for i := 0 to (length(v_color)-1) do   
  begin     
    v_color[i] := 0;     
    v_ud_produccion[i] := 0;   
  end

Con esto a mí me funciona a la perfección. Sería cuestión ya cada uno de ajustar a las peculiaridades de su código.
Espero aportar mi granito de arena y ayudar al igual que todos vosotros me habéis ayudado en muchos casos.

Última edición por ecfisa fecha: 16-03-2017 a las 18:22:40. Razón: Corregir problema de formato WYSIWYG
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 16:45:23
colores en un dbgrid frf_84 Gráficos 2 07-12-2004 13:14:57
dbgrid con colores Giniromero Conexión con bases de datos 7 08-07-2004 17:26:29
dbgrid en colores sebas Conexión con bases de datos 2 09-07-2003 10:16:14
Colores en una DBGrid REDCOM Varios 2 26-05-2003 21:42:58


La franja horaria es GMT +2. Ahora son las 16:34:41.


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