Delphi для профессионалов

         

Класс 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;

 

Содержание раздела