Cambiar los colores de las filas en un StringGrid

Tengo una tabla de compras y otra de items_compra, ¿no?
Yo puedo llenar el StringGrid, de la siguiente forma:
Fila 0 pongo un encabezado de la compra.
Fila 1 los datos la compra.
Fila 2 el encabezado de los items.
Fila 3 los datos de los items.
Y esto se repite por cada registro que haya en la tabla compras. Y los items por cada compra son variable, de 1 a 4.
Esto lo puedo lograr, ¿no?
Ahora lo que quiero hacer que se distingan los datos pintando las filas, por ejemplo, de azul los encabezados de las compra y los items. La fila de tiene los datos de la compra de verde y la de los items de rojo. ¿Por ejemplo, no?

1 respuesta

Respuesta
1
Prueba este código a ver que tal te resulta. Quizás tengas que modificar algo ya que lo he sacado de un evento de dbgrid pero será poca cosa seguramente. Espero que te sirva.
procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
{Si es la primera columna, calculamos el color}
{UnColor debe estar declarada global a la form}
if DataCol=TStringGrid(Sender).LeftCol-1 then
if Table1Size.AsInteger>10
then UnColor:=clRed
else UnColor:=clBlack;
with (Sender As TDBGrid).Canvas do
begin
Font.Color:=UnColor;
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, Column.Field.AsString);
end;
end;
Hola.
Ya he probado con ese código, no he podido hacer lo que necesito. Este código lo que hace es cambiar las columnas con un criterio estático. ¿No se si me hice entender?
Saludos.
La celda 0 que crees para el id para hacerla invisibles podrías ponerle width 0 porque creo que no existe la propiedad visible.
Siento la tardanza y la respuesta anterior que no te sirviera, no entendí bien la pregunta.
Algo similar me pasó con un threeview que tenía que mostrar diferentes iconos según el nivel y tema: lo logré usando la propiedad Data de tipo Pointer de cada nodo, metiendo una estructura (record) con el id de bitmap, además de otra información necesaria. Así, en el repintado, sólo tenía que acceder a esa property y mirar cuál era el id de ese nodo. De ese modo se me ocurre que quizá pudieras crear algo similar, una cell con un id de color (1,2,3,4) invisible para cada fila y así en el evento onDrawCell mirar esa columna (podría ser la 0 para facilitar su localización) y dependiendo del id, pintar toda la fila del color deseado.
Disculpa la molestia, pero con esto del delphi, estoy tocando de oído.
Si tuvieras un ejemplo de como tendría que hacer te lo agradecería mucho.
Igual te agradezco el esfuerzo.
Saludos
Con este procedimiento cargamos la select que deseemos con el identificador de color correspondiente (IdColorColumna).
Procedure QueryGrid(DBName, Statement: String; Target: TStringGrid; Titles: Boolean; IdColorColumna : Integer);
Var Aux, Col, Lin: Integer;
begin
With TQuery.Create(Nil) Do
Try
DatabaseName := DBName;
SQL.Text := Statement;
Open;
If Not IsEmpty Then
Begin
if Titles then Aux := 1 else Aux := 0;
Target.ColCount := FieldCount;
Target.RowCount := RecordCount+ Aux;
Target.FixedCols := 0;
Target.FixedRows := Aux;
//La comuna 0 será de 0 de ancho
Target.ColWidths[0] := 0;
If Titles Then
For Col := 1 To FieldCount-1 Do
Target.Cells[Col,0] := Fields[Col].FieldName;
Lin := 0;
While Not Eof Do
Begin
//Guardamos en la columna el id de color en el evento ondrawcell
Target.Cells[0,Lin] := IntToStr(IdColorColumna);
For Col := 1 To FieldCount-1 Do
Target.Cells[Col,Lin+Target.FixedRows] :=
Fields[Col].AsString;
Next;
Inc(Lin);
End;
End;
Finally
Close;
Free;
End;
end;
En el evento Ondrawcell:
With stringgrid1.canvas do
begin
case (stringgrid1.cells[0,Arow]) of
1: Brush.Color := clred;
2: Brush.Color := clblue;
3: Brush.Color := clyellow;
end;
fillrect(ARect);
TextOut(Arect.left+2, Arect.top +2, stringgrid1.cells[Acol,Arow]);
end;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas