Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
Notícia

O estranho caso do VCL Forms ClientWidth e os sinalizadores PE das versões do Windows

2022_vcl_clientwidth_winversion

Apenas alguns desenvolvedores estão cientes de que o aplicativo do Windows se comporta de maneira diferente dependendo das versões do Windows declaradas em seus cabeçalhos PE no arquivo EXE. Isso tem alguns efeitos inesperados que os clientes Delphi estão relatando, devido a uma mudança de configuração central no Delphi 11, que passou despercebida pela maioria.


Um aplicativo do Windows é armazenado em um arquivo EXE no formato PE, que inclui vários sinalizadores PE que determinam o comportamento do aplicativo em várias áreas. Um desses sinalizadores é a versão do Windows . Ao longo do ano passado, a equipe de P&D da Embarcadero começou a testemunhar que algumas APIs do Windows (particularmente relacionadas à área não cliente do Windows, mas também em torno de DPI alto) não estavam se comportando corretamente nas versões mais recentes do sistema operacional.

Isso se deve ao fato de que os aplicativos Delphi, por padrão, estavam usando versões bastante antigas do Windows nos sinalizadores PE, apesar de terem descartado o suporte oficial para versões como o Windows XP. Por esse motivo, para resolver alguns problemas de API genuínos, no Delphi 11, Alexandria Embarcadero mudou os sinalizadores PE das versões do Windows para 6.0.

Embora essa alteração seja benéfica em muitas áreas, ela pode causar algumas alterações significativas no comportamento dos aplicativos VCL existentes. Um exemplo visível está no tamanho da borda da janela no caso de um estilo de borda de formulário bsDialog. O estilo da borda se torna maior e, portanto, a diferença entre a largura do formulário e a largura do cliente muda. O mesmo para a altura.

Como exemplo prático, criei um aplicativo VCL muito simples com um botão e dois rótulos. Observe que o formulário principal tem esta configuração:


Este é o código simples do único botão:

Agora, se você executar este aplicativo com o Delphi 11 (esquerda) ou com o Delphi 10.4 (direita), obterá resultados diferentes:

2022_vcl_clientwidth_winversion-5032507

Com um formulário geral de 1000, obtenho 974 pixels de cliente no Delphi 11, em comparação com 994 em versões mais antigas. Isso porque a borda é mais grossa. O lado positivo é que a barra de título tem um espaçamento melhor e a legenda da janela não fica apertada na borda (que foi um dos bugs relatados para versões mais antigas do Delphi). Em outras palavras, a janela à esquerda, construída em Delphi 11, é mais bonita em termos de área não cliente.

A propósito, observe que, por padrão, a largura do cliente do formulário “vence” sobre a largura do formulário. Sem a linha para definir a largura, em ambos os casos você teria a mesma largura de cliente e uma largura de formulário diferente. Assim, o posicionamento de seus componentes (no caso de valores absolutos) não será afetado. É somente definindo manualmente a Largura que a Largura do Cliente é definida para um valor diferente do passado.

Agora, se por algum motivo você quiser manter o comportamento antigo – talvez apenas porque é como seu aplicativo existente funciona – você não precisa voltar para o Delphi 10.4. Os sinalizadores PE podem ser controlados pelo compilador e pelo vinculador. Na verdade, obtive a imagem à direita (a versão antiga) usando o Delphi 11 e adicionando ao arquivo principal do projeto as duas diretivas do compilador a seguir:

Com este código, você pode reverter a alteração padrão aplicada pelo Embarcadero ao Delphi 11 e continuar usando os sinalizadores PE da versão mais antiga do Windows e o comportamento antigo, para o bem ou para o mal. Sua escolha.


Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

IN THE ARTICLES