Как справиться с проблемами размера формы от Delphi 6 и WinXP до Delphi 2007 и Vista / Win7 - PullRequest
6 голосов
/ 02 июня 2011

У меня есть приложение, написанное на Delphi 6 и скомпилированное на Windows XP.Обычно я оставляю 8px свободными между элементами управления и краями форм.

Когда это приложение работает на Vista или Win 7, этот разрыв меньше или вообще отсутствует.Я думаю, это может быть связано с тем, что эти версии Windows имеют более толстые границы форм.

Теперь я перемещаю приложение в Delphi 2007. В конструкторе форм формы потеряли нижний и правый пробелы.* Как мне с этим бороться?У меня есть сотни форм, и я не хочу менять их все.Кроме того, большинство наших пользователей запускают приложение на Win XP, поэтому я не хочу, чтобы в XP оно выглядело плохо.

1 Ответ

11 голосов
/ 04 июня 2011

Короткая версия: измените все формы на 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;

Но оно того стоит для меня.

...