Масштабирование окна II
Вывод формы с различными разрешениями экрана.
При проектировании форм часто бывает полезным предусмотреть ситуацию, когда форма и находящиеся на ней элементы управления должны иметь одинаковый размер вне зависимости от текущего разрешения экрана. Вот небольшой пример как можно это сделать:
|
|
implementation
const
ScreenWidth: LongInt = 800; {Я разрабатывал мою форму в режиме 800x600.}
ScreenHeight: LongInt = 600;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
scaled := true;
if (screen.width <> ScreenWidth) then
begin
height := longint(height) * longint(screen.height) div ScreenHeight;
width := longint(width) * longint(screen.width) div ScreenWidth;
scaleBy(screen.width, ScreenWidth);
end;
end;
|
Затем, вероятно, вы захотите иметь нечто, проверяющее размер шрифтов, OK. Прежде, чем вы измените размер шрифта, вам необходимо убедиться, что объект имеет свойство font. Это может быть сделано следующим образом:
|
|
uses typinfo;
var
i: integer;
begin
for i := componentCount - 1 downtto 0 do
with components[i] do
begin
if GetPropInfo(ClassInfo, 'font') <> nil then
font.size := (NewFormWidth DIV OldFormWidth) * font.size;
end;
end;
|
Примечание: При разработке приложения для различных режимов разрешения вам необходимо учитывать следующие рекомендации:
- Заранее, в самом начале этапа разработки, решите для себя - собираетесь ли вы разрешать масштабировать форму или нет. Преимущество запрета масштабирования в том, что вам ничего не нужно менять во время выполнения приложения. Недостаток запрета масштабирования - во время выполнения приложения никаких изменений не происходит (ваша форма может быть слишком малой или слишком большой для работы в некоторых режимах при отсутствии масштабирования).
- Если вы НЕ собираетесь масштабировать форму, установите свойство Scaled в False.
- В противном случае, установите свойство формы Scaled в True.
- Установите AutoScroll в False. AutoScroll = True означает 'не изменять размер окна формы во время выполнения приложения', что приводит к "плохому виду" формы, если ее содержимое меняет размер.
- Установите шрифты формы в масштабируемые TrueType-шрифты типа Arial. MS San Serif также подойдет в качестве альтернативы, только помните, это не TrueType, а bitmapped-шрифт. Только Arial может правильно изменять свою высоту с дискретностью 1 пиксел. Примечание: Если используемый шрифт не установлен на машине пользователя, Windows выбирает альтернативный шрифт из данной линейки (семьи) шрифтов. Размеры нового шрифта могут отличаться от размеров оригинального шрифта, что также может вызвать проблемы.
- Установите свойство формы Position во что-нибудь другое, чем poDesigned. poDesigned всегда показывает форму в первозданном виде, и, если форма разрабатывалась в разрешении 1280x1024, то вы можете себе представить, что будет при разрешении 640x480?
- Не "слепляйте" на форме элементы управления, оставляйте между ними, по крайней мере, 4 пикселя, в противном случае, при изменении месторасположения границы на 1 пиксель (это происходит при масштабировании), элементы управления наедут друг на друга.
- Для однострочных компонентов Label, у которых свойство Aligned равно alLeft или alRight, установите AutoSize в True. В противном случае, установите AutoSize в False.
- Убедитесь в том, что компоненты Label имеют достаточный запас по ширине (требуется, примерно, 25%) от длины текущего текста. (При переводе вашего приложения на другие языки вам необходимо примерно 30%-ный запас от текущей ширины текста). Если AutoSize - False, убедитесь, что ширины компонента Label достаточно для размещения реального текста. Если AutoSize - True, убедитесь, что на компоненту Label достаточно места (например, на форме) для размещения всего текста плюс небольшой запас для его роста при смене шрифтов.
- В случае многострочного текста и компонентов Label с переносом слов, убедитесь, что в нижней части у вас имеется, по крайней мере, еще одна строчка. Она необходима вам для того, чтобы не допустить переполнения строки, если размер шрифта увеличивается при масштабировании. Не думайте, что, если вы используете большие шрифты и переполнения не возникает, то эта проблема снята - кто-нибудь может использовать шрифты с еще большим размером, чем у вас!
- Будьте осторожными при открытии проекта в IDE с другим разрешением. Свойство формы PixelsPerInch будет изменено как только вы откроете форму, и сохранено в DFM-файле при сохранении проекта. Лучше всего запускать приложение отдельно от IDE, а редактировать его при одном разрешении. Редактируя формы при различных разрешениях и размерах шрифтов, вы инициируете проблему "дрейфа" компонентов по форме и изменения их размера.
- Говоря о дрейфе компонент, не следует многократно масштабировать форму, как во время разработки, так и во время выполнения приложения. Каждое изменение размеров сопровождается ошибками округления, которые достаточно быстро накапливаются с тех пор, как координаты стали строго целочисленными. Поскольку при калькулировании новых размеров дробная часть отбрасывается, вновь пересчитанные размеры оказываются меньше, а координаты элементов управления северо-западнее. Если вы решили разрешить пользователю изменять масштабы форм, начинайте масштабирование с последней загруженной/созданной формы, этим вы уменьшите накапливаемые при масштабировании ошибки.
- Старайтесь не изменять значение свойства формы PixelsPerInch.
- В общих словах, нет необходимости разрабатывать формы для всех возможных режимов, перед окончательным релизом вашего приложения вы должны оценить поведение формы в пограничных режимах - 640x480 с маленькими и большими шрифтами, и при высоком разрешении и, также, с маленькими и большими шрифтами. Это должно быть частью ваших регулярных проверок на предмет системной совместимости, для ведения так называемой тестирующей контрольной таблицы.
- Обратите пристальное внимание на "однострочные компоненты TMemo" - типа TDBLookupCombo. Системные многострочные редакторы всегда выводят только целые строки текста - если ширина элемента управления слишком мала для своего шрифта, то TMemo вообще ничего не показывает (TEdit показывает обрезанный текст). Размер таких компонентов лучше сделать на несколько пикселей больше, чем на несколько пикселей меньше, тем самым можно определеть наличие в компоненте оставшейся части текста.
- Обратите внимание на то, что масштабирование во время проектирования и во время выполнения программы отличается коэффициентом и зависит от высоты шрифта, а не от экранного разрешения в пикселях. Помните также, что "начало" компонент будет изменяться в зависимости от масштаба формы, и для их "броуновского" движения также необходимо небольшое пространство.
[000626]
Содержание раздела