Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   DBGRID DELPHI CAMBIAR COLOR CON UN FDQwery (https://www.clubdelphi.com/foros/showthread.php?t=95274)

kainchu3102 07-07-2021 04:50:36

DBGRID DELPHI CAMBIAR COLOR CON UN FDQwery
 
Hola,buenas gente, queria hacerle una consulta sobre el DBGRID en Delphi
Mi consulta es la siguiente como puedo hacer para que cambien de color las Filas pero segun la consulta que haga con un FDQUERY
Osea con el Drawn Column Perfecto pero cuando voy a hacer una consulta con el FDQUERY las Coloreada vuelve a los colores normales
Código Delphi [-]
procedure TFORMRESULTADOS.DBGRESULTADOSDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DataModule1.FDTRESULTADOS.FieldByName('int_res').AsString <> ''  then
  begin
  DBGRESULTADOS.Canvas.Brush.Color := clMoneyGreen;
   DBGRESULTADOS.Canvas.Font.Color := clWhite;
    DBGRESULTADOS.DefaultDrawColumnCell(Rect, DataCol, Column, State);



Ese el codigo pero veo que estoy utilizando un FDTABLE pero como podria cambiar para que sea un QUERY POR EJEMPLO:
Código Delphi [-]
if DataModule1.FDQBUSQUEDA.FieldByName('int_res').AsString <> ''  then

PERO ME SALE EL ERROR FDTRESULTADOS: field 'int_res' not found

Neftali [Germán.Estévez] 07-07-2021 09:47:24

Por favor, utiliza los TAGs adecuados cuando añadas código a los mensajes.
He modificado tu mensaje para añadirlos.

Neftali [Germán.Estévez] 07-07-2021 10:06:01

Entiendo que el problema es que, aunque FDTRESULTADOS y FDQBUSQUEDA tienen ambos el campo int_res, no puedes hacer referencia directamente a ellos en el evento.

En ese caso, puedes acceder al Dataset (sea FDTRESULTADOS o FDQBUSQUEDA) utilizando el Sender en tiempo de ejecución.
Prueba con un código como este:

Código Delphi [-]
var
  ds:TDataset;
begin
  ds := nil;
  // el sender debería ser un TDBGrid (pero lo comprobamos...)
  if (Sender is TDBGrid) then
    ds := TDBGrid(Sender).DataSource.DataSet;
  // Aquí, ds será FDTRESULTADOS o FDQBUSQUEDA

  // Si no está asignado, salimos...
  if not Assigned(ds) then
    Exit;
  // comprobamos el campo...
  if (ds.FieldByName('int_res').AsString <> '')  then begin
    DBGrid1.Canvas.Brush.Color := clMoneyGreen;
    DBGrid1.Canvas.Font.Color := clWhite;
    DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;

Te lo pongo de memoria, si te falla algo dímelo...

kainchu3102 07-07-2021 17:38:35

Hola German
 
ME APARECE ESTE ERROR

Undeclared identifier: 'TDataset'

ecfisa 08-07-2021 01:42:04

Hola.
Cita:

Empezado por kainchu3102 (Mensaje 541644)
ME APARECE ESTE ERROR

Undeclared identifier: 'TDataset'

Agrega DB a uses:
Código Delphi [-]
uses ..., DB;


Saludos :)

Neftali [Germán.Estévez] 08-07-2021 09:39:04

Cita:

Empezado por ecfisa (Mensaje 541650)
Agrega DB a uses:
Código Delphi [-]
uses ..., DB;


O creo recordar, segun la versión:

Código Delphi [-]
uses
   ..., Data.DB;

kainchu3102 15-07-2021 08:46:06

Excelente
 
Te agradezco mucho me sirvio de mucho tu ayuda, pero tengo una duda se cambiar de color con la condicion, mi duda es: Como puedo hacer para que vuelva a la normalidad haciendo un click en la fila. y cuando le haga click a otra fila vuelva a ponerse de color. se entendio?

ecfisa 15-07-2021 15:08:00

Hola.

Podes agregar una columna a tu tabla que sirva para saber si la fila debe ser pintada o no.

Un ejemplo muy simplificado:
Código Delphi [-]
...
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DS : TDataSet;
begin
  DS := DBGrid1.DataSource.DataSet;
  if  DS.FieldByName( 'BOOL' ).AsInteger = 1  then
    DBGrid1.Canvas.Brush.Color := clRed; // color de tu gusto
  DBGrid1.DefaultDrawColumnCell(Rect, Datacol, Column, State);
end;

procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
  DS : TDataSet;
begin
  DS := DBGrid1.DataSource.DataSet;
  DS.Edit;
  if DS.FieldByName( 'BOOL' ).AsInteger = 1  then
    DS.FieldByName( 'BOOL' ).AsInteger := 0
  else
    DS.FieldByName( 'BOOL' ).AsInteger := 1;
end;

...
En este caso al campo agregado lo denominé BOOL y usé el evento OnDblClick.

Salida del ejemplo:


Saludos :)


La franja horaria es GMT +2. Ahora son las 23:21:38.

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