PDA

Ver la Versión Completa : Pintar linea de TTreeView de 2 colores


Neftali [Germán.Estévez]
19-06-2012, 17:35:07
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:

http://img585.imageshack.us/img585/3122/imagen1202.png

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.


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/9537433/simple-tlistview-ownerdraw-text-font-size-and-color-example/9537896#9537896

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

// 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
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í...

http://neftali.clubdelphi.com/images/frustracion_g.gif

Mira que le he dado vueltas...

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

http://img716.imageshack.us/img716/3493/imagen1222.png

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 :)