В приложении Delphi автоматически создается глобальный объект Screen (экран) типа TScreen, свойства которого определяются из информации Windows о мониторе, на котором запускается приложение. Вы можете в любом приложении использовать, например, такие параметры объекта Screen, как Height — высота экрана и Width — его ширина. Так как вы используете в процессе проектирования один тип монитора, а приложение в дальнейшем может работать на мониторе другого типа, то не исключено, например, что ваша форма не поместится на экране или наоборот — будет слишком маленького размера для данного монитора. Чтобы избежать этих неприятностей, можно автоматически масштабировать свою форму, вводя, например, в обработчик ее события OnCreate код:
Form1.Width := Screen.Width div 2; Form1.Height := Screen.Height div 2;
Этот код задает размеры формы равными половине соответствующих размеров экрана.
Разрешающую способность экрана можно определить, воспользовавшись свойством PixelsPerInch, указывающим количество пикселей экрана на дюйм в вертикальном направлении. Это справедливо именно для вертикального направления, поскольку во многих мониторах коэффициенты масштабирования по горизонтали и вертикали различаются.
Screen имеет свойство Forms[I], содержащее список форм, отображаемых в данный момент на экране, и свойство FormCount, отражающее количество таких форм. Вы можете использовать это свойство, например, для того, чтобы гарантировать, что на данном типе монитора размеры ни одной формы не превысят размеров экрана. Соответствующий код может выглядеть так:
with Screen do for I := 0 to FormCount — 1 do begin if Forms[I].Height > Height then Forms[I].Height := Height; if Forms[I].Width > Width then Forms[I].Width := Width; end;
Размеры форм, превышающие размер экрана, урезаются этим кодом.
В приведенных примерах надо, конечно, предусмотреть, чтобы при изменении размеров формы адекватно изменялось и расположение компонентов на ее поверхности.
Еще одно полезное свойство объекта Screen — Fonts (шрифты). Это свойство типа TStrings содержит список шрифтов, доступных на данном компьютере (свойство только для чтения). Его можно использовать в приложении, чтобы проверять, имеется ли на компьютере тот или иной шрифт, используемый в приложении. Если нет — то можно или дать пользователю соответствующее предупреждение, или сменить шрифт в приложении на один из доступных, или дать пользователю возможность самому выбрать соответствующий шрифт. Например, вы можете поместить в вашем приложении компонент списка TComboBox и при событии формы OnCreate загрузить его доступными шрифтами с помощью операторов:
ComboBox1.Items := Screen.Fonts; ComboBox1.ItemIndex := 0;
Тогда в нужный момент пользователь может выбрать подходящий шрифт из списка. Пример использования свойства Screen.Fonts приведен в разделе 3.1.
В Delphi 5 в тип TScreen введено два новых свойства: HintFont и MenuFont типа TFont. Они хранят установленные в Windows шрифты отображения ярлычков и разделов меню.
Свойство Cursor объекта Screen определяет вид курсора. Если это свойство равно crDefault, то вид курсора при перемещении над компонентами определяется установленными в них свойствами Cursor. Но если свойство Cursor объекта Screen отлично от crDefault, то соответствующие свойства компонентов отменяются и курсор имеет глобальный вид, заданный в Screen. Этим можно воспользоваться для такой частой задачи, как изменение курсора на форму «песочные часы» во время выполнения каких-то длинных операций. Это можно сделать следующим образом:
Screen.Cursor := crHourGlass; try <выполнение требуемых длинных операций> finally Screen.Cursor := crDefault; end;
При успешном или аварийном окончании длинных операций курсор в любом случае возвращается в значение по умолчанию. Если в приложении в какие-то отрезки времени используется отличный от crDefault глобальный вид курсора, то приведенный код можно изменить, чтобы по окончании длинных операций восстановить прежнее глобальное значение:
var OldCursor: TCursor; begin OldCursor := Screen.Cursor; Screen.Cursor := crHourGlass; try <выполнение требуемых долгих операций> finally Screen.Cursor := OldCursor; end;
С помощью Screen можно получить доступ к активной в текущий момент форме вашего приложения через свойство ActiveForm. Если в данный момент пользователь переключился с вашего приложения на какое-то другое и, следовательно, ни одна форма вашего приложения не активна, то ActiveForm указывает на форму, которая станет активной, когда пользователь вернется к вашему приложению. В момент переключения фокуса с одной вашей формы на другую, генерируется событие OnActiveFormChange.
Аналогично с помощью свойства ActiveControl можно получить доступ к активному в данный момент оконному компоненту на активной форме. При смене фокуса генерируется событие OnActiveControlChange.
Начиная с Delphi 4 предусмотрена возможность разработки мультиэкранных приложений, работающих одновременно с множеством мониторов. При этом приложение может решать, какие формы и диалоги надо отображать на том или ином мониторе. Свойства различных мониторов, используемых в таком приложении, можно найти с помощью свойства Screen.Monitors[I], где I — индекс монитора. Индекс 0 относится к первичному монитору. Свойство Screen.Monitors[I] является списком объектов типа TMonitor, содержащих информацию о конкретных мониторах.
Среди свойств объектов типа TMonitor имеются Height — высота и Width — ширина экрана монитора. Кроме того имеются свойства Left и Тор. Эти свойства означают следующее. Все доступное экранное пространство можно представить себе разбитым на экраны отдельных мониторов, размещающихся слева направо и сверху вниз. Соответственно свойства Left и Тор определяют координаты левого верхнего угла экрана монитора в этом логическом экранном пространстве. Объекты типа TMonitor имеют также свойство MonitorNum — номер монитора, представляющий собой его индекс в свойстве Screen.Monitors[I].
Для управления тем, на каком мониторе должна появляться та или иная форма, служит свойство формы DefaultMonitor. Это свойство может принимать значения:
dmDesktop | не предпринимается попыток разместить форму на конкретном мониторе |
dmPrimary | форма размещается на первом мониторе в списке Screen.Monitors |
dmMainForm | форма появляется на том мониторе, на котором размещена главная форма |
dmActiveForm | форма появляется на том мониторе, на котором размещена текущая активная форма |