Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Pintar celda especifica de un stringrid (https://www.clubdelphi.com/foros/showthread.php?t=59126)

Nomad 13-08-2008 21:45:37

Pintar celda especifica de un stringrid
 
Hola

la verdad ya revisé los post que hay en el foro sobre como cambiar los colores en un stringgrid, y tambien busqué en internet y todo usan practicamente el mismo codigo y lo meten en el evento OnDrawCell del stringrid

Pero a mi eso no me sirve y he tratado de cambiar esos ejemplos a mis necesidades y no he podido, asi que les agradecería cualquier comentario o ayuda que puedan darme.

Yo lo que necesito es cuando estoy llenando el stringgrid, depediendo de lo que estoy poniendo ahi, entonces cambiarle el color o por los menos poder resaltar el tipo de letras.

Gracias de antemanos y saludos

Nomad

Nomad 13-08-2008 22:34:06

Vean lo que se me ocurrió, aunque aún no funciona, creo que estoy bastante cerca, asi que cualquier ayuda o sugerencia es bien recibida.

Lo que hice fue que dentro del procedimiento OnDrawCell ingrese una variable boolean y puse una condicion, en la cual, si la variable es true, entonces debe cambiar el estilo por negrita.

Busque la variable PINTAR en el codigo:
Código Delphi [-]
procedure TFDistri.GrDetalleDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  sTexto: String;           // Texto que va a imprimir en la celda actual
  Alineacion: TAlignment;   // Alineación que le vamos a dar al texto
  iAnchoTexto: Integer;     // Ancho del texto a imprimir en pixels
begin
with GrDetalle.Canvas do
  begin
    // Lo primero es coger la fuente por defecto que le hemos asignado al componente
    Font.Name := GrDetalle.Font.Name;
    Font.Size := GrDetalle.Font.Size;
    if ARow = 0 then
      Alineacion := taCenter
    else
      // Si es la columna del importe pendiente alineamos el texto a la derecha
      if ACol = 4 then
        Alineacion := taRightJustify
      else
        Alineacion := taLeftJustify;

    // ¿Es una celda fija de sólo lectura?
    if gdFixed in State then
    begin
      Brush.Color := clNavy;      // le ponemos azul de fondo
      Font.Color := clWhite;      // fuente blanca
      Font.Style := [fsBold];     // y negrita
    end
    else
    if  pintar then
    begin
       Font.Style := [fsBold];     // negrita
    end;
    sTexto := GrDetalle.Cells[ACol,ARow];
    FillRect( Rect );
    iAnchoTexto := TextWidth( sTexto );
    case Alineacion of
      taLeftJustify: TextOut( Rect.Left + 5, Rect.Top + 2, sTexto );
      taCenter: TextOut( Rect.Left + ( ( Rect.Right - Rect.Left ) - iAnchoTexto ) div 2, Rect.Top + 2, sTexto );
      taRightJustify: TextOut( Rect.Right - iAnchoTexto - 2, Rect.Top + 2, sTexto );
    end;
  end;
end;

Luego lo que hice donde mando escribir el valor en la celda, puse la variable variable pintar = true, escribo el valor y luego pongo pintar = false.

Código Delphi [-]
pintar := true;
GrDetalle.Cells[col+2,memfila] := IntToStr(Suma);
pintar := false;

Pero el problema es que algo no estoy haciendo bien, porque siempre llega la variable PINTAR en false. y si quito la parte donde dice pintar = false, me pone todos las celdas en negrita.

Gracias por la ayuda...

Neftali [Germán.Estévez] 14-08-2008 12:51:06

Échale un vistazo a mi página web. En la sección de ejemplos hay uno sobre StringGrid; No es expreso de pintar celdas, pero incluye el código para hacerlo.

Descargalo y échale un vistazo.

Caro 14-08-2008 15:06:04

Hola Nomad, tu dices que quieres pintar una celda de acuerdo al valor que escriba en dicha celda, entonces debes preguntar dentro del evento OnDrawCell directamente por ese valor y dependiendo del balor pintas, ejemplo

Si se escrito un 1 en la celda, se pinta de rojo y se pone en negrita.
Código Delphi [-]
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 if (StringGrid1.Cells[ACol,ARow]='1') and (ACol=4) then
  begin
   //Pintamos la celda de rojo
   StringGrid1.Canvas.Brush.Color := clRed;
   StringGrid1.Canvas.FillRect(Rect);
 
   //ponemos en negrita el texto
   StringGrid1.Canvas.Font.Style := [fsBold];
   DrawText(StringGrid1.Canvas.Handle,PChar(StringGrid1.Cells[Acol,ARow]),-1, Rect, DT_LEFT);
  end;
end;

Saluditos

Nomad 14-08-2008 15:17:10

problem
 
Ese es el problema, que ese valor no es el mismo siempre, ni se en cual celda cayó, asi que por lo tanto es dificil saber porque debe preguntar.

seoane 14-08-2008 15:30:41

Se me ocurre que utilices la propiedad Objects del TStringGrid. Asi cuando asignes la propiedad Cells, tambies asignas la propiedad Objects.

Por ejemplo:
Código Delphi [-]
// Si queremos pintarla
GrDetalle.Objects[col+2,memfila] := Pointer(1);
// Y si no quieres pintarlas
GrDetalle.Objects[col+2,memfila] := Pointer(0);

GrDetalle.Cells[col+2,memfila] := IntToStr(Suma);

Luego en el evento OnDrawCell comprueba la propiedad Object de esa celda:
Código Delphi [-]
if  GrDetalle.Objects[ACol,ARow] = Pointer(1)  then
  begin
    Font.Style := [fsBold];     // negrita
  end;


La franja horaria es GMT +2. Ahora son las 07:00:38.

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