Шаг 20.
Класс TScreen

    На этом шаге мы рассмотрим свойства, методы и события класса TScreen.

    Класс TScreen инкапсулирует состояние экрана или выводимой области. Delphi во время работы автоматически создаст экземпляр класса TScreen. Для его использования в раздел uses нужно включить модуль Forms.

    В любом месте приложения можно использовать такие свойства этого класса, как Height (высота экрана) и Width (ширина экрана). Это может потребоваться, например, тогда, когда нужно сделать размеры формы приложения постоянными и равными половине размеров экрана при любом разрешении монитора. Для автоматического масштабирования формы можно в обработчик события OnCreate формы поместить такой код:

    Form1.Width:=Screen.Width div 2;
    Form1.Height:=Screen.Height div 2;       .

    Разрешающую способность экрана можно узнать, воспользовавшись свойством PixelsPerInch, указывающее количество пикселей на дюйм в вертикальном направлении. Это справедливо именно для вертикального направления, так как во многих мониторах коэффициенты масштабирования по горизонтали и вертикали различаются.

    Класс TScreen имеет свойство Forms, содержащее список форм, отображаемых в данный момент на экране, и свойство 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;

    Аналогичным способом можно получить доступ к соответствующим модулям данных. Свойство DataModules содержит список всех существующих на текущий момент модулей данных приложения, а свойство DataModuleCount указывает число таких модулей. Значения этих свойств можно использовать, например, для поиска требуемой информации в модулях данных.

    Свойство Fonts типа TStrings содержит список шрифтов, доступных на данном компьютере. Его можно использовать в приложении, чтобы проверять, имеется ли на компьютере тот или иной шрифт. Например, можно поместить в приложении компонент TComboBox (поле со списком) и в обработчике события OnCreate формы поместить туда перечень всех доступных шрифтов:

   ComboBox1.Items:=Screen.Fonts;
   ComboBox1.ItemIndex:=0;

    Тогда в нужный момент можно выбрать подходящий шрифт из списка. Для этого в обработчик события OnClick или OnChange списка можно вставить следующий оператор:

   Memo1.Font.Name:=ComboBox1.Items[ComboBox1.ItemIndex];       .

    Проиллюстрируем это в следующем приложении:


Рис.1. Внешний вид приложения

    В обработчик события OnCreate формы поместим первые два оператора, заполняющие компонент TConboBox перечнем доступных шрифтов, а в обработчик события OnClick компонента TButton поместим оператор установки выбранного шрифта в компонент TMemo.

    Текст этого примера можно взять здесь.

    Свойство Cursor класса TScreen определяет вид курсора. Если это свойство равно crDefault, то вид курсора при перемещении над компонентом определяется установленным у него значением свойства Cursor. Но если это свойство имеет другое значение, то соответствующее значение свойства компонента отменяется и курсор имеет глобальный вид, заданный свойством Cursor класса TScreen. Этим можно воспользоваться, например, для вывода "песочных часов" при выполнении каких-либо длительных операций:

    Screen.Cursor:=crHourglass; //Задание вида "песочных часов".
    <Выполнение каких-либо "длинных" действий.>
    Screen.Cursor:=crDefault; //Отмена глобального курсора.

    Если в приложении в какие-то отрезки времени используется отличный от crDefault глобальный вид курсора, то приведенный код можно изменить, чтобы по окончании длинных операций восстановить прежнее глобальное значение:

    Var
      OldCursor: TCursor;
    Begin
      OldCursor:=Screen.Cursor; //Запомнили старое значение курсора.
      Screen.Cursor:=crHourglass; //Задание вида "песочных часов".
      <Выполнение каких-либо "длинных" действий.>
      Screen.Cursor:= OldCursor; //Восстановление старого значения.
    End;

    Имеется также свойство Cursors, которое представляет собой список доступных приложению курсоров. Можно создать и использовать свой собственный курсор. Для создания курсора можно воспользоваться встроенным в Delphi Редактором Изображений (Image Editor). Регистрация созданного курсора осуществляется с помощью функции LoadCursor. Приведем общую схему реализации этой задачи.

    Пусть, например, имеется созданный курсор, включенный в ресурс приложения под именем MyCursor1. Тогда в приложении можно объявить глобальную константу, обозначающую этот курсор. Например:

    implementetion
	const crMyCursor = 1;
    .     .     .     .     .

    Значение этой константы может лежать в пределах от -32768 до 32767. Важно, чтобы она не совпадала с предопределенными значениями стандартных курсоров, лежащих на промежутке от -22 до 0.

    В обработчике события OnCreate формы можно разместить оператор, регистрирующий курсор в свойстве Cursors:

    Screen.Cursors[crMyCursor]:=LoadCursor(HInstance,'MyCursor1');       .

    Тогда в нужный момент можно установить этот курсор в качестве глобального оператором:

   Screen.Cursor:=crMyCursor;           .

    Приведем исходный текст приложения. Содержание файла проекта:

   program Pr_cur;

   uses
     Forms,
     Un_cur in 'Un_cur.pas' {Form1};

   {$R *.res}
   {$R cur.res} //Подключение файла ресурсов.
   //Здесь находится созданный курсор.

   begin
     Application.Initialize;
     Application.CreateForm(TForm1, Form1);
     Application.Run;
   end.

    Содержание файла модуля:

   unit Un_cur;

   interface

   uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
     Forms, Dialogs;

   type
     TForm1 = class(TForm)
       procedure FormCreate(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

   var
     Form1: TForm1;

   implementation
     const crMyCursor = 1; //Описание константы.
   {$R *.dfm}

   procedure TForm1.FormCreate(Sender: TObject);
   begin
      //Регистрация созданного курсора.
      Screen.Cursors[crMyCursor]:=LoadCursor(HInstance,'MyCursor1');
      //Установка глобального курсора.
      Screen.Cursor:=crMyCursor;
   end;

   end.

    Текст этого примера можно взять здесь.


    Примечание. Можно использовать зарегистрированный курсор как локальный. Например, для панели Panel1:
   Panel1.Cursor:=crMyCursor;          .

    Используя свойство ActiveForm (типа TForm), можно получить доступ к активной в данный момент форме. Если пользователь переключился на какое-то другое приложение, то значение этого свойства показывает, какая из форм будет активной, когда приложение получит фокус. В качестве примера используем свойство для создания мигающего заголовка формы, чтобы привлечь внимание пользователя. Функция Windows API, предназначенная для этой цели, должна получить дескриптор окна:

    FlashWindow(Screen.ActiveForm.Handle,False);                .

    Аналогично с помощью свойства ActiveControl (типа TWinControl) можно получить доступ к активному в данный момент оконному компоненту на активной форме.

    Класс TScreen предоставляет два основных события, извещающих программу об изменении фокуса ввода. Подобно классу TApplication, доступ к свойствам и событиям класса TScreen возможен лишь при выполнении приложения.

    Событие OnActiveControlChange возникает при передаче фокуса ввода от одного управляющего элемента к другому. Свойство ActiveControl обновляется непосредственно перед вызовом события. Можно использовать это событие, например, для вывода текста подсказки в строке состояния.

    Событие OnActiveFormChange генерируется при создании новой формы или передаче фокуса ввода от одной формы к другой. Обычно это событие используется в MDI-приложениях для обновления доступных функций меню и кнопок-ускорителей.

    На следующем шаге мы рассмотрим состав класса TList.




Предыдущий шаг Содержание Следующий шаг