PDA

Ver la Versión Completa : Pintar filas TDBGrid


ManuelPerez
07-08-2008, 20:54:12
Hola necesito pintar las filas en una TDBGrid, es decir pintar por ejemplo con celeste las filas impares.
gracias

enecumene
07-08-2008, 21:09:28
Hola, ¿te refieres a alternar los colores en las filas de un DBGrid?

Delphius
07-08-2008, 21:10:15
Hola ManuelPerez,
Para conseguir lo que quieres, debes interceptar el evento OnDrawDataCell y/o el OnDrawColumnCell. Estos eventos se disparan cada vez que se va a "pintar" una celda y columna. Tengo entendido que en otras ocasiones se habló del tema. Si buscas en el buscador con la palabras clave pintar dbgrid y DrawColumnCell, DrawDataCell vas a encontrar mayor información.

Yo mucho no puedo decirte puesto que no trabajado con estos eventos pero recuerdo haber visto ejemplos aqui en los foros.

La otra opción es emplear un dbgrid de terceros que añada dicha funcionalidad. Puedes encontrar componentes pagos como gratuitos. En torry.net es muy probable que encuentres algunos.

Saludos,

ManuelPerez
07-08-2008, 21:12:44
Si lo que quiero es alternar los colores.

celeste
blanco
celeste
blanco
celeste
...

gracias

coso
07-08-2008, 21:13:47
hola,
seria algo asi

procedure T_main.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
x : integer;
begin
if (gdSelected in state) then
(sender as TDBGrid).canvas.Brush.Color := $00C08000
else
if (sender as TDBGrid).datasource.dataset.RecNo mod 2 = 0 then
(sender as TDBGrid).canvas.Brush.Color := clAqua - $000b0b0b
else
(sender as TDBGrid).canvas.Brush.Color := clAqua - $00010101;

(sender as TDBGrid).canvas.FillRect(Rect);

if Column.Field <> nil then
begin
case Column.Alignment of
taCenter : x := (Rect.Right - Rect.Left) div 2 - (sender as TDBGrid).canvas.TextWidth(Column.Field.asstring) div 2;
taLeftJustify : x := 0;
taRightJustify : x := Rect.Right - (sender as TDBGrid).canvas.TextWidth(Column.Field.asstring);
end;

(sender as TDBGrid).DefaultDrawing := true;
(sender as TDBGrid).canvas.TextOut(Rect.Left + x,Rect.top,Column.Field.asstring);
end;
end;



EDITO : modificacion para el justify y el selected, y el activerecord por el RecNo

egostar
07-08-2008, 21:18:13
Hola (http://www.clubdelphi.com/foros/showpost.php?p=17866&postcount=2)


Salud OS

BlueSteel
07-08-2008, 22:05:32
como menciono delphiu anteriormente, puedes utilizar el componente NiceGrid, el cual es muy util y puedes realizar varios opciones adicionales..

vista esta pagina (http://www.priyatna.org/nicegrid.php)y lo encontrarás...

Salu2:p:D

Neftali [Germán.Estévez]
08-08-2008, 08:56:50
También puedes echarle un vistazo a este componente (TCustomizeGrid (http://neftali.clubdelphi.com/delphi_componentes.html)) que hay en mi página Web (http://neftali.clubdelphi.com/).
Te permite hacer lo que necesitas utilizando el DBGrid que ya tienes y sin escribir una línea de código.

Es un componentes aparte del DBGrid; Le asignas el Grid con el que trabaja, y el estilo de filas alternativas que quieres: asOxid, asDarkSky, asDesert,...

http://img84.imageshack.us/img84/4605/customizegridau2.png

En la imagen tienes algunos ejemplos; Además tienes alguna otra propiedad para mejorar el pintado del DBGrid, junto con eventos extra para facilitar el pintado de elementos diferentes en las filas.

Un saludo.

JoAnCa
08-08-2008, 13:29:17
Puedes consultar el truco 411 de Trucomania (cambiar el color de una fila) y tambien el 61, para las columnas
No obstante, te lo copio para adelantarte algo


En este otro, cambiaremos el color de una fila entera, es decir, de un registro entero (un registro o los que cumplan una determinada condición).

El asunto es conseguir que la comparacion de si se trata de un registro a mostrar de otro color, no se realice una vez por cada campo de cada
registro, sino una vez por registro, ganando así en velocidad.
Para ello, calcularemos el color con el que pintaremos el registro en una sóla de las columnas del DBGrid, usando este color calculado en el resto
de las columnas.
¿Para que sirve esto?, por ejemplo, imaginate una lista de clientes mostrada en un DBGrid... podriamos marcar en rojo aquellos clientes que nos
deban dinero...

Vamos con un ejemplo:

Usaremos la tabla Animals.DBF de las demos de Delphi:

-Pon una Tabla y asociala a la tabla Animals.DBF de las demos de Delphi
-Pon un Datasouce asociado a la tabla
-Pon un DBGrid (DBGrid1) asociado al DataSource
-Declara una variavle TColor en el private de la form:


private
{ Private declarations }
UnColor:TColor;



-Mete este código en el evento OnDrawColumnCell de DBGrid1:


procedure TForm1.DBGrid1DrawColumnCell(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 it is the first column, we calculate the color}
{UnColor should be declared as global to the form}
if DataCol=0 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;



Una mejora para que funciona aunque hagan scroll de las columnas:

procedure TForm1.DBGrid1DrawColumnCell(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 it is the first column, we calculate the color}
{UnColor should be declared as global to the 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;


Enviado por: Santy Concepción (SANTYCG@terra.es)

Te envío una mejora para el truco [411] de TrucoManía Mostrar de otro color una FILA de un DBGrid
Con los trucos anteriores, el formato y la alineación del texto de las celdas se perdía...
Pero con este método lo conservamos y el resultado es increíble.


procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
clPaleGreen = TColor($CCFFCC);
clPaleRed = TColor($CCCCFF);
begin
if Column.Field.Dataset.FieldbyName('CANTIDAD').AsInteger < 5
then
if (gdFocused in State)
then dbgrid1.canvas.brush.color := clBlack
else dbgrid1.canvas.brush.color := clPaleGreen;

//Esta línea es nueva

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



Así conservamos el formato y alineación del texto que había antes.

franciscoca
11-08-2008, 16:10:50
Fijate con esto un dbgrid y un query
no me lo acuerdo bien como lo hice pero era mas o menos asi...
Ej

If((Query1.recNo mod 2)=0)then DBgrid1.Canvas.Brush.color:= clSkyBlue;
{Fijate en las propiedades del query que no se si iba de una recNo o iba antes Field o otra cosa}

dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State)

franciscoca
11-08-2008, 19:19:42
Aca lo encontre....

procedure TFVisor.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var i:integer;
begin
if ((Column.Field.Dataset.FieldbyName('Prestado').AsBoolean)=True) then dbgrid1.canvas.Font.color := clRed;
if ((DataModule1.QVisor.RecNo mod 2)=0)then
begin
if (gdselected in State)then
begin
dbgrid1.canvas.brush.color := clActiveCaption;
end
else dbgrid1.canvas.brush.color := clSilver;
end;
dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);

Neftali [Germán.Estévez]
12-08-2008, 11:09:47
Francisco, utiliza TAG's (http://tinyurl.com/5nltsu) cuando añadas código a los mensajes.