Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Filas de colores en Stringgrid (https://www.clubdelphi.com/foros/showthread.php?t=6072)

Carlos Arevalo 17-12-2003 00:53:02

Filas de colores en Stringgrid
 
He encontrado varios ejemplos en el foro acerca de del tema pero coloreando celdas individuales y la verdad estoy un poco confundido con el tema.

Me podrian explicar un poco mas claro como es el procedimiento para colorear las filas en un Stringgrid.

Gracias, amigos.

Descendents 17-12-2003 01:00:52

Pon esto en el Ondrawcell del stringgrid
begin
if (acol = 1) and (arow = 1) then begin
StringGrid1.Canvas.Brush.Color := clred;
StringGrid1.Canvas.FillRect(Rect);
end;
end;

Este evento ondrawcell se produce cuando se dibujan las celdas del stringgrid. pues lo que le estoy diciendo aqui es.

si acol es 1 y arow es 1 pintas la celda de rojo.

acol = columna
arow = fila

A ver si te sirvio

Saludos

Carlos Arevalo 17-12-2003 01:27:38

Gracias Descendents

Este ejemplo ya se encuentra publicado y esta perfecto lo que no se me da es pintar toda la fila si me podrian dar un ejemplo lo agradeceria mucho.

Gracias.

Carlos Arevalo 17-12-2003 01:38:00

Al agregarle el FOR puedo colorear la fila.

Mi pregunta
Es este el mejor metodo o se puede hacer de otra forma?

var i: integer;
begin
for i:=1 to 7 do
begin
if (acol = i) and (arow = 0) then
begin
StringGrid1.Canvas.Brush.Color := clred;
StringGrid1.Canvas.FillRect(Rect);
end;
end;

roman 17-12-2003 02:59:55

Desde la primera solución tienes la respuesta. Simplemente omite la condición sobre la columna:

Código:

if ARow = 1 then
begin
  StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.FillRect(Rect);
end;

Como no hay condición sobre la columna, el código se ejecutará para cualquier celda de la fila 1, esto es, sobre todo el primer renglón.

Desde luego deberá sustituir 1 por el renglón que desees colorear. Si por ejemplo, lo que deseas es colorear los renglones alternadamente puees hacer algo como:

Código:

if Odd(ARow) then
begin
  StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.FillRect(Rect);
end;

que pintará de rojo todos los renglones impares.

// Saludos

Descendents 17-12-2003 13:04:28

Como dice roman.

Arriba te indique que arow era linea y acol era columna.

La condicion que tu le pongas al ondrawcell es la que tu quieras.De todos modos, supongo que ya te quedo claro con le que te dijo roman no?

Saludos

Carlos Arevalo 17-12-2003 20:00:19

Ahora si estoy claro yo pense que tenia que utilizar las dos variables al mismo tiempo Acol y Arow.



Muchas gracias.

Carlos Arevalo 20-12-2003 21:46:25

:( :confused:

Disculpen pero no le agarro la vuelta.

No logro entender bien como es la cuestion de pintar el grid.

Me explico para ver si me pueden orientar.

Lo que quiero es que segun una condición en la columna X se me pinte la linea del grid de un color X.

Segun lo que entendi esto es lo que me da el cerebro.

with stringgridpendientes do
begin
i:=Arow;
txt:=Cells[ACol,ARow];
if txt='Por revisar' then
begin
if Arow=i then
begin
Canvas.Brush.Color:=Clred;
Canvas.FillRect(rect);
Canvas.TextOut(Rect.left +1, Rect.top +1, Cells[ACol,ARow]);
end;
end
else
begin
if Arow=i then
begin
Canvas.Brush.Color:=Clblue;
Canvas.FillRect(rect);
Canvas.TextOut(Rect.left +1, Rect.top +1, Cells[ACol,ARow]);
end;
end;
end;
end;


Muchas gracias.

Descendents 21-12-2003 05:12:21

pon

If (acol = 1) and (la condicion que quieras ) then begin
Y pintas la cell, la linea o lo que quieras saludos
end;

Saludos

jpcancino 06-01-2004 02:05:17

Pinta toda la columna, pero el problema esque me borra la informacion que contenía cada celda

Descendents 06-01-2004 03:00:28

estado mirando y prueba esto a ver que tal

Código:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 if (acol = 1) then begin
 StringGrid1.Canvas.Brush.Color := clblue;
 StringGrid1.Canvas.Font.Color := clHighlightText;
 StringGrid1.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, StringGrid1.Cells[acol,arow]);
 end;
end;

Saltate el fill rect, y ponle el textrect,. y dale el color que quieres en el font del canvas

Saludos

Carlos Arevalo 06-01-2004 19:13:30

Este es el codigo que estoy utilizando pero no logro pintar la fila completa solo la primera celda de cada fila.

Alguna sugerencia?

Gracias.

procedure TFormOrden.StringGridpendientesDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);

var txt: string;
i: integer;

begin

with stringgridpendientes do
begin
i:=Arow;
txt:=Cells[ACol,ARow];
if (Arow=i) and (txt='Por revisar') then
begin
Canvas.Brush.Color:=Clred;
Canvas.FillRect(rect);
Canvas.TextOut(Rect.left +1, Rect.top +1, Cells[ACol,ARow]);
end;

if (Arow=i) and (txt='Lista') then
begin
Canvas.Brush.Color:=Clblue;
Canvas.FillRect(rect);
Canvas.TextOut(Rect.left +1, Rect.top +1, Cells[ACol,ARow]);
end;
end;
end;

jpcancino 06-01-2004 20:30:35

muchas gracias por tu ayuda Descendents.

Saludos

Lepe 07-01-2004 10:33:48

lo siguiente a mi entender sobra está marcado en rojo, que
conste que no he trabajado con el stringGrid, lo intento evitar,
pero en fin, al grano:
Código:

with stringgridpendientes do
begin
  i:=Arow;
txt:=Cells[ACol,ARow];
if (Arow=i) and (txt='Por revisar') then

Entiendo que se debe pintar para cada columna, pero en cada evento,
"i" siempre será igual que "Arow".

Si me equivoco, comunicadlo, Asias


SAludos.

Carlos Arevalo 09-01-2004 21:44:16

Sigo con el problema de no poder colorear la fila entera.

Con el codigo que expuse anteriormente solo puedo colorear la primera celda.


Gracias por la ayuda que me puedad prestar.

Gracias.

roman 09-01-2004 22:13:18

Algunos comentarios:

Primero que nada te ruego que utilices la etiqueta [ code ] para que el código que escribas aparezca correctamente indentado. Cuando un hilo progresa y el código sigue sin indentarse llega un momento en que da pereza leerlo.

En segundo lugar ya Lepe te indicó que hay un error en la lógica de tu código. La condición (ARow = i) siempre evalúa a true por lo que sale sobrando en el condicional.

En tercer lugar hay que entender que el evento DrawCell se ejecuta por cada celda y no por cada fila. Tal como tienes el código, únicamente se iluminarán de rojo las celdas (no las filas) cuyo texto sea "Por revisar" y de azul las celdas (no las filas) cuyo texto sea "Lista", independientemente de la posición que ocupen en la fila.

Suponiendo que estos textos los tienes en la primera celda de cada fila (cosa que sospecho por lo que dices de que sólo se ilumina la primera celda) lo que debes hacer es comparar el texto no de la celda que te llega en el evento (Cells[ACol,ARow]) sino con la primera celda de la fila indicada por ARow:

Cells[0, ARow]

Finalmente, es innecesario usar Canvas.TextOut para escribir el texto de la celda. Unicamente cambia el color del fondo con Canvas.Brush.Color y utiliza el método DefaultDrawColumnCell después para que escriba el texto.

// Saludos

Carlos Arevalo 09-01-2004 22:26:45

Gracias Roman tomare en cuenta todas tus observaciones.


La franja horaria es GMT +2. Ahora son las 19:15:27.

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