我想这也是为什么VCL样式还没有准备好真正使用的另一个原因。
没有VCL样式,TDateTimePicker控件看起来很好。打开任何vcl样式,我就会看到这个样子:
我可以通过注册一个样式钩子来关闭这个组件类型的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
答案 0 :(得分:13)
好的,我只对Vcl.Styles.DateTimePickers单位进行了一些小改动,该单位是vcl-styles-utils的一部分。解决“Windows经典”主题处于活动状态时的此问题。
以这种方式使用此样式挂钩
uses
Vcl.Styles,
Vcl.Themes,
Vcl.Styles.DateTimePickers;
initialization
TStyleManager.Engine.RegisterStyleHook(TDateTimePicker, TDateTimePickerStyleHookFix);
这将是结果。
答案 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上,也是。