Website-Icon Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Der seltsame Fall der VCL Forms ClientWidth und der PE-Flags der Windows-Versionen

2022 vcl clientwidth winversion

Nur wenigen Entwicklern ist bewusst, dass sich Windows-Anwendungen abhängig von den in ihren PE-Headern in der EXE-Datei deklarierten Windows-Versionen unterschiedlich verhalten. Dies hat einige unerwartete Auswirkungen, von denen Delphi-Kunden berichten, aufgrund einer Kernkonfigurationsänderung in Delphi 11, die von den meisten unbemerkt blieb.


Eine Windows-Anwendung wird in einer EXE-Datei im PE-Format gespeichert, das eine Reihe von PE-Flags enthält, die das Anwendungsverhalten in vielen Bereichen bestimmen. Eines dieser Flags ist die Windows-Version . Im Laufe des letzten Jahres hat das Forschungs- und Entwicklungsteam von Embarcadero festgestellt, dass sich einige Windows-APIs (insbesondere im Zusammenhang mit dem Nicht-Client-Bereich von Windows, aber auch in Bezug auf hohe DPI) in den neuesten Versionen des Betriebssystems nicht korrekt verhielten.

Dies lag daran, dass Delphi-Anwendungen standardmäßig ziemlich alte Windows-Versionen in den PE-Flags verwendeten, obwohl die offizielle Unterstützung für Versionen wie Windows XP eingestellt wurde. Um einige echte API-Probleme zu beheben, hat Alexandria Embarcadero aus diesem Grund in Delphi 11 die Windows-Versionen der PE-Flags auf 6.0 umgestellt.

Obwohl diese Änderung in vielen Bereichen vorteilhaft ist, kann sie einige signifikante Änderungen im Verhalten vorhandener VCL-Anwendungen bewirken. Ein sichtbares Beispiel ist die Größe des Fensterrahmens für den Fall eines bsDialog-Formularrahmenstils. Der Rahmenstil wird größer und damit ändert sich der Unterschied zwischen der Formularbreite und seiner Clientbreite. Gleiches gilt für die Höhe.

Als praktisches Beispiel habe ich eine sehr einfache VCL-Anwendung mit einem Button und zwei Labels erstellt. Beachten Sie, dass das Hauptformular diese Einstellung hat:

[crayon-673fc96a90e0e699881706/]
Dies ist der einfache Code der einzigen Schaltfläche:
[crayon-673fc96a90e16667175164/]
Wenn Sie diese Anwendung nun mit Delphi 11 (links) oder mit Delphi 10.4 (rechts) ausführen, erhalten Sie unterschiedliche Ergebnisse:

Bei einer Gesamtform von 1000 erhalte ich in Delphi 11 974 Client-Pixel, verglichen mit 994 in älteren Versionen. Das liegt daran, dass der Rand dicker ist. Die positive Seite ist, dass die Titelleiste einen besseren Abstand hat und die Fensterbeschriftung nicht bis zum Rand vollgestopft ist (was einer der Fehler war, die für ältere Versionen von Delphi gemeldet wurden). Mit anderen Worten, das Fenster auf der linken Seite, das in Delphi 11 erstellt wurde, sieht in Bezug auf den Nicht-Client-Bereich besser aus.

Beachten Sie übrigens, dass standardmäßig die Breite des Formularclients gegenüber der Formularbreite „gewinnt“. Ohne die Zeile zum Festlegen der Breite hätten Sie in beiden Fällen die gleiche Clientbreite und eine andere Formularbreite. Die Positionierung Ihrer Komponenten (bei absoluten Werten) wird also nicht beeinflusst. Nur durch manuelles Einstellen der Breite wird die Client-Breite auf einen anderen Wert als in der Vergangenheit eingestellt.

Wenn Sie nun aus irgendeinem Grund beim alten Verhalten bleiben möchten – vielleicht nur, weil Ihre vorhandene Anwendung so funktioniert – müssen Sie nicht zu Delphi 10.4 zurückkehren. Die PE-Flags können vom Compiler und Linker gesteuert werden. Tatsächlich habe ich das rechte Bild (die alte Version) erhalten, indem ich Delphi 11 verwendet und der Hauptprojektdatei die folgenden zwei Compiler-Direktiven hinzugefügt habe:
[crayon-673fc96a90e18309413519/]
Mit diesem Code können Sie die standardmäßige Änderung, die Embarcadero auf Delphi 11 angewendet hat, rückgängig machen und weiterhin die PE-Flags der älteren Windows-Version und das alte Verhalten verwenden, zum Guten oder zum Schlechten. Deine Entscheidung.

Die mobile Version verlassen