Delphi XE2 TLabelのグローサイズにより、画面の左上隅にグラフィックの問題が発生する

アプリケーションをXEからXE2に移植して以来、私は奇妙なバグに気づき、ideのフォームを開くかアプリを実行するだけで、画面の左上隅に(フォームの外に)白い四角いボックスが描画されます。マウスや窓を上に乗せると遠ざかります。私はこれをTLabelに追跡し、単にフォームにドロップし、Glowsizeを0以上に設定すると問題が発生します。

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

example 1

example 2

enter image description here

10

2 答え

この問題は、 TCustomLabel.AdjustBounds で、画面のデバイスコンテキストとフラグDT_CALCRECTを使用して DoDrawText を呼び出して開始されます。したがって、そのデバイスコンテキストでペイントすると、画面にペイントされます。 DT_CALCRECT フラグはそれを防ぐべきですが、 Vcl.ThemesStyle.DoDrawText DrawThemeTextEx 呼び出しはDT_CALCRECT + LOptions.dwFlags DTT_CALCRECTを無視しているようです。必要な矩形のみを計算すべきデバイスコンテキスト上にペイントする。私はなぜ DrawThemeTextEx がそれを(まだ)行っているのか分かりませんが、それは出発点です。

UPDATE 1:
Delphi 2009 doesn't seem to be affected by this but also calls DrawThemeTextEx. The only difference I see is that all unused fields of the Options record are zero whereas in Delphi XE2 they contain garbage. Maybe DrawThemeTextEx needs them to be zero.

UPDATE 2:
The difference between Delphi 2009 and XE2 is that in Delphi 2009 not only DTT_CALCRECT is specified but also DTT_COMPOSITE.

Delphi 2009では、DTT_COMPOSITEは常に設定されています:

Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED or DTT_GLOWSIZE;

XE2ではフラグがガラス上にペイントされている場合にのみフラグが設定されます。

  if csGlassPaint in ControlState then
    Include(LFormat, tfComposited);
13
追加された
追加された 著者 hikari,

この問題は、ラベルのAutoSizeを無効にすると消えるようです。

なぜ私は深く調査しませんでしたが、そのバグが修正されるまでの回避策としてはうまくいきます。

2
追加された
これはAndreas Hausladenの答えと相関があるようです。彼は問題は DT_CALCRECT DrawThemeTextEx を呼び出すことと関係していると言います。ラベルのサイズを計算する必要があるときにのみ行われると思います。ラベルの AutoSize True の場合です。 AutoSize を有効にすると、 DT_CALCRECT の呼び出しは実行されず、その結果バグは生成されません。
追加された 著者 Andriy M,
うん、それは動作します。フォームを作成した後、キャプションを変更する前に自動サイズを設定することも、この問題を回避するようです(後で再出現する可能性があります)。最新のupdate4では固定されていません。
追加された 著者 hikari,