Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como cambiar el color de una fila del Grid de ibobjects (https://www.clubdelphi.com/foros/showthread.php?t=36314)

kovaski 07-10-2006 22:03:28

Como cambiar el color de una fila del Grid de ibobjects
 
Hola.


Llevo dandole vueltas a este tema y no hay manera :D.

en grid normales tengo el siguiente codigo en OnDrawColumCell para cambiar el color de una fila entera:
Código Delphi [-]
       if Column.Field.Dataset.FieldbyName('ESTADO').AsString = 'Seguimiento' then
       if (gdFocused in State)
        then jvdbultimGrid1.canvas.brush.color := clBlack
        else jvdbultimGrid1.canvas.brush.color := $00D5FFFF;

y este para una sola celda en el mismo evento:

Código Delphi [-]
      if State=[] then
    with jvDBUltimGrid1 do 
     begin
      if Column.index=0 then
       begin
        if Column.Field.AsString= 'Activo' then
          Canvas.Brush.Color := $0084FF84;
        end;
   End;

En el ib_Grid del ibobjects tengo estos dos eventos OnDrawCell:
Código Delphi [-]
procedure IB_Grid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);

y OnDrawFocusedCell:
Código Delphi [-]
procedure TFichaOfertas.IB_Grid1DrawFocusedCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);

Estos eventos no tienen la propiedad colums de los demas grid y sé que la clave tiene que estar en "acol" y "aRow" pero por más que le doy vueltas no encuentro el codigo correcto que me pìnte la fila selecciona.

Os agradezco vuestra ayuda. Un saludo...

jacqueline 12-10-2006 14:39:02

hola coo te encuentras:)

Lonidas 12-10-2006 14:54:33

Puede ser algo como esto lo que quieres hacer
Es para pintar toda una fila..

Código Delphi [-]
procedure IB_Grid1DrawCell(Sender: TObject; ACol,  ARow: Integer; Rect: TRect; State: TGridDrawState);
If  Arow = 1  then         // colocas el numero de la fila que deseas pintar
  IB_Grid1. Canvas.Brush.Color := $0084FF84;

kovaski 12-10-2006 20:37:21

Cita:

Empezado por Lonidas
Puede ser algo como esto lo que quieres hacer
Es para pintar toda una fila..

Código Delphi [-]procedure IB_Grid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); If Arow = 1 then // colocas el numero de la fila que deseas pintar IB_Grid1. Canvas.Brush.Color := $0084FF84;

Gracias por tu respuesta.

He probado tu ejemplo y no me pinta la linea. Seguire probando ib_Grid a ver si tiene algo que ver con la propiedad "state".

Si alguien se le ocurre algo le agradezco su ayuda.

Un saludo.

fly 13-10-2006 05:07:47

¿Y si haces un TypeCast? (no se como se dice en cistiano ;) ) ; "engañas" al compilador para que crea que la tabla es de una DBGrid y así usas sus propiedades, claro está que sólo funcionará si son compatibles.

Sería algo así:
Código Delphi [-]
procedure IB_Grid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin 

if TDBGrid(Sender).DataSource.Dataset.FieldbyName('ESTADO').AsString = 'Seguimiento' then
 if (gdFocused in State)
    then TDBGrid(Sender).canvas.brush.color := clBlack
    else TDBGrid(Sender).canvas.brush.color := $00D5FFFF;
end;
yo lo uso para obtener el valor ROW de un DBGrid :
Código Delphi [-]
indice_grid:=TStringGrid(DBGrid1).Row;
No he podido probar el ejemplo que te pongo porque no tengo ibobjects ya me contaras si es lo que buscas.

Saludos y suerte.

kovaski 13-10-2006 13:36:46

Hola.

Te agradezco fly tu respuesta.

He probado tu sugerencia pero no son compatibles, de echo el ib_grid de ibobjecs me parece que no desciende del TDBGrid, y claro esta me da error en ejecución.

Lo cierto que estoy un poco frustrado(jeje). Porque necesito pintar las dichosas lineas ya que es una pieza clave en la claridad de mi programa. Y la razón por la que uso ib_grid de ibobjects es porque en aplicaciones cliente/servidor por internet me parece mucho más rapido y polivalente que los Grid normales, puesto que estan diseñados especificamente para estos entornos.

Seguire investigando(que remedio :-)).

Con todo os seguire agradeciendo vuestras sugerencias.

Saludos.

fly 13-10-2006 19:33:40

Aun no lo tengo del todo pero algo va haciendo...

Código Delphi [-]
procedure TCobros_f.IB_Grid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 IB_Grid1.Canvas.Brush.Color := $991122;
 IB_Grid1.Canvas.Font.Color := $CC55DD;
 valor:='aqui hay que encontrar el valor del campo a mostrar';
 IB_Grid1.DefaultDrawCell(acol,arow,rect,state,VALOR,taCenter);
end;

Esto funciona, y pinta la celda de un color y el texto de otro, pero necesita que al terminar de asignar los colores y demás se llame al procedimiento DefaultDrawCell para que pinte la celda con los valores asignados anteriormente al canvas.

No se como asignar a la variable VALOR el contenido del campo actual, así que por ahora este código solo sirve para pintar el grid de colores con un valor constante.... pero ya es algo ;)

Cuando tenga un rato sigo con el tema.

kovaski 14-10-2006 10:22:49

¡solución!
 
Al fin he dado con la solución al problema :D.

Aqui la pongo para quien le pueda servir. Gracias fly por tu tiempo e interes.

En primer lugar hay que poner la propiedad "DefDrawBefore" del ib_Grid en "True"(por defecto).

En el "uses" hay que poner "IB_Components".

Tenemos que atacar el evento "OnGetCellProps" del ib_Grid y escribimos lo siguiente:

Código Delphi [-]
procedure TFichaOfertas.IB_Grid1GetCellProps(Sender: TObject; ACol,
  ARow: Integer; AState: TGridDrawState; var AColor: TColor; AFont: TFont);
var
  Datos: string;
  Columnas: TIB_Column;
begin
//Este código es para pintar solo la celda del campo "ESTADO" que tiene la palabra "Activo"
if Tablas.dsOfertas.Active then
  begin
    with Tablas.dsOfertas.Dataset do
    begin
      BufferRowNum:= ib_Grid1.DataRow[ARow];
      if BufferRowNum > 0 then
       begin
        Columnas:= ib_Grid1.GridFields[ib_Grid1.DataCol[ACol]];
         if Assigned(Columnas) and (Columnas.FieldName = 'ESTADO') then
           begin
             Datos:= BufferFieldByName('ESTADO').AsString;
             if Datos = 'Activo' then
              if Acolor = ib_Grid1.Color then
                AColor:= clLime;
           end;
       end;
    end;
  end;
//Este código es para pintar la fila completa que tiene el campo "ESTADO" la palabra "Activo"
if Tablas.dsOfertas.Active then
  begin
    with Tablas.dsOfertas.Dataset do
    begin
      BufferRowNum:= ib_Grid1.DataRow[ARow];
      if BufferRowNum > 0 then
       begin
       Datos:= BufferFieldByName('ESTADO').AsString;
       if Datos = 'Activo' then
         if Acolor = ib_Grid1.Color then
          AColor:= clRed;
       end;
    end;
  end;

end;

Gracias por vuestra ayuda. Saludos :cool:.

fly 14-10-2006 16:36:06

Me alegro que se pudiera resolver, por mi parte seguiré "fedellando" con los ibobjets pues si que he notado demasiadas pegas en las aplicaciones cuando las corro a traves de internet.

saludos.


La franja horaria es GMT +2. Ahora son las 07:57:48.

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