2011-12-18 21 views
10

Desde que porté una aplicación de XE a XE2 noté un error extraño, simplemente abriendo el formulario en el ide o ejecutando la aplicación, se dibuja un cuadro cuadrado blanco en la esquina superior izquierda de la pantalla (fuera del formulario), que desaparece al pasar el mouse o una ventana encima. Seguí esto hasta TLabel, simplemente soltando uno en el formulario y estableciendo Glowsize por encima de 0 causa el problema.Delphi XE2 TLabel glowsize causa problema gráfico en la esquina superior izquierda de la pantalla

He reinstalado y actualizado a la última actualización de XE23 y el problema persiste. Alguien tiene una pista de lo que está pasando?

example 1

example 2

enter image description here

Respuesta

13

El problema comienza en TCustomLabel.AdjustBounds con una llamada a DoDrawText con el contexto de dispositivo de la pantalla y el DT_CALCRECT bandera. Entonces, si algo pinta en el contexto de ese dispositivo, se pintará en la pantalla. El indicador DT_CALCRECT debería evitar eso, pero la llamada DrawThemeTextEx en Vcl.Themes.TUxThemeStyle.DoDrawText parece ignorar el DT_CALCRECT + LOptions.dwFlags DTT_CALCRECT y se pinta en el contexto del dispositivo donde solo debería calcular el rectángulo requerido. No sé por qué DrawThemeTextEx hace eso (todavía), pero es un punto de partida. no parece
Delphi 2009 a ser afectados por esto, pero también llama DrawThemeTextEx:

ACTUALIZA 1. La única diferencia que veo es que todos los campos no utilizados del registro de Opciones son cero, mientras que en Delphi XE2 contienen basura. Quizás DrawThemeTextEx necesita que sean cero.

ACTUALIZACIÓN 2:
La diferencia entre 2009 y Delphi XE2 es que en Delphi 2009 no sólo se especifica DTT_CALCRECT sino también DTT_COMPOSITE.

En Delphi 2009, el DTT_COMPOSITE siempre se establece:

Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED or DTT_GLOWSIZE; 

mientras que en XE2 la bandera sólo se establece si la etiqueta está pintado sobre vidrio:

if csGlassPaint in ControlState then 
    Include(LFormat, tfComposited); 
+0

publicado en QC http://qc.embarcadero.com/wc/qcmain.aspx?d=102146 – hikari

2

El problema parece desaparecer si deshabilita AutoSize en la etiqueta.

No investigé más a fondo por qué, pero como solución alternativa hasta que se solucione ese error, funciona bien.

+1

Esto parece correlacionarse con la respuesta de Andreas Hausladen. Él dice que el problema tiene que ver con llamar 'DrawThemeTextEx' con' DT_CALCRECT'. Imagino que solo se hace cuando existe la necesidad de calcular el tamaño de la etiqueta = cuando 'AutoSize' es' True'. Si cambia de 'AutoSize', no se realiza ninguna llamada con' DT_CALCRECT' y, en consecuencia, no se produce el error. –

+1

Sí, eso funciona; configurar el autoesquelado más tarde después de la creación del formulario y antes de cambiar el título también parece evitar el problema (posiblemente vuelva a aparecer más adelante). Permanece sin fijar en la última actualización4. – hikari

Cuestiones relacionadas