Ir al contenido


Foto

Cambiar el color de fondo de algunas celdas en un TStringGrid...


  • Por favor identifícate para responder
17 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 21 marzo 2013 - 01:52

...obviamente, bajo condicionamiento.

Jóvenes delphineros, buen día/tarde/noche. Continuando con el tema de los TStringGrid's, ahora debo cambiar bajo una condición específica algunas celdas de un TStringGrid (véase la imagen anexa); éstas celdas son parte de las columnas fijas que integran el TStringGrid.

Como siempre, acepto ideas, palmaditas (¡¡PALMADITAS, ELISEO!! :p ) en la espalda, código, condolencias...

Archivos adjuntos


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 marzo 2013 - 02:14

¿Vale una orejita pues? :D



delphi
  1. procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  2.   Rect: TRect; State: TGridDrawState);
  3. begin
  4.   With Sender as TStringGrid do
  5.   begin
  6.       if Cells[4,Arow] = 'Diabetes' then //aqui filtras la columna Cells[N,ARow]
  7.       begin
  8.         Canvas.Brush.Color := clRed;
  9.         Canvas.FillRect(Rect);
  10.         Canvas.Font.Color := clGreen;
  11.         Canvas.TextRect( Rect, Rect.Left+2, Rect.Top+2, Cells[acol, arow]);
  12.       end;
  13.   end;
  14. end;



Saludos.
  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 21 marzo 2013 - 03:28

¿Vale una orejita pues? :D...


Buenas Enecumene.

Probando con:



delphi
  1.   with Sender as TStringGrid do
  2.   begin
  3.       if Cells[01,ARow] = 'Desnutrición III' then //aqui filtras la columna Cells[N,ARow]
  4.       begin
  5.         Canvas.Brush.Color := clRed;
  6.         Canvas.FillRect(Rect);
  7.         Canvas.Font.Color := clGreen;
  8.         Canvas.TextRect( Rect, Rect.Left+2, Rect.Top+2, Cells[01,ARow]);
  9.       end;
  10.   end;



Obtengo el resultado en la imagen. Sí, se colorea de rojo, pero no solamente la celda que me interesa, sino TODA LA FILA...

Archivos adjuntos


  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 21 marzo 2013 - 09:14

Con la ayuda de una vieja función de Zarko, que posibilita hacer un CASE con strings, te he desarrollado un pequeño ejemplo para lograr lo que buscas.
Puedes ajustar el array a tus necesidades y obviamente completar el CASE.



delphi
  1. function StringToCaseSelect(Selector: string;
  2.   CaseList: array of string): Integer;
  3. var
  4.   cnt: Integer;
  5. begin
  6.   Result := -1;
  7.   for cnt := 0 to Length(CaseList) - 1 do
  8.   begin
  9.     if CompareText(Selector, CaseList[cnt]) = 0 then
  10.     begin
  11.       Result := cnt;
  12.       Break;
  13.     end;
  14.   end;
  15. end;
  16.  
  17.  
  18. procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  19.   Rect: TRect; State: TGridDrawState);
  20. begin
  21.   with Sender as TStringGrid do
  22.   begin
  23.     case StringToCaseSelect(Cells[ACol, ARow],
  24.       ['DESNUTRICION I', 'DESNUTRICION II', 'BAJO PESO', 'DIABETICO']) of
  25.       0:
  26.         Canvas.Brush.Color := ClRed;
  27.       1:
  28.         Canvas.Brush.Color := ClBlue;
  29.       2:
  30.         Canvas.Brush.Color := ClGreen;
  31.       3:
  32.         Canvas.Brush.Color := clFuchsia;
  33.     end;
  34.     Canvas.FillRect(Rect);
  35.     Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
  36.   end;
  37. end;


  • 0

#5 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 22 marzo 2013 - 09:51

Con la ayuda de una vieja función de Zarko, ...

¡Ah, San Zarko Gäjic!, entonces es casi garantía que funcione...  (y) Déjame terminar y que las celdas queden como lo necesito y con todo gusto lo implementamos, cómo de que no...  :D ;) ;)


¡Buen día!

Actualización. Usando éste código:

 

delphi
  1. with Sender as TStringGrid do
  2.   begin
  3.   if Cells[01,ARow] = 'Desnutrición III' then
  4.       begin
  5.         with TheRect do
  6.         begin
  7.             Left  := ColWidths[00]+GridLineWidth;
  8.             Top    := (RowHeights[ARow]*ARow)+(GridLineWidth*ARow);
  9.             Right  := ColWidths[00]+ColWidths[01]+ColWidths[02]+GridLineWidth;
  10.             Bottom := (RowHeights[ARow]*(ARow+1))+(GridLineWidth*ARow);
  11.         end;
  12.         Canvas.Brush.Color := clMoneyGreen;
  13.         Canvas.FillRect(TheRect);
  14.         Canvas.Font.Color := clRed;
  15.         Canvas.TextRect( TheRect, TheRect.Left+2, TheRect.Top+2, Cells[01,ARow]);
  16.       end;
  17. .
  18. .
  19. .
  20. .
  21. .
  22. .
  23. .
  24.  
  25.   end;



El resultado se muestra en la imagen..., voy progresando, casi termino...  (h) (h) (h) :D :D :D

Archivos adjuntos


  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 marzo 2013 - 10:09


Con la ayuda de una vieja función de Zarko, ...

¡Ah, San Zarko Gäjic!, entonces es casi garantía que funcione... 


De Zarko es la función StringToCaseSelect, el resto de código es mio  :p, y por supuesto que funciona de maravillas.  :D :D :D

Un cordial saludo, esperando que sean las tres de la tarde para ver a mi amada selección Colombia de futbol ganarle a Bolivia.
  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 23 marzo 2013 - 02:39

Desde hace mucho que tenemos una FAQ aquí mismo que nos enseña como hacer un case de string y sin necesidad de un bucle.

Nos leemos
  • 0

#8 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 02 abril 2013 - 04:14

...y dos semanas después..., ¡¡¡TERMINÉ SATISFACTORIAMENTE!!!

El resultado, lo pueden observar en la imagen anexa.

El código, inmediatamente:



delphi
  1. procedure TfrmPrescripcionDieteticaInicial.stgProcesarDrawCell(Sender: TObject; ACol, ARow: Integer; TheRect: TRect; State: TGridDrawState);
  2.  
  3.   function ExisteEnTitulo(sTexto: string): Boolean;
  4.   var
  5.       iIndicador: Integer;
  6.   begin
  7.       Result := False;
  8.       for iIndicador := 0 to Length(aTextoColor)-1 do
  9.       begin
  10.         if Trim(aTextoColor[iIndicador,TEXTOCELDA]) = Trim(sTexto) then
  11.         begin
  12.             Result := True;
  13.             Break;
  14.         end;
  15.       end;
  16.   end;
  17.  
  18. var
  19.   aColores: Variant;
  20. begin
  21.   with Sender as TStringGrid do
  22.   begin
  23.       if (ACol = 3) and (ARow = 2) and (Trim(Cells[03,02]) > '') then
  24.       begin
  25.         Canvas.Brush.Color := clRed;
  26.         Canvas.FillRect(TheRect);
  27.         Canvas.Font.Color := clYellow;
  28.         Canvas.TextOut(TheRect.Left + 2, TheRect.Top + 2, Cells[ACol, ARow]);
  29.       end;
  30.  
  31.       if Trim(Cells[ACol, ARow]) = '¤' then
  32.       begin
  33.         Canvas.Brush.Color := clGreen;
  34.         Canvas.FillRect(TheRect);
  35.         Canvas.Font.Color := clWhite;
  36.         Canvas.TextOut(TheRect.Left + 2, TheRect.Top + 2, Cells[ACol, ARow]);
  37.       end;
  38.  
  39.       if (ACol = 1) and (ARow = 2) then
  40.       begin
  41.         with TheRect do
  42.         begin
  43.             Left  := ColWidths[00]+GridLineWidth;
  44.             Top    := (RowHeights[ARow]*ARow)+(GridLineWidth*ARow);
  45.             Right  := ColWidths[00]+ColWidths[01]+ColWidths[02]+GridLineWidth;
  46.             Bottom := (RowHeights[ARow]*(ARow+1))+(GridLineWidth*ARow);
  47.         end;
  48.         Canvas.Brush.Color := clWhite;
  49.         Canvas.FillRect(TheRect);
  50.         Canvas.Font.Color := clWindowText;
  51.         Canvas.TextRect(TheRect, TheRect.Left+2, TheRect.Top+2, '');
  52.       end;
  53.  
  54.       if Trim(Cells[ACol,ARow]) > '' then
  55.       begin
  56.         if Cells[ACol,ARow] = '·' then
  57.         begin
  58.             aColores := GetColores('Sobrepeso');
  59.             with TheRect do
  60.             begin
  61.               Left  := ColWidths[00]+ColWidths[01]+GridLineWidth;
  62.               Top    := (RowHeights[ARow]*ARow)+(GridLineWidth*ARow);
  63.               Right  := ColWidths[00]+ColWidths[01]+ColWidths[02]+GridLineWidth;
  64.               Bottom := (RowHeights[ARow]*(ARow+1))+(GridLineWidth*ARow);
  65.             end;
  66.             Canvas.Brush.Color := StringToColor(aColores[COLORLIENZO]);
  67.             Canvas.FillRect(TheRect);
  68.             Canvas.Font.Color := StringToColor(aColores[COLORFUENTE]);
  69.             Canvas.TextRect(TheRect, TheRect.Left+2, TheRect.Top+2, '');
  70.         end;
  71.  
  72.         if Cells[ACol,ARow] = '_' then
  73.         begin
  74.             aColores := GetColores(Cells[ACol-1,ARow]);
  75.             with TheRect do
  76.             begin
  77.               Left  := ColWidths[00]+ColWidths[01]+GridLineWidth;
  78.               Top    := (RowHeights[ARow]*ARow)+(GridLineWidth*ARow);
  79.               Right  := ColWidths[00]+ColWidths[01]+ColWidths[02]+GridLineWidth;
  80.               Bottom := (RowHeights[ARow]*(ARow+1))+(GridLineWidth*ARow);
  81.             end;
  82.             Canvas.Brush.Color := StringToColor(aColores[COLORLIENZO]);
  83.             Canvas.FillRect(TheRect);
  84.             Canvas.Font.Color := StringToColor(aColores[COLORFUENTE]);
  85.             Canvas.TextRect(TheRect, TheRect.Left+2, TheRect.Top+2, '');
  86.         end;
  87.  
  88.         if ExisteEnTitulo(Trim(Cells[ACol,ARow])) then
  89.         begin
  90.             if Trim(Cells[ACol,ARow]) > '' then
  91.             begin
  92.               aColores := GetColores(Trim(Cells[ACol,ARow]));
  93.               Canvas.Brush.Color := StringToColor(aColores[COLORLIENZO]);
  94.               Canvas.FillRect(TheRect);
  95.               Canvas.Font.Color := StringToColor(aColores[COLORFUENTE]);
  96.               Canvas.TextOut(TheRect.Left + 2, TheRect.Top + 2, Cells[ACol, ARow]);
  97.             end;
  98.         end else begin
  99.             if Cells[00,ARow] = 'I. M. C.' then
  100.             begin
  101.               with TheRect do
  102.               begin
  103.                   Left  := 1;
  104.                   Top    := 0;
  105.                   Right  := ColWidths[00]-GridLineWidth;
  106.                   Bottom := (RowHeights[ARow]*3)-GridLineWidth;
  107.               end;
  108.               Canvas.Brush.Color := clWhite;
  109.               Canvas.FillRect(TheRect);
  110.               Canvas.Font.Color := clWindowText;
  111.               Canvas.TextRect(TheRect, TheRect.Left+2, TheRect.Top+2, Cells[00,ARow]);
  112.             end;
  113.  
  114.             if Cells[01,ARow] = 'Clasificacion de' then
  115.             begin
  116.               with TheRect do
  117.               begin
  118.                   Left  := ColWidths[00]+GridLineWidth;
  119.                   Top    := (RowHeights[ARow]*ARow)+(GridLineWidth*ARow);
  120.                   Right  := ColWidths[00]+ColWidths[01]+ColWidths[02]+GridLineWidth;
  121.                   Bottom := (RowHeights[ARow]*(ARow+1))+(GridLineWidth*ARow);
  122.               end;
  123.               Canvas.Brush.Color := clWhite;
  124.               Canvas.FillRect(TheRect);
  125.               Canvas.Font.Color := clWindowText;
  126.               Canvas.TextRect(TheRect, TheRect.Left+2, TheRect.Top+2, Cells[01,ARow]);
  127.             end;
  128.  
  129.             if Cells[01,ARow] = 'Riesgos Nutricionales' then
  130.             begin
  131.               with TheRect do
  132.               begin
  133.                   Left  := ColWidths[00]+GridLineWidth;
  134.                   Top    := (RowHeights[ARow]*ARow)+(GridLineWidth*ARow);
  135.                   Right  := ColWidths[00]+ColWidths[01]+ColWidths[02]+GridLineWidth;
  136.                   Bottom := (RowHeights[ARow]*(ARow+1))+(GridLineWidth*ARow);
  137.               end;
  138.               Canvas.Brush.Color := clWhite;
  139.               Canvas.FillRect(TheRect);
  140.               Canvas.Font.Color := clWindowText;
  141.               Canvas.TextRect(TheRect, TheRect.Left+2, TheRect.Top+2, Cells[01,ARow]);
  142.             end;
  143.         end;
  144.       end;
  145.   end;
  146. end;



Sí, está un poco complejo. Sí, utiliza muchas funciones y dos arreglos para controlar los textos, las posiciones y los colores, pero funciona DE MARAVILLA. Gracias por su apoyo y colaboración.  :wink:

Archivos adjuntos


  • 0

#9 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 05 abril 2013 - 07:00

Saludos.

Felicidades al menos saliste de eso por ahora....... ;)

Solo tengo una pequeña mejora a tu código, dado que somos hispanos parlantes nuestro idioma es bastante rico como también la ortografía y por un acento tu código puede que "deje" de funcionar (luego estarás halandote el pelo) .
Código original:


delphi
  1. function ExisteEnTitulo(sTexto: string): Boolean;
  2.   var
  3.       iIndicador: Integer;
  4.   begin
  5.       Result := False;
  6.       for iIndicador := 0 to Length(aTextoColor)-1 do
  7.       begin
  8.         if Trim(aTextoColor[iIndicador,TEXTOCELDA]) = Trim(sTexto) then
  9.         begin
  10.             Result := True;
  11.             Break;
  12.         end;
  13.       end;
  14.   end;



Código mejorado:


delphi
  1. function ExisteEnTitulo(sTexto: string): Boolean;
  2.   var
  3.       iIndicador: Integer;
  4.   begin
  5.       Result := False;
  6.       for iIndicador := 0 to Length(aTextoColor)-1 do
  7.       begin
  8.         if AnsiCompareText(aTextoColor[iIndicador,TEXTOCELDA], sTexto) = 0 then
  9.         begin
  10.             Result := True;
  11.             Break;
  12.         end;
  13.       end;
  14.   end;



Descripción del Wiki.

[off-topic]@Delphius: Por cierto mira una manera de "romper" el código.[/off-topic]
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 abril 2013 - 11:46

[off-topic]@Delphius: Por cierto mira una manera de "romper" el código.[/off-topic]


Voy a hacer de cuenta que no vi eso  :D Jaja. Mi cabeza de una empezó a traducirlo en un repeat  :p

Por cierto, hay una buena cantidad de procedimientos para comparar cadenas... entre ellas la que has puesto. Aún así tengo que admitir que no me acostumbro usarlas.

Saludos,
  • 0

#11 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 05 abril 2013 - 12:38

...Voy a hacer de cuenta que no vi eso  :D Jaja. Mi cabeza de una empezó a traducirlo en un repeat  :p...


¿Qué, qué hice?  :( :( :o :o :| :| : :

Lo intenté con un Repeat, pero no me arrojaba los datos requeridos...
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 05 abril 2013 - 12:50


...Voy a hacer de cuenta que no vi eso  :D Jaja. Mi cabeza de una empezó a traducirlo en un repeat  :p...


¿Qué, qué hice?  :( :( :o :o :| :| : :

Lo intenté con un Repeat, pero no me arrojaba los datos requeridos...


Tú nada, el que hizo fué Rolphy acerca de un debate en el uso o abuso de la interrupción de ciclos :D :D :D

Saludos
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 abril 2013 - 01:01


...Voy a hacer de cuenta que no vi eso  :D Jaja. Mi cabeza de una empezó a traducirlo en un repeat  :p...


¿Qué, qué hice?  :( :( :o :o :| :| : :

Lo intenté con un Repeat, pero no me arrojaba los datos requeridos...

Tu no has hecho nada Felipe. Mis más sinceras disculpas si te he molestado en algo al comentar el off-topic. Era en respuesta al off-topic de Rolphy.

Tú nada, el que hizo fué Rolphy acerca de un debate en el uso o abuso de la interrupción de ciclos :D :D :D

Saludos

Bueno... tecnicamente el que inició el debate fui yo. Y convengamos que hasta el momento el que parece estar en posición de galleguito testarudo sobre el tema soy yo... lo cual no sería novedad... que se raya el disco cada vez que mi cabeza se pone filosófica.  :D

Saludos,
  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 05 abril 2013 - 01:07


Tú nada, el que hizo fué Rolphy acerca de un debate en el uso o abuso de la interrupción de ciclos :D :D :D

Saludos

Bueno... tecnicamente el que inició el debate fui yo. Y convengamos que hasta el momento el que parece estar en posición de galleguito testarudo sobre el tema soy yo... lo cual no sería novedad... que se raya el disco cada vez que mi cabeza se pone filosófica.  :D

Saludos,


No dije que Rolphy habia comenzado el debate, digo que el que hizo algo fué rolphy con el off-topic.

En lo que si coincido es en donde dices:

"Bueno... tecnicamente el que inició el debate fui yo. Y convengamos que hasta el momento el que parece estar en posición de galleguito testarudo sobre el tema soy yo... lo cual no sería novedad... que se raya el disco cada vez que mi cabeza se pone filosófica"

Delphius dixit :D :D :D

Saludos
  • 0

#15 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 abril 2013 - 01:44

Delphius dixit :D :D :D


Que Delphius ni 8/4... ¡ese fue el cabrón de NewDelphius que hace de las suyas!  :D  *-)

Saludos,
  • 0

#16 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 05 abril 2013 - 01:45

Saludos.

Sin echarle la culpa a quien mejora el código.  *-) *-) *-)

Pues he visto en las implementaciones del método IndexOf el uso de Break  justo como lo expuse.

@TiammatMX, no te preocupes es que @Delphius se puso a filosofar sobre un tema y quise armar un "bochinche" por el código que expuse.  :D :D :D :D
  • 0

#17 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 abril 2013 - 02:07

Saludos.

Sin echarle la culpa a quien mejora el código.  *-) *-) *-)

Pues he visto en las implementaciones del método IndexOf el uso de Break  justo como lo expuse.

@TiammatMX, no te preocupes es que @Delphius se puso a filosofar sobre un tema y quise armar un "bochinche" por el código que expuse.  :D :D :D :D

Yo he visto el Break en varios lados de la VCL, casi en todas era en fors... ¡y de los más simples!. Y la verdad es que justamente por eso me intriga más que se decante por una salida "no tan elegante". O es que ese Break lleva a una mejora en rendimiento al momento de la compilación o es que de plano por ahorrarse unas poquitas LDC no se usa un ciclo más apropiado para salir de forma "legal".

¿Yo bochinche? Naa... si soy todo un santo :D

Saludos,
  • 0

#18 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 08 abril 2013 - 04:03

Para las comparaciones de cadenas, yo suelo usar SameText que, a parte de devolver un valor booleano (y por ende hacer más sencilla una comparación lógica) no es case sensitive (al igual que AnsiCompareText) :-)

Nos leemos

  • 0




IP.Board spam blocked by CleanTalk.