Buenas tardes a todos, después de estar leyendo todo el hilo y cogiendo ideas creo que lo he conseguido, por lo menos a mí me funciona y no he encontrado todavía un caso que me falle. Voy a ello...
Mi caso era parecido al de casimiro, tengo un dbgrid en el que aparecen una columna "Unidad de producción" (integer), esta columna se puede repetir en el formulario 1 o más veces. La idea es alternar (en mi caso con gris y blanco) los grupos de filas con la misma Unidad de Producción para facilitar visualmente al usuario la detección de estas filas. Al lío...
He utilizado dos arrays (color y ud_producción) del mismo tamaño que la consulta que me devuelve las filas del dbgrid, la idea es guardar en uno el color actual de cada fila y en el y en el otro la ud. de producción. De esta manera cuando voy pintando en el drawcolumncell voy comparando siempre con el valor de ud. producicón de la fila anterior para saber si tengo o no que cambiar el color. Pongo el código porque quizás estoy liando un poco con la explicación.
Código Delphi
[-]
procedure TFMFinalizaOrdMan.DBGDetalle_lineaDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
cambia_color, fila, fila_ant : SmallInt;
begin
fila := (sender as TDBGrid).datasource.dataset.RecNo - 1;
if fila = 0 then
fila_ant := 0
else
fila_ant := fila - 1;
cambia_color := 0;
if v_ud_produccion[fila] = 0 then
begin
v_ud_produccion[fila] := Column.Field.Dataset.FieldbyName('UD_PRODUCCION').AsInteger;
if v_ud_produccion[fila] <> v_ud_produccion[fila_ant] then
cambia_color := 1
else
v_color[fila] := v_color[fila_ant];
if cambia_color = 1 then
begin
if v_color[fila_ant] = 1 then
v_color[fila] := 0
else
v_color[fila] := 1;
end;
end;
with (Sender as TDBGrid) do
begin
if v_color[fila] = 1 then
Canvas.Brush.Color := clBtnFace
else Canvas.Brush.Color := clWindow;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
procedure TFMFinalizaOrdMan.DBGDetalle_lineaTitleClick(Column: TColumn);
var
i : SmallInt;
begin
for i := 0 to (length(v_color)-1) do
begin
v_color[i] := 0;
v_ud_produccion[i] := 0;
end;
end;
Creación de los array en el public del formulario
Código Delphi
[-]
public:
v_ud_produccion : array of Integer;
v_color : array of Integer;
Después de recargar el dataset asigno el tamaño de los arrays
Código Delphi
[-]
SetLength (v_ud_produccion, DMFinalizaOrdMan.QMTabla.RecordCount+1);
SetLength (v_color, DMFinalizaOrdMan.QMTabla.RecordCount+1);
En mi caso tengo un para de botones que filtran lanzando de nuevo el dataset, en cada uno de ellos vacío los arrays con las mismas instrucciones
Lo suyo sería hacer un procedure que lo haga y se llame desde los sitios en los que cambie el dataset pero estoy haciéndolo un poco rápido.(perdón)
Código Delphi
[-]
for i := 0 to (length(v_color)-1) do
begin
v_color[i] := 0;
v_ud_produccion[i] := 0;
end
Con esto a mí me funciona a la perfección. Sería cuestión ya cada uno de ajustar a las peculiaridades de su código.
Espero aportar mi granito de arena y ayudar al igual que todos vosotros me habéis ayudado en muchos casos.