Короткая версия: измените все формы на AutoScroll = False
Проблема в том, что свойство формы AutoScroll
и как оно влияет на размер формы, хранится в DFM.
Если AutoScroll
равно true (по умолчанию), DFM будет хранить Width
и Height
:
object Form1: TForm1
Left = 192
Top = 114
Width = 544
Height = 375
Caption = 'Form1'
...
Если AutoScroll
равно false ( предпочтительный параметр) DFM будет хранить ClientWidth
и ClientHeight
:
object frmSplash: TfrmSplash
Left = 192
Top = 114
ClientWidth = 536
ClientHeight = 348
Caption = 'Form1'
Проблема с сохранением Height
заключается в том, что происходит, когда пользовательская строка заголовка отличается от размера вашей машины для разработки, например,
- вы разрабатываете в Windows 2000, программа работает в Windows XP
- вы разрабатываете в Windows XP, программа работает в Windows Vista
- Вы разрабатываете с маленькими шрифтами, программа запускается с большими шрифтами
Windows 2000 имела 4-пиксельную рамку с 23-пиксельной надписью.С DFM, хранящим Height
из 375, это оставляет 348px для клиентской области формы.
Запустите ту же программу в Windows XP, которая имеет более высокую (28 пикселей) строку заголовка.С DFM, хранящим Height
из 375 пикселей, это оставляет 343 пикселя для клиентской области.
Ваша форма «стала на 5 пикселей короче».
Вам нужно заставить Delphi хранить ClientWidth
и ClientHeight
в DFM, отключив AutoScroll
.
Теперь, когда вы создаете форму высотой 348 пикселей в Windows XP, она по-прежнему будет иметь 348 пикселей в клиентской области - и при этом будет очень высокойтребуется строка заголовка.
Я захожу настолько далеко, что получаю OutputDebugString
и триггер точки останова, если код моей вспомогательной библиотеки находит любую форму, в которой AutoScroll
по умолчанию установлено true .
Редактировать: Поскольку я стараюсь быть хорошим разработчиком, я заставляю мою форму уважать предпочтения шрифта пользователя.Во время OnCreate
всех моих форм я вызываю StandardizeForm(Self)
функцию, которая:
- масштабирует форму в соответствии с размером шрифта по умолчанию пользователя
- меняет шрифт на всех элементах управления наформа по усмотрению пользователя
- выдает ODS, если для формы ошибочно установлено значение
Scaled
- , выдает ODS и точку останова, если
AutoScroll
true (и устанавливает для нее значениеfalse) - выдает ODS и точку останова, если
ShowHint
имеет значение false (и включает его) - etc
Вы можете сделать что-то подобное.Да, вам нужно добавить:
procedure TCustomerEditForm.FormCreat(Sender: TObject);
begin
StandardizeForm(Self); //Pay your taxes!
...
end;
Но оно того стоит для меня.