PDA

Ver la Versión Completa : Hacer que una columna de un DbGrid aparezca distinta según valor


Aprendiendo
22-07-2003, 03:47:11
Hola a tod@s.

Necesito que en un DbGrid, si una columna de ese DbGrid, contiene el valor 0.00, entonces que no aparezca este valor sólo que se quede en blanco esa columna, no muestre nada.

Coloco el DefualtDrawing a False, e intento manejar el evento OnDrawColumCell consigo algunas cosas pero no lo que me propongo.

Desde ya muchas gracias, y feliz verano. Que calor esta haciendo este año.

:) :cool: :)

Ruben_Cu
22-07-2003, 06:18:15
Hola Aprendiendo, aquí tambien hace un fuerte calor. Aunque no veo del todo clara tu pregunta te paso un ejemplo que puede ser que te ayude, supon que tenemos un dbgrid con un campo en la columna nº 10 que se llama 'surtida' y es booleano, yo quiero que aquellos valores del campo que sean verdaderos se pinten de aqua y solo se lean los que son falsos, entonces hago lo siguiente:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with Sender as TDBGrid do begin
if (datacol=10) and table1.FieldByName('surtida').AsBoolean then
BEGIN
Canvas.Brush.Color := clAqua;
Canvas.FillRect(rect);
end else defaultdrawing:= true;
end;
end;

En tu caso sería adecuarlo a la condición de que el valor del campo sea igual a 0.00.
Espero te ayude el ejemplo y vete a la costa para que refresques del calor.
Saludos

Caminante
19-10-2011, 00:07:44
procedure TForm1.UnCampoGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
if sender.AsCurrency=0.0 then
text:=''
else
text:=sender.AsString;
end;


En el evento gettext del campo puedes decidir que valor mostrar.

Saludos

usuario1000
20-11-2018, 20:39:57
Mi problema es que no sé en que posición estará la columna, sólo sé el nombre de la columna, pero no su posición. Y esa posicion en el dbgrid puede variar a gusto del usuario.



¿como averigo esa posición en ese momento?


Saludos.

Casimiro Notevi
20-11-2018, 21:36:26
Con la propuesta anterior es indiferente la posición.
procedure TForm1.UnCampoGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
if sender.AsCurrency=0.0 then
text:=''
else
text:=sender.AsString;
end;

usuario1000
21-11-2018, 19:28:32
Muchas gracias Casimiro Notevi, al final lo he solucionado de esta forma:



procedure TFPrograma.DBGrid1DrawColumnCell(Sender: TObject;
const [Ref] Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if (column.Field.FieldName = 'datoCampo')then
begin
dbgrid1.Canvas.Font.Color := clblack;
dbgrid1.Canvas.Brush.Color := clWebGreenYellow;
dbgrid1.DefaultDrawColumnCell(rect,datacol, column, State);
end;
end;




De esta forma esté donde esté la columna lo hace perfecto.


Gracias.

usuario1000
21-11-2018, 19:32:33
Por cierto se me olvidaba, una cuestión más, en el DbGrid anterior lo que hago es colorear una celda, pero en vez de eso, podría poner en la celda un Gráfico sencillo, como un semaforo o un circulo rojo, verde, amarillo, el color que sea. Es decir dependiendo del dato que lea de la tabla, indico un gráfico en dicha celda. Algo parecido al punto verde que aparece en este foro al lado del nombre del usuario.


Gracias.....

Casimiro Notevi
21-11-2018, 19:40:53
También vale.

ecfisa
21-11-2018, 19:41:53
Hola.

Algunos ejemplos:

Mostrar imagen/foto en DBgrid (http://www.clubdelphi.com/foros/showthread.php?p=492555)
DBGrid con checks como ? (http://www.clubdelphi.com/foros/showthread.php?p=431735)


Saludos :)

usuario1000
21-11-2018, 19:49:30
Hola.

Algunos ejemplos:
Mostrar imagen/foto en DBgrid (http://www.clubdelphi.com/foros/showthread.php?p=492555)
DBGrid con checks como ? (http://www.clubdelphi.com/foros/showthread.php?p=431735)
Saludos :)




Muchas Gracias ecfisa. Muy util la información.

ElDioni
22-11-2018, 15:27:37
Hola, si lo que quieres es poner solo un semáforo píntalo igual que lo estabas haciendo, con el canvas.brush y el font.color, cambiándolo a cllime y clred, según lo que necesites.
Así no tienes que cargar una imagen e irá más rápido.



Saludos.

usuario1000
30-11-2018, 14:47:20
Hola, si lo que quieres es poner solo un semáforo píntalo igual que lo estabas haciendo, con el canvas.brush y el font.color, cambiándolo a cllime y clred, según lo que necesites.
Así no tienes que cargar una imagen e irá más rápido.



Saludos.


Gracias por la aportación.