PDA

Ver la Versión Completa : ¿stringid como colorear celda o poner imagen?


JXJ
11-10-2011, 19:57:17
hola.

una duda. como puede cololear una celda de un stringgrid

ejemplo

tengo un stringgrid con 10 columnas y 10 filas.

100 items


y el item 5 columna y 5 fila ya no tiene stock.
y lo quiero poner en rojo.

otro item en otra fila y columna ya le queda poco en estoc
ponerlo en amarillo.

los demas que si tienen estock.
ponerlos en verde

bueno la idea es esa. ponerles una marca ya sea coloreando la fila o poniendoles una imagen.

ando en eso.

graicas.

ecfisa
11-10-2011, 20:28:10
Hola JXJ.

Podrías hacer:

...
const
COLSTOCK = 5; // Columna Stock
...
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
R: TRect;
v: Double;
begin
with TStringGrid(Sender) do
begin
if TryStrToFloat(Cells[ACol,ARow], v) then // prevenir posible error de conversión
if (ACol = COLSTOCK) and (ARow >= FixedRows) then
begin
if (v = 0) then // v = 0 : Sin stock
begin
Canvas.Brush.Color:= clRed;
Canvas.Font.Color:= clWhite;
end
else // hay stock
begin
Canvas.Brush.Color:= clLime;
Canvas.Font.Color:= clBlack;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+1, Rect.Top+1, Cells[ACol,ARow]);
end;
end;
end;


Un saludo.

JXJ
12-10-2011, 22:24:56
funcion miy bien. ahora estoy tratando de que sea mas versatil

teniendo un gris cargado en forma de cuadricula.
si las coordenadas varian. cargadas en un listado. hacer que cambien los colores de fondo.

ando algo enredado si no me doy a entender

puse esto asi.


procedure TfrmArticulos.StringGrid1DrawCell(Sender: TObject; ACol,
ARow: Integer;
Rect: TRect;
State: TGridDrawState);
var
R: TRect;
v: Double;
begin
with TStringGrid(Sender) do
begin
if TryStrToFloat(Cells[ACol,ARow], v) then // prevenir posible error de conversión
if (ACol = 3) and (ARow = 3) then
begin
if (v = 0) then // v = 0 : Sin stock
begin
Canvas.Brush.Color:= clRed;
Canvas.Font.Color:= clWhite;
end
else // hay stock
begin
Canvas.Brush.Color:= clLime;
Canvas.Font.Color:= clBlack;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+1, Rect.Top+1, Cells[ACol,ARow]);
end;

if TryStrToFloat(Cells[ACol,ARow], v) then // prevenir posible error de conversión
if (ACol = 2) and (ARow = 2) then
begin
if (v = 0) then // v = 0 : Sin stock
begin
Canvas.Brush.Color:= clRed;
Canvas.Font.Color:= clWhite;
end
else // hay stock
begin
Canvas.Brush.Color:= clLime;
Canvas.Font.Color:= clBlack;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+1, Rect.Top+1, Cells[ACol,ARow]);
end;

if TryStrToFloat(Cells[ACol,ARow], v) then // prevenir posible error de conversión
if (ACol = 5) and (ARow = 5) then
begin
if (v = 0) then // v = 0 : Sin stock
begin
Canvas.Brush.Color:= clRed;
Canvas.Font.Color:= clWhite;
end
else // hay stock
begin
Canvas.Brush.Color:= clLime;
Canvas.Font.Color:= clBlack;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+1, Rect.Top+1, Cells[ACol,ARow]);
end;
end;
end;



lo primero que me interesa es que localize la celda por sus coordenadas.
fila y columna.

las coordenadas las quiero cargar desde un record. o
de un stringlist. o un archivo. csv .

aca la imagen de como se ve

http://img542.imageshack.us/img542/7554/gridbonito.png

ecfisa
12-10-2011, 22:53:35
Hola JXJ.

Si no te entiendo mál, una manera puede ser almacenar en dos cadenas (asignables de donde gustes) los valores de columnas y filas para hacer la posterior evaluación en el evento OnDrawCell.

Algo como por ejemplo:

...
{ A fines del ejemplo les asigno valor debajo,
vos podrías tomar los valores desde un archivo, etc }
var
ColStr: string = '2,3,5'; // Columnas sobre las que se evalua
RowStr: string = '1,2,3,4,5'; // Filas sobre las que se evalua

...
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
R: TRect;
v: Double;
begin
with TStringGrid(Sender) do
begin
if (Pos(IntToStr(ACol), ColStr) > 0) and (Pos(IntToStr(ARow), RowStr) > 0)
and TryStrToFloat(Cells[ACol,ARow], v) then
begin
if (v = 0) then // v = 0 : Sin stock
begin
Canvas.Brush.Color:= clRed;
Canvas.Font.Color:= clWhite;
end
else // hay stock
begin
Canvas.Brush.Color:= clLime;
Canvas.Font.Color:= clBlack;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+1, Rect.Top+1, Cells[ACol,ARow]);
end;
end;
end;


Saludos.

JXJ
14-10-2011, 04:49:44
si eficsa asi es.

ta muy interesante jugar con el stringgrid.

es bastante potente y flexible.

gracias por tu ayuda.