9

これが、VCL スタイルが実際に使用される準備ができていないもう 1 つの理由だと思います。

TDateTimePicker コントロールは、VCL スタイルがなくても問題なく表示されます。任意の vcl スタイルを有効にすると、次のようになります。

ここに画像の説明を入力

スタイル フックを登録することで、このコンポーネント タイプだけの vcl スタイルをオフにすることができますが、それは非常に見苦しく見えます。

これは、アップデート 4 がインストールされた Delphi XE2 上にあります。

理想的には、回避策、日時ピッカーのいくつかのプロパティ、または日時ピッカーに正しくペイントしてテーマを強制するために実行できる日時ピッカーのサブクラスがあることを願っています。

通常のコンボボックスのテーマが正しく設定されていることに注意してください。これは、想像できる最小限のサンプル プロジェクトで簡単に再現できることに注意してください。はい。それはYet Another Stylesのバグです。

更新Aero を使用しない Windows Server 2008 R2 上の Windows Common Controls バージョン (Windows サーバー コンポーネント用語では「デスクトップ エクスペリエンス」) に関連する、プラットフォーム固有の可能性があります。他の人が再現できなかったので、いくつかの異なる Windows マシンでこれを試してみることにしました。それを行った後、問題が Windows Server 2008 R2 でのみ再現されることがわかりました。一部のお客様は、Windows Server 2008 R2 を使用しています。ご存じのとおり、VCL スタイルを使用する主な理由は、Windows のテーマに関係なくアプリの外観を同じにするためです。ただし、上記の場合、テーマが正しく設定されていない DateTimePicker コントロールを除き、Windows Server 2008 R2 でのみ、アプリ全体が適切にテーマ設定されます。同じ XE2 ベースのデモ アプリが Windows 7 で正常に動作します。

動作しているシステムと動作していないシステムの両方で、SysWow64 フォルダーに ComCtl32.dll があり、バージョンは 5.82.7601.17514 です。ただし、VCL テーマがオフの場合、これらのコントロールのネイティブ レイアウトと外観は明らかに異なり、これがスキニング コードに影響し、失敗します。

Update2 : バグとして報告: QC エントリ 106783

4

2 に答える 2

13

わかりました。vcl-styles-utilsの一部であるVcl.Styles.DateTimePickersユニットに小さな変更を加えました 。「Windowsクラシック」テーマがアクティブなときにこの問題を修正するには。

このスタイルのフックをこのように使用します

uses
  Vcl.Styles,
  Vcl.Themes,
  Vcl.Styles.DateTimePickers;

initialization
 TStyleManager.Engine.RegisterStyleHook(TDateTimePicker, TDateTimePickerStyleHookFix);

そして、これが結果になります。

ここに画像の説明を入力してください

于 2012-06-27T20:05:50.877 に答える
1

デスクトップエクスペリエンスをインストールし、テーマを有効にしてテーマサービスを開始すると、この不具合が解消されることを確認できます。

さて、これが今のところ私の回避策のコードです:

function DetectWin7Or2008R2ClassicTheme:Boolean;
begin

   if  ( Win32MajorVersion>=6 ) then
      result := (not Themes.ThemeServices.ThemesEnabled) // and IsServerOs
   else
      result := false;


end;


// main form initialization section:


initialization
 if DetectWin7Or2008R2ClassicTheme then
 TStyleManager.Engine.RegisterStyleHook(TDateTimePicker, TStyleHook); {no theme!}
end.

それは明らかにワイルドなコーナーケースです。もっと見つけることを期待しています。テーマサービスが実行されていないときに、Windows Server2008R2またはWindows7で他に何が壊れているかを見つけたら、この質問に戻って更新します。これは、「Windowsクラシックテーマ」を選択したときに発生します。 Win7でも。

于 2012-06-27T19:31:33.470 に答える