Класс TScreen
Этот компонент представляет свойства дисплея (в Windows 98 и 2000 — нескольких дисплеев), на котором выполняется приложение. Поскольку экземпляр данного класса только один (он создается системой при запуске приложения), то большинство методов и свойств имеют информационный характер и недоступны для записи.
Курсор приложения, общий для всех форм, доступен через свойство
property Cursor: TCursor;
Часто приходится включать "песочные часы" на время выполнения длительной операции. Правильнее всего это сделать следующим образом:
Screen.Cursor := crHourglass;
try
{Calculations...}
finally
Screen.Cursor := crDefault;
end;
Имеется список всех курсоров. Получить дескриптор курсора с индексом index можно при помощи свойства:
property Cursors[Index: Integer]: HCURSOR;
Напомним, что индексы зарегистрированных курсоров лежат в диапазоне от —22 (crSizeAll) до 0 (crDefault).
Рассмотренный ниже фрагмент кода при инициализации формы заносит имена всех зарегистрированных в системе курсоров в список ListBoxl. Затем при выборе элемента списка устанавливается соответствующий ему курсор:
procedure TForml.FormCreate(Sender: TObj ect);
type
TGetStrFunc = function(const Value: string): Integer of object;
var
CursorNames: TStringList;
AddValue: TGetStrFunc;
begin
CursorNames := TStringList.Create;
AddValue := CursorNames.Add;
GetCursorValues(TGetStrProc(AddValue));
ListBoxl.Items.Assign(CursorNames);
end;
procedure TForml.ListBoxlClick(Sender: TObject);
begin
Screen.Cursor := StringToCursor(ListBoxl.Items
[ListBoxl.Itemlndex]);
end;
список курсоров, функции GetCursorValues, StringToCursor и некоторые другие содержатся в модуле CONTROLS.PAS.
Имена всех установленных в системе шрифтов помещаются в список, определенный в свойстве
property Fonts: TStrings;
Компонент сообщает неизменяемые свойства экрана (в данном видеорежиме). Его размеры в пикселах определены в свойствах
property Height: Integer; property Width: Integer;
В последних версиях ОС Microsoft имеется поддержка отображения на нескольких мониторах одновременно. Для этой цели предусмотрены свойства
property MonitorCount: Integer;
property Monitors[Index: Integer]: TMonitor;
Каждый компонент TMonitor несет информацию о размерах и положении изображения на нем. Образовавшийся же виртуальный рабочий стол характеризуется следующими свойствами:
property DesktopLeft: Integer; property DesktopTop: Integer; property DesktopWidth: Integer; property DesktopHeight: Integer;
Все координаты отсчитываются от верхнего левого угла первого монитора. Если монитор один, значения этих свойств совпадают с Left, Top, width и Height.
Примечание
С исходными текстами Delphi 5 поставляется модуль MULTIMON.PAS, содержащий прототипы структур и функций Windows 98, 2000 для работы со многими мониторами.
Число точек на дюйм дисплея содержится в свойстве
property PixelsPerlnch: Integer;
При появлении каждая форма заносит себя в список форм глобального объекта screen. Два (доступных только для чтения) свойства дают информацию об этом списке:
property Forms[Index: Integer]: TForm;
property FormCount: Integer;
Нужно иметь в виду, что в списке указаны только формы, открытые приложением, а не все окна системы.
Следующие два свойства указывают на активную в данный момент форму и ее активный элемент управления:
property ActiveControl: TWinControl;
property ActlveForm: TForm;
При их изменении генерируются, соответственно, события
property OnActiveControlChange: TNotifyEvent;
property OnActiveFormChange: TNotifyEvent;
Хотя и "некстати", расскажем здесь о свойстве
property DefaultKbLayout: HKL;
Оно указывает на раскладку клавиатуры, принятую в системе по умолчанию. Часто раскладку клавиатуры нужно переключать программно, чтобы облегчить жизнь пользователю. Так, в приложении, в котором надо быстро вводить в базу данных большой объем информации на русском и английском языках, такое переключение при смене полей просто необходимо.
Сначала следует прочитать список имеющихся в системе раскладок и установить нужную:
var RusLayout, EngLayout : THandle;
procedure TMainForm.FormCreate(Sender: TObject);
var Layouts : array[0..7] of THandle; i,n : Integer;
begin
// Считывание раскладок RusLayout := 0; EngLayout := 0;
n := GetKeyboardLayoutList(High(Layouts)+1, Layouts);
if n>0 then
for i:=0 to n-1 do
if LoWord(Layouts[i]) and $FF = LANG_RUSSIAN then
RusLayout := Layouts[i] else if LoWord(Layouts [i]) and $FF = LANG_ENGLISH then EngLayout : = Layouts[i];
// Если есть, включим русскую
if RusLayout<>0 then ActivateKeyboardLayout(RusLayout,0);
end;
Затем при входе в определенное поле (компонент редактирования данных) и выходе из него можно программно сменить раскладку:
procedure TMainForm.EditDocSerEnter(Sender: TObject);
begin
if EngLayout<>0 then ActivateKeyboardLayout(EngLayout, 0);
end;
procedure TMainForm.EditDocSerExit(Sender: TObject};
begin
if RusLayout<>0 then ActivateKeyboardLayout(RusLayout,0);
end;