PDA

Ver la Versión Completa : Filas de colores en Stringgrid


Carlos Arevalo
17-12-2003, 00:53:02
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:


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:


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


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:

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.