Ir al contenido


Foto

[RESUELTO] DBGrid OnDrawColumnCell Dibujar Texto Personalizado


  • Por favor identifícate para responder
4 respuestas en este tema

#1 romfrost13

romfrost13

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 09 marzo 2010 - 12:44

Hola a todos.

Tengo un problema cuando intento dibujar el texto de una celda en el evento OnDrawColumnCell de un dbgrid, para esto estoy usando este codigo:



delphi
  1. procedure TfrmrContactos.dbgrdListDrawColumnCell(Sender: TObject;
  2.   const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
  3. begin
  4.   // para dibujar la palabra medico o proveedor segun sea el caso en el dbgrid
  5.   if Column.Index = 1 then
  6.     begin
  7.       if not Column.Field.IsNull then // esto es porque da error cuando el grid esta vacio
  8.         begin
  9.           case Column.Field.AsInteger  of
  10.             1: TDBGrid(Sender).Canvas.TextOut(rect.Left+2, Rect.Top+2, 'Medico');
  11.             2: TDBGrid(Sender).Canvas.TextOut(rect.Left+2, Rect.Top+2, 'Proveedor');
  12.           end;
  13.         end;
  14.     end;
  15. end;



Solo uso esos dos posibles valores:



delphi
  1. 1 para medico
  2. 2 para proveedor



El asunto es que con eso ademas de la palabra proveedor o medico mete tambien el valor del campo que trae de la base de datos, quedando:



delphi
  1. Medico    1
  2. Proveedor 2



Me gustaria que ese 1 o 2 no saliera pero no encuentro donde meterle algo para evitar que salga.

¿Alguno de ustedes tiene una idea de como hacerlo para que muestre lo que necesito?
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 marzo 2010 - 01:09

Hola

Y porque mejor no utilizas un campo calculado y te quitas de problemas. Por ejemplo, yo haría algo como esto para que me mostrara un TITULO en lugar de un NUMERO



delphi
  1. procedure TForm1.Table1CalcFields(DataSet: TDataSet);
  2. begin
  3.   if Table1Prefijo.Value = '' then
  4.     Table1Calculado.Value := 'LOCAL'
  5.   else
  6.   if Table1Prefijo.Value = '01' then
  7.     Table1Calculado.Value := 'NACIONAL'
  8.   else
  9.   if Table1Prefijo.Value = '001' then
  10.     Table1Calculado.Value := 'USA/CANADA'
  11.   else
  12.   if Table1Prefijo.Value = '00' then
  13.     Table1Calculado.Value := 'MUNDIAL'
  14. end;



Te adjunto una imagen con el resultado de este proceso.

En tu caso yo haría algo como esto..




delphi
  1. procedure TForm1.Table1CalcFields(DataSet: TDataSet);
  2. begin
  3.   case TablaCAMPO.AsInteger of
  4.     1: TablaCampoCalculado.Value := 'MEDICO';
  5.     2: TablaCampoCalculado.Value := 'PROVEEDOR';
  6.     else TablaCampoCalculado.Value := 'OTRO';
  7.   end;
  8. end;



Espero te sirva.

Salud OS

Archivos adjuntos


  • 0

#3 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 09 marzo 2010 - 02:40

Hola,

Referente a la pregunta que planteas, ese 1 y ese 2 que te aparecen es lo que dibuja por defecto el DBGrid para dicho campo, cuando interceptas el evento OnDrawColumnCell debes encargarte de limpiarlo antes de escribir algo, mediante un FillRect, por ejemplo:



delphi
  1. with TDBGrid(Sender).Canvas do
  2. begin
  3.   Brush.Color := TDBGrid(Sender).Color;
  4.   FillRect(Rect);
  5.   ... // aquí lo que ya tienes
  6. end;



Respecto a la solución, lo que te indica egostar me parece lo más apropiado, además ese campo calculado lo puedes mostrar en otros controles, si te hiciera falta, sin tener que volver a repintar nada.

Un saludo
  • 0

#4 romfrost13

romfrost13

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 10 marzo 2010 - 12:17

Gracias por las respuestas, no pude entrar antes...

Egostar mas o menos asi fue como resolvi el problema, pero yo me fui mas alla, como estoy usando firebird aproveche una caracteristica del motor



sql
  1. SELECT
  2.   con_id,
  3.   con_nombre,
  4.   CASE con_tipo
  5.     WHEN 1 THEN 'Medicos'
  6.     WHEN 2 THEN 'Proveedores'
  7.   END
  8. FROM contactos



tambien se me ocurrio con campos calculados pero nunca me a gustado la cantidad de veces que se dispara el evento para calcularlos

andres1569 tu respuesta funciona perfecto estaba tan abrumado ayer que nunca pense en la posibilidad de limpiar el canvas antes de pintar si se me hubiese ocurrido busco como hacerlo y quizas no posteo esto.

Gracias a ambos por las respuestas

Conclusion:
Los 3 metodos aqui expuestos solucionan el problema para mostrar texto personalizado en el Dbgrid pero solo el de andres1569 sirve para dibujarlo en el canvas y responde a la pregunta que inicia este hilo.

  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 marzo 2010 - 12:21

Hola romfrost13

Me alegra que hayas resuelto tu problema, vamos a asignar este hilo como [RESUELTO].

Salud OS

Edito: Me ganaste, ya lo asignaste como Hilo Resuelto :) (y)
  • 0




IP.Board spam blocked by CleanTalk.