PDA

Ver la Versión Completa : DBGrid (Color de barra de selección)


Caro
14-05-2008, 03:50:58
Hola a todos

En un DbGrid según a mi campo estado que tengo muestro algunos registros de un color u otro, lo que quiero es poder cambiar el color de la barra de selección que aparece en azul, osea que cuando este con un color u otro me muestre la barra de selección de un color un poco mas fuerte al color donde se encuentra en ese momento.

Saluditos y muchísimas gracias por adelantado.

roman
14-05-2008, 03:59:56
Hola Caro,

Puedes hacerlo cambiando DBGrid.Canvas.Brush.Color:


procedure TForm1.DBGrid1DrawColumnCell(
Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if tu_condición and (gdSelected in State) then
DBGrid1.Canvas.Brush.Color := clRed;

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


// Saludos

Caro
14-05-2008, 04:13:48
En este momento estaba viendo en la ayuda sobre el gdSelected, muchísimas gracias Roman, me ha funcionado como quería.


procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then
begin
if DBGrid1.Canvas.Brush.Color = $00A4FFFF then
begin
DBGrid1.Canvas.Brush.Color := clYellow;
DBGrid1.Canvas.Font.Style := [fsBold];
end
else
begin
DBGrid1.Canvas.Brush.Color := $00E7C4B6;
DBGrid1.Canvas.Font.Color := clBlack;
DBGrid1.Canvas.Font.Style := [fsBold];
end;
end;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


Saluditos

roman
14-05-2008, 06:06:48
No sé si ya te percataste, pero esta forma de pintar la barra no funciona bien si el DBGrid tiene activada la opción dgMultiSelect. Luego de darle algunas vueltas al código de la VCL, veo que la opción más sencilla es usar el método HighlightCell del DBGrid, ya que éste toma en consideración las filas que estén seleccionadas. Lo malo es que este método está protegido, aunque puede usarse el viejo truco de la desprotección:


type
TDBGrid = class(DBGrids.TDBGrid);

procedure TForm1.DBGrid1DrawColumnCell(
Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if TDBGrid(DBGrid1).HighlightCell(DataCol, TDBGrid(DBGrid1).Row, '', State) then
DBGrid1.Canvas.Brush.Color := clRed;

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


En fin, creo que esto sólo sería necesario si está activada la opción mencionada.

// Saludos

Caro
14-05-2008, 14:13:28
La verdad no me di cuenta que no funcionaba con la opción dgMultiSelect, ya que no la tengo activada, pero tomare en cuenta lo que dijiste cuando lo necesite de esa forma ;). Muchas gracias de nuevo amiguito Roman.

Saluditos

Cañones
17-05-2008, 14:27:53
Hola. Una consulta.
Como hiciste para que cambie el color del registro según el campo estado, Yo quisiera poner en rojo los que tienen una fecha de baja?
Estoy interesado en eso, porque lo busque y no pude saber como hacerlo.
Desde Ya Gracias.

Caro
18-05-2008, 07:55:24
Hola Cañones, tienes que hacerlo en el mismo evento OnDrawColumnCell, suponiendo que los que no tienen fecha de baja, tienen un valor Null.


procedure TForm1.DBGrid1DrawColumnCell(
Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Not (Query1.FieldByName('FECHA_BAJA').IsNull) then
begin
// Cambiamos el color
DBGrid1.Canvas.Brush.Color := $00A4FFFF;
DBGrid1.Canvas.Font.Color := clRed;

DBGrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);
end;
end;


Saluditos

Cañones
24-05-2008, 14:52:49
Gracias Caro.
Sabes que encontre el hilo de suerte igual que la primera vez que entre y tu respuesta no me llego al correo.
Bueno, ahora veo como hacerlo.
Muchas gracias, esto me sirve de mucho.
Saludos.
Cañones.