Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pintar filas TDBGrid (https://www.clubdelphi.com/foros/showthread.php?t=58972)

ManuelPerez 07-08-2008 20:54:12

Pintar filas TDBGrid
 
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..
 
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

Código Delphi [-]
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


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 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) que hay en mi página Web.
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,...



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

cambiar el color de una fila del dbgrid
 
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:


Código Delphi [-]
  private
    { Private declarations }
    UnColor:TColor;


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


Código Delphi [-]
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:

Código Delphi [-]
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.


Código Delphi [-]
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

pintar las filas pares de un color
 
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 cuando añadas código a los mensajes.


La franja horaria es GMT +2. Ahora son las 19:44:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi