Site icon Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Le cas étrange des formulaires VCL ClientWidth et des drapeaux PE des versions Windows

2022 vcl clientwidth winversion

Seuls quelques développeurs savent que les applications Windows se comportent différemment selon les versions de Windows déclarées dans leurs en-têtes PE dans le fichier EXE. Cela a des effets inattendus signalés par les clients de Delphi, en raison d’un changement de configuration de base dans Delphi 11, qui est passé inaperçu pour la plupart.


Une application Windows est stockée dans un fichier EXE au format PE, qui comprend un certain nombre d’indicateurs PE qui déterminent le comportement de l’application dans de nombreux domaines. L’un de ces drapeaux est la version Windows . Au cours de la dernière année, l’équipe R&D d’Embarcadero a commencé à constater que certaines API Windows (en particulier liées à la zone non cliente de Windows, mais aussi autour de High DPI) ne se comportaient pas correctement dans les dernières versions du système d’exploitation.

Cela était dû au fait que les applications Delphi utilisaient par défaut des versions Windows assez anciennes dans les drapeaux PE, malgré l’abandon du support officiel pour des versions comme Windows XP. Pour cette raison, pour résoudre certains problèmes d’API authentiques, dans Delphi 11, Alexandria Embarcadero a basculé les drapeaux PE des versions Windows vers 6.0.

Bien que ce changement soit bénéfique dans de nombreux domaines, il peut entraîner des changements significatifs dans le comportement des applications VCL existantes. Un exemple visible est la taille de la bordure de la fenêtre dans le cas d’un style de bordure de formulaire bsDialog. Le style de bordure devient plus grand et donc la différence entre la largeur du formulaire et sa largeur client change. Idem pour la hauteur.

Comme exemple pratique, j’ai créé une application VCL très simple avec un bouton et deux étiquettes. Notez que le formulaire principal a ce paramètre :

[crayon-673ff811d2d3c333615678/]
Voici le code simple du seul bouton :
[crayon-673ff811d2d42997336819/]
Maintenant, si vous exécutez cette application avec Delphi 11 (à gauche) ou avec Delphi 10.4 (à droite), vous obtiendrez des résultats différents :

Avec une forme globale de 1000, j’obtiens 974 pixels client dans Delphi 11, contre 994 dans les anciennes versions. C’est parce que la bordure est plus épaisse. Le côté positif est que la barre de titre a un meilleur espacement et que la légende de la fenêtre n’est pas entassée à la bordure (ce qui était l’un des bogues signalés pour les anciennes versions de Delphi). En d’autres termes, la fenêtre de gauche, construite en Delphi 11, est plus esthétique en termes de zone non cliente.

Au fait, notez que par défaut, la largeur du client de formulaire « l’emporte » sur la largeur du formulaire. Sans la ligne pour définir la largeur, dans les deux cas, vous auriez la même largeur client et une largeur de formulaire différente. Ainsi, le positionnement de vos composants (en cas de valeurs absolues) ne sera pas affecté. Ce n’est qu’en définissant manuellement la largeur que la largeur du client est définie sur une valeur différente du passé.

Maintenant, si pour une raison quelconque vous souhaitez conserver l’ancien comportement – peut-être simplement parce que c’est ainsi que fonctionne votre application existante – vous n’avez pas besoin de revenir à Delphi 10.4. Les drapeaux PE peuvent être contrôlés par le compilateur et l’éditeur de liens. En fait, j’ai obtenu l’image de droite (l’ancienne version) en utilisant Delphi 11 et en ajoutant au fichier principal du projet les deux directives de compilation suivantes :
[crayon-673ff811d2d44693869835/]
Avec ce code, vous pouvez annuler la modification par défaut Embarcadero appliquée à Delphi 11 et continuer à utiliser les indicateurs PE de l’ancienne version de Windows et l’ancien comportement, pour le meilleur ou pour le pire. Votre choix.

Quitter la version mobile