2012-06-27 16 views
9

Supongo que esta es una razón más por la que los estilos de VCL no están listos para ser realmente utilizados.TDateTimePicker Estilos de VCL en XE2 que solo ocurre en el tema clásico de Windows

El control TDateTimePicker se ve bien sin los estilos VCL. Enciendo cualquier estilo VCL, y me da esta apariencia:

enter image description here

que puede desactivar los estilos de VCL sólo para este tipo de componente, mediante el registro de un gancho de estilo, pero que se ve muy feo.

Esto está en Delphi XE2 con la actualización 4 instalada.

Idealmente, espero que haya una solución, o algunas propiedades del selector de fecha/hora, o alguna subclase de datetimepicker que podría hacer para forzar al selector de fecha y hora a pintar y tema correctamente.

Tenga en cuenta que los cuadros combinados normales se están editando correctamente. Tenga en cuenta que esto se reproduce fácilmente en el proyecto de muestra más mínimo imaginable. Sí. Es otro error de Styles.

Actualización Puede ser específico de la plataforma, relacionado con las versiones de Windows Common Controls en Windows Server 2008 R2 sin Aero ("Experiencia de escritorio" en términos de componentes de servidor de Windows). Se me acaba de ocurrir después de que otras personas no puedan reproducirlo, para probar esto en varias máquinas Windows diferentes. Después de hacerlo, me parece que el problema solo se reproduce en Windows Server 2008 R2. Algunos de nuestros clientes usan Windows Server 2008 R2. Como sabe, una de las principales razones para usar VCL Styles es que hace que su aplicación se vea igual independientemente del tema de Windows. Sin embargo, en el caso anterior, todos los temas de la aplicación son correctos, excepto el control DateTimePicker, que tiene un tema incorrecto y solo en Windows Server 2008 R2. La misma aplicación de demostración basada en XE2 funciona bien en Windows 7.

Tanto los sistemas que funcionan como los que no funcionan tienen un ComCtl32.dll en la carpeta SysWow64 con la versión 5.82.7601.17514. Sin embargo, es evidente que el diseño y la apariencia nativos de estos controles es diferente, cuando los temas VCL están desactivados, y esto afecta el código de skinning, que falla.

Update2: Reportado como un error: QC Entry 106783

+0

Hace algún tiempo, he tratado de usar estilos VCL pero se encontró con algunos problemas inesperados que no se sienten como si fueran "mío" - y no parecían estar en el código Estilos VCL sí. Por supuesto, ¿qué programador cree que su propio código está causando el problema? :-) Nuestra necesidad de estilos no era urgente, y al ser presionados por el tiempo, abandoné el esfuerzo. Sus palabras "Creo que esta es otra razón por la cual los estilos de VCL no están listos para ser realmente utilizados", me recordó a todo esto. Buscando en Google en este momento, no vi nada que indique que los estilos de VCL tenían problemas. ¿Puedes aclarar tu declaración? – RobertFrank

+4

@Robert Buscar en el desbordamiento de pila y control de calidad para los estilos de VCL y verá que esta característica es una característica de calidad previa a la alfa implícita. Al igual que FMX. –

+0

+1 @David. Gracias. – RobertFrank

Respuesta

12

Ok, acabo de hacer un pequeño cambio en la unidad Vcl.Styles.DateTimePickers que es parte del vcl-styles-utils. Para solucionar este problema cuando el tema "Windows Classic" está activo.

utilizar este gancho del estilo de esta manera

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

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

Y este será el resultado.

enter image description here

+2

+1 para vcl-styles-utils. Gracias por hacer este proyecto. –

+2

De nada. – RRUZ

1

puedo confirmar que cuando instalo la experiencia de escritorio, permite Temas e iniciar el servicio Temas, este fallo desaparece.

Bueno aquí es mi código de solución por ahora:

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. 

Es claramente una esquina de los casos salvaje. Espero encontrar más, y volveré y actualizaré esta pregunta cuando encuentre qué más se rompe en Windows Server 2008R2 o Windows 7, cuando el servicio de temas no se está ejecutando, que es lo que sucede cuando eliges "Windows Classic Theme" en Win7, también.

+0

¿Por qué crees que esto está restringido a 7? ¿Qué pasa con Vista? 'Win32MajorVersion> = 6' debería ser suficiente. –

+0

Hmm. Probablemente sea correcto. También probará Vista. –

Cuestiones relacionadas