TDateTimePicker VCL样式XE2中的故障只发生在Windows经典主题上

时间:2012-06-27 15:16:12

标签: delphi delphi-xe2 vcl-styles

我想这也是为什么VCL样式还没有准备好真正使用的另一个原因。

没有VCL样式,TDateTimePicker控件看起来很好。打开任何vcl样式,我就会看到这个样子:

enter image description here

我可以通过注册一个样式钩子来关闭这个组件类型的vcl样式,但这看起来很难看。

这是在安装了更新4的Delphi XE2上。

理想情况下,我希望有一个解决方法,或日期时间选择器的某些属性,或者datetimepicker的某个子类,我可以强制日期时间选择器正确绘制和主题。

请注意,正常的组合框是正确的主题。请注意,这可以在可以想象的最小样本项目中轻松再现。是。这是另一种风格的错误。

更新它可能是特定于平台的,与没有Aero的Windows Server 2008 R2上的Windows公共控件版本相关(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 Entry 106783

2 个答案:

答案 0 :(得分:13)

好的,我只对Vcl.Styles.DateTimePickers单位进行了一些小改动,该单位是vcl-styles-utils的一部分。解决“Windows经典”主题处于活动状态时的此问题。

以这种方式使用此样式挂钩

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

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

这将是结果。

enter image description here

答案 1 :(得分: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 Server 2008R2或Windows 7上还有其它什么时,我会回来更新这个问题,当你选择“Windows经典主题”时会发生这种情况在Win7上,也是。