Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Pintar linea de TTreeView de 2 colores (https://www.clubdelphi.com/foros/showthread.php?t=79254)

Neftali [Germán.Estévez] 19-06-2012 17:35:07

Pintar linea de TTreeView de 2 colores
 
Buenas a todos.
Tengo un problemilla y estoy atascado. No se si es que me he obcecado, pero el caso es que algo que parece simple no me acaba de funcionar... :-(

La idea es poder pintar una línea de un TreeView (el texto de un nodo) en 2 colores diferentes.
Una imagen que refleja más o menos lo que necesito es esta:



Se que con componentes más avanzados que el estándard (tipo VirtualTreeView de Softgems) se podrá hacer, pero me resisto a utilizarlo para algo que parece tan simple.

Utilizo en evento OnDrawCustomcell del TTreeView, pero no consigo cambiar el color.

Código Delphi [-]
  tv := TTreeview(Sender);

  DefaultDraw := False;

  // Calculo un par de zonas
  Rect1 := Node.DisplayRect(False);
  Rect2 := Node.DisplayRect(False);
  Rect1.Right := Rect1.Right div 2;
  Rect2.Left := Rect1.Right;

  // pinto el texto
  tv.Canvas.Font.Color := clBlack;
  tv.Canvas.Font.Style := tv.Canvas.Font.Style + [fsBold];
  tv.Canvas.TextRect(Rect1, Rect1.Left, Rect1.Top, Node.Text);

  // Cambio color y estilo  ¡¡¡ESTO NO FUNCIONA
  tv.Canvas.Font.Style := tv.Canvas.Font.Style - [fsBold];
  tv.Canvas.Font.Color := clRed;
  tv.Canvas.TextRect(Rect2, Rect2.Left, Rect2.Top, 'Texto rojo');

El segundo texto que debería salir en rojo y sin negrita sigue saliendo igual que el otro.
¿Alguna sugerencia? Estoy espeso hoy y me debo estar dejando algo... :(

Chris 19-06-2012 18:16:37

No es la primera vez, ni eres el primero en tener este problema. Un miembro de StackOverflow tuvo el mismo.

Te daré la misma solución que dí en stackoverflow en ese momento. http://stackoverflow.com/questions/9...537896#9537896

Utiliza Canvas.Refresh luego de cambiar las propiedades de la fuente.

Código Delphi [-]
 // pinto el texto
  tv.Canvas.Font.Color := clBlack;
  tv.Canvas.Font.Style := tv.Canvas.Font.Style + [fsBold];
  tv.Canvas.TextRect(Rect1, Rect1.Left, Rect1.Top, Node.Text);

  // Cambio color y estilo  ¡¡¡ESTO NO FUNCIONA
  tv.Canvas.Font.Style := tv.Canvas.Font.Style - [fsBold];
  tv.Canvas.Font.Color := clRed;
  tv.Canvas.Refresh;  // <-- he aquí lo necesario.
  tv.Canvas.TextRect(Rect2, Rect2.Left, Rect2.Top, 'Texto rojo');

Esto lo aprendí "the hard way" cuando estaba desarrollando Biolab.

Saludos!

roman 19-06-2012 18:21:43

¡Vaya! Pues ¡qué cosa más rara! Estuve a punto de probar el Refresh pero pensé que eso iba a causar un stack overflow al rellamar al método de pintado. Irónicamente, la respuesta la pusiste en StackOverflow :D

// Saludos

Chris 19-06-2012 18:34:59

jaja así es román. A simple vista pareciera que al llamar a "refresh" entrarías en un ciclo interminable. Pero en realidad si tienes en cuenta la estructura de la VCL, sabrás que no es así. El dibujado del lienzo es controlado e instruido por el padre. No es lo mismo llamar "Form1.Refresh" dentro del evento OnPaint del formulario, a llamar "Form1.Label1.Refresh" en el mismo evento. En el primero sí entrarías en un bucle infinito. En el segundo caso, no.

Neftali [Germán.Estévez] 19-06-2012 18:47:11

Cita:

Empezado por Chris (Mensaje 435523)
No es la primera vez, ni eres el primero en tener este problema. Un miembro de StackOverflow tuvo el mismo.
...
Utiliza Canvas.Refresh luego de cambiar las propiedades de la fuente.

¡¡Grande Chris!!

En estos momentos estaba así...



Mira que le he dado vueltas...

Con ese simple cambio la cosa tiene mejor pinta...



Muchas gracias.

Casimiro Notevi 19-06-2012 21:52:34

Veo que hay buenos programadores por aquí, lo mismo me hago asiduo a estos foros :)


La franja horaria es GMT +2. Ahora son las 02:27:47.

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