Das funktioniert seit Delphi 2005 oder 2006 korrekt. Und das Problem trat schon seit Vista auf, bei gestylten Windows-GUIs auch schon bei XP.
Das per E-Mail vermutlich immer noch kostenlos erhältliche Turbo Delphi macht es z.B. korrekt.
Die einzige Möglichkeit ist immer mit Align alClient usw. zu arbeiten. Das sieht zwar nicht schön aus, dafür aber überall gleich.
Die Scrollbars bekommst du weg indem du ein Panel auf alClient auf das Formular legst und alles andere drauf oder die Scrollbars beim Formular ausschaltest. Den Abstand vom rechten und unteren Rand bekommst du trotzdem nicht korrekt hin.
Man könnte versuchen das zu fixen indem man in das Setzen der Größe eingreift, wenn der ComponentState csLoading ist oder so... durch eine Umleitung der passenden virtuellen Methoden oder durch Erstellen einer abgeleiteten Formularklasse. Aber ich habe keine Zeit und auch keine Lust das noch für Delphi 7 zu machen. Vielleicht findet sich ja jemand...
// EDIT:
Ist wirklich so einfach (für kompilieren unter XP, Ausführen unter Vista+):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
...
procedure TForm1.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin if (csLoading in ComponentState) and (Win32MajorVersion > 5) then begin if AWidth > 0 then inherited SetBounds(ALeft, ATop, AWidth + 4, AHeight) else if AHeight > 0 then inherited SetBounds(ALeft, ATop, AWidth, AHeight + 4) else inherited; end else inherited; end; |
Die 4 muss natürlich noch durch den echten Rahmenunterschied ersetzt werden (der Rahmen ist unterschiedlich breit, nicht nur im Vergleich zu XP!).