Casimiro se que das el tema por sanjado, pero me quedo la duda de como quedaría con la linea en el grid y la verdad me sorprendió la sencillez de la respuesta, te pongo unas imágenes y al final el código por si sirve de utilidad a algún compañero. Por cierto de momento en todas mis pruebas no me ha dado fallo.
Con linea y cinco colores
Con linea y dos colores
Con linea y sin colores
y por último el código
Código Delphi
[-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var Linea:Integer;
begin
Linea:=0;
if Asiento<>DataSource1.DataSet.FieldByName('ASIENTO').AsString then
begin
if Column.FieldName='HABER' then Asiento:=DataSource1.DataSet.FieldByName('ASIENTO').AsString;
Linea:=1;
end;
if CheckBox3.Checked=false then
begin
if CheckBox1.Checked=true then
begin
if CheckBox2.Checked=true then
begin
case UlDigit(StrToInt(DataSource1.DataSet.FieldByName('ASIENTO').value)) of
0 :ColorElegido:=ColorA;
1 :ColorElegido:=ColorB;
2 :ColorElegido:=ColorC;
3 :ColorElegido:=ColorD;
4 :ColorElegido:=ColorE;
5 :ColorElegido:=ColorA;
6 :ColorElegido:=ColorB;
7 :ColorElegido:=ColorC;
8 :ColorElegido:=ColorD;
9 :ColorElegido:=ColorE;
end;
end else
begin
case UlDigit(StrToInt(DataSource1.DataSet.FieldByName('ASIENTO').value)) of
0 :ColorElegido:=ColorA;
2 :ColorElegido:=ColorA;
4 :ColorElegido:=ColorA;
6 :ColorElegido:=ColorA;
8 :ColorElegido:=ColorA;
1 :ColorElegido:=ColorB;
3 :ColorElegido:=ColorB;
5 :ColorElegido:=ColorB;
7 :ColorElegido:=ColorB;
9 :ColorElegido:=ColorB;
end;
end;
end else
begin
if Asiento<>DataSource1.DataSet.FieldByName('ASIENTO').AsString then
begin
case SelectMiColor of 0:begin
ColorElegido:=ColorB;
SelectMiColor:=1;
end;
1:begin
ColorElegido:=ColorA;
SelectMiColor:=0;
end;
end;
end;
end;
DBGrid1.Canvas.Brush.Color := ColorElegido;
Dbgrid1.Canvas.FillRect(Rect);
dbGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
if Linea=1 then
begin
DBGrid1.Canvas.Pen.Color:=clNavy;
DBGrid1.Canvas.Pen.Width:=3;
DBGrid1.Canvas.MoveTo(Rect.Left, Rect.Top+1);
DBGrid1.Canvas.LineTo(Rect.Right, Rect.Top+1);
end;
end;