2011-12-18 2 views
10

XEからXE2にアプリケーションを移植して以来、ideのフォームを開いたり、アプリを実行したりすると、奇妙なバグに気づいた画面の左上隅(フォームの外)にマウスまたはウィンドウをホバリングすると消えます。私はこれをTLabelに追跡し、単にフォームにドロップし、Glowsizeを0以上に設定すると問題が発生します。Delphi XE2 TLabel glowsizeによって画面の左上にグラフィックの問題が発生する

最後のXE2 update3に再インストールして更新しましたが、引き続き問題が発生します。誰でも何が起こっているのかを知っていますか?

example 1

example 2

enter image description here

答えて

13

問題は、画面のデバイスコンテキストとフラグDT_CALCRECTとDoDrawTextの呼び出しでTCustomLabel.AdjustBoundsで始まります。したがって、そのデバイスコンテキストでペイントすると、画面にペイントされます。 DT_CALCRECTフラグはそれを防ぐべきですが、Vcl.Themes.TUxThemeStyle.DoDrawTextDrawThemeTextExコールは、DT_CALCRECT + LOptions.dwFlags DTT_CALCRECTを無視して、必要な四角形のみを計算するデバイスコンテキストにペイントするように見えます。私はなぜそれが(まだ)DrawThemeTextExを行うのか分からないが、それは出発点である。

UPDATE 1:
Delphi 2009には、この影響を受けているように見えるだけでなく、DrawThemeTextExを呼び出していません。私が見る唯一の違いは、Optionsレコードの未使用のフィールドはすべてゼロであるのに対して、Delphi XE2では使用できないフィールドはゼロであるということです。おそらく、DrawThemeTextExはそれらをゼロにする必要があります。

UPDATE 2:
のDelphi 2009とXE2は、Delphi 2009年にDTT_CALCRECTはなく、DTT_COMPOSITE指定されていないだけということであるとの違い。

DTT_COMPOSITEが常に設定されているのDelphi 2009年に

:ラベルはガラスに描かれている場合XE2にフラグのみが設定されているのに対し、

Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED or DTT_GLOWSIZE; 

は:

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

QCに投稿http://qc.embarcadero.com/wc/qcmain.aspx?d=102146 – hikari

2

問題があなたの場合は消えているようですラベルのAutoSizeを無効にします。

私は深い理由を調査しませんでしたが、そのバグが修正されるまでの回避策としては問題ありません。

+1

これはAndreas Hausladenの答えと相関があるようです。彼は問題は 'DT_CALCRECT'で' DrawThemeTextEx'を呼び出すことと関係していると言います。私はラベルのサイズを計算する必要があるときにのみ行われると想像しています=ラベルの 'AutoSize'が' True'です。 'AutoSize'をオンにすると、' DT_CALCRECT'の呼び出しが実行されないため、バグは生成されません。 –

+1

それはうまくいく。フォームを作成した後、キャプションを変更する前に自動サイズを設定することも、この問題を回避するようです(後で再出現する可能性があります)。最新のupdate4では固定されていません。 – hikari

関連する問題