0

Firemonkey Delphi XE3 プロジェクトで少し奇妙な問題が発生しました。OSX 10.8.3 でアプリをテストしました。

通常、マウス カーソルをテキスト上に移動すると、次のように表示されます。

ここに画像の説明を入力

しかし、アプリを呼び出して標準ダイアログ ボックスを開いた後、マウス カーソルをテキストの上に再度移動すると、次のようになります。

ここに画像の説明を入力

問題は Retina ディスプレイが原因であると思われます。友人が Retina 以外の Mac でテストしたため、問題ないように見えます。Macbook は Retina をサポートしており、この問題が発生しました。

これを修正するためのアイデアはありますか?

4

1 に答える 1

0

このような「バグ」は、実際には FM2 で行われた変更に関連しています (XE3/FM2 について言及していますが、質問は XE2/FMX としてタグ付けされています) が、FMX アプリケーションでも発生することがありました。解決策は、単にrepaint()ラベルの関数を呼び出すことです。簡単にするために仮定ShowMessageしますが、UI で何か (メッセージ ボックス、パネル、ベクター シェイプなど) を扱うときはいつでも同じことが当てはまります。

ShowMessage('My Message');
Label1.Repaint;

repaint() の使用は、適切な場合に利用する必要があります。これは (一般的に言えば) 負荷の高い操作であり、自由に使用する必要があります。一般的なガイドライン;

  • 必要な時だけ使う
  • 子コンポーネントを 1 つだけ再描画する必要がある場合は、そのコンポーネントのみを再描画します
  • 多くの子コンポーネントを再描画する必要がある場合は、代わりに親コンポーネントを再描画します
  • 再描画は、エフェクト自体ではなく、エフェクトの親コンポーネントで使用する必要があります (つまり、TLabelではなく でTGlowEffect) 。

私は実際に、アプリケーションのインターフェイス全体を TLayout または TRectangle 内に claNull の色で配置することにしました。このようにして、1 回の呼び出しでインターフェイス全体を再描画できます。次に、個々の主要な部分を子 TLayout (アラート バーなど) に分割し、アニメーション化する必要がある場合は、タイマーで再描画することを選択できます (たとえば、新しいメッセージがあるときにビューにスライドします)。

于 2013-09-05T11:53:40.653 に答える