![2022vclclientwidthwinversion | Embarcadero RAD Studio Delphi C++Builder Blogs 2022 vcl clientwidth winversion](https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2022/01/2022_vcl_clientwidth_winversion-2759777.png?resize=1140%2C539&ssl=1)
Solo unos pocos desarrolladores saben que las aplicaciones de Windows se comportan de manera diferente según las versiones de Windows declaradas en sus encabezados PE en el archivo EXE. Esto tiene algunos efectos inesperados que informan los clientes de Delphi, debido a un cambio de configuración central en Delphi 11, que pasó desapercibido para la mayoría.
Una aplicación de Windows se almacena en un archivo EXE en formato PE, que incluye varios indicadores de PE que determinan el comportamiento de la aplicación en muchas áreas. Una de estas banderas es la versión de Windows . Durante el último año, el equipo de I+D de Embarcadero ha comenzado a observar que algunas API de Windows (particularmente relacionadas con el área de no cliente de Windows, pero también con High DPI) no se comportaban correctamente en las últimas versiones del sistema operativo.
Esto se debió al hecho de que las aplicaciones de Delphi por defecto usaban versiones de Windows bastante antiguas en las banderas de PE, a pesar de haber eliminado el soporte oficial para versiones como Windows XP. Por esta razón, para abordar algunos problemas genuinos de la API, en Delphi 11 Alexandria Embarcadero cambió las versiones de Windows de las banderas PE a 6.0.
Si bien este cambio es beneficioso en muchas áreas, puede causar algunos cambios significativos en el comportamiento de las aplicaciones VCL existentes. Un ejemplo visible es el tamaño del borde de la ventana en el caso de un estilo de borde de formulario bsDialog. El estilo del borde se vuelve más grande y, por lo tanto, cambia la diferencia entre el ancho del formulario y el ancho del cliente. Lo mismo para la altura.
Como ejemplo práctico, he creado una aplicación VCL muy simple con un botón y dos etiquetas. Observe que el formulario principal tiene esta configuración:
1 |
BorderStyle = bsDialog |
Este es el código simple del único botón:
1 2 3 4 5 6 |
procedure TForm10.Button1Click(Sender: TObject); begin Width := 1000; Label1.Caption := 'Cli: ' + ClientWidth.ToString; Label2.Caption := 'Win: ' + Width.ToString; end; |
Ahora, si ejecuta esta aplicación con Delphi 11 (izquierda) o con Delphi 10.4 (derecha), obtendrá resultados diferentes:
Con un formulario general de 1000, obtengo 974 píxeles de cliente en Delphi 11, en comparación con 994 en versiones anteriores. Eso es porque el borde es más grueso. El lado positivo es que la barra de título tiene un mejor espaciado y el título de la ventana no está abarrotado hasta el borde (que era uno de los errores informados para las versiones anteriores de Delphi). En otras palabras, la ventana de la izquierda, construida en Delphi 11, se ve mejor en términos de área de no cliente.
Por cierto, tenga en cuenta que, de forma predeterminada, el ancho del cliente del formulario “gana” sobre el ancho del formulario. Sin la línea para establecer el ancho, en ambos casos tendría el mismo ancho de cliente y un ancho de formulario diferente. Por lo tanto, el posicionamiento de sus componentes (en caso de valores absolutos) no se verá afectado. Solo al configurar manualmente el ancho, el ancho del cliente se establece en un valor diferente del pasado.
Ahora bien, si por alguna razón desea mantener el comportamiento anterior, tal vez solo porque así es como funciona su aplicación existente, no necesita volver a Delphi 10.4. Las banderas PE pueden ser controladas por el compilador y el enlazador. De hecho, obtuve la imagen de la derecha (la versión anterior) usando Delphi 11 y agregando al archivo principal del proyecto las siguientes dos directivas del compilador:
1 2 |
{$SETPEOSVERSION 4.0} {$SETPESUBSYSVERSION 4.0} |
Con este código, puede revertir el cambio predeterminado que Embarcadero aplicó a Delphi 11 y seguir usando las banderas de PE de la versión anterior de Windows y el comportamiento anterior, para bien o para mal. Tu elección.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition