Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿stringid como colorear celda o poner imagen? (https://www.clubdelphi.com/foros/showthread.php?t=76145)

JXJ 11-10-2011 19:57:17

¿stringid como colorear celda o poner imagen?
 
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:
Código Delphi [-]
...
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.

Código Delphi [-]
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


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:
Código Delphi [-]
... 
{ 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.


La franja horaria es GMT +2. Ahora son las 04:12:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi