2011-12-18 11 views
10

Da quando ho eseguito il porting di un'app da XE a XE2 ho notato uno strano bug, basta aprire il form nell'ide o eseguire l'app, viene disegnato un riquadro quadrato bianco nell'angolo in alto a sinistra dello schermo (fuori dal modulo), che scompare al passaggio del mouse o di una finestra. L'ho rintracciato fino a TLabel, semplicemente lasciandone uno sul modulo e impostando Glowsize sopra lo zero.Delphi XE2 TLabel provoca problemi grafici nell'angolo in alto a sinistra dello schermo

Ho reinstallato e aggiornato all'ultimo aggiornamento XE2 e il problema si verifica ancora. Qualcuno ha idea di cosa sta succedendo?

example 1

example 2

enter image description here

risposta

13

Il problema inizia in TCustomLabel.AdjustBounds con una chiamata a DoDrawText con contesto di periferica dello schermo e il DT_CALCRECT bandiera. Quindi, se qualcosa dipinge sul contesto di quel dispositivo, sarà dipinto sullo schermo. Il flag DT_CALCRECT dovrebbe impedire che ma la chiamata DrawThemeTextEx in Vcl.Themes.TUxThemeStyle.DoDrawText sembra ignorare DT_CALCRECT + LOptions.dwFlags DTT_CALCRECT e dipinge nel contesto del dispositivo in cui dovrebbe solo calcolare il rettangolo richiesto. Non so perché DrawThemeTextEx lo faccia (ancora), ma è un punto di partenza.

UPDATE 1:
Delphi 2009 non sembra essere influenzata da questo, ma richiede anche DrawThemeTextEx. L'unica differenza che vedo è che tutti i campi inutilizzati del record di Opzioni sono zero mentre in Delphi XE2 contengono spazzatura. Forse DrawThemeTextEx richiede che siano zero.

UPDATE 2:
La differenza tra Delphi 2009 e XE2 è che in Delphi 2009 non solo DTT_CALCRECT è specificato, ma anche DTT_COMPOSITE.

In Delphi 2009 il DTT_COMPOSITE è sempre impostato:

Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED or DTT_GLOWSIZE; 

mentre nel XE2 il flag è impostato solo se l'etichetta è dipinto su vetro:

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

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

2

Il problema sembra scomparire se si disabilitare AutoSize sull'etichetta.

Non ho indagato più a fondo perché, ma come soluzione finché non viene corretto questo errore, tutto funziona correttamente.

+1

Questo sembra essere correlato alla risposta di Andreas Hausladen. Dice che il problema ha a che fare con la chiamata di 'DrawThemeTextEx' con' DT_CALCRECT'. Immagino che ciò venga fatto solo quando è necessario calcolare la dimensione dell'etichetta = quando l'opzione AutoSize dell'etichetta è 'True'. Se si disattiva 'AutoSize', non viene eseguita alcuna chiamata con' DT_CALCRECT' e, di conseguenza, il bug non viene prodotto. –

+1

Sì che funziona; l'impostazione di autosize in seguito dopo la creazione del modulo e prima di modificare la didascalia sembra anche evitare il problema (probabilmente riapparendo in seguito). Rimane non fissato nell'ultimo aggiornamento4. – hikari

Problemi correlati