Простейшие события, на которые иногда нужно реагировать - это, например, события, связанные с мышкой (они есть практически у всех видимых объектов) или событие OnClick для кнопки TButton. Все события в Delphi принято предварять префиксом on: onCreate, OnMouseMove, OnPaint и так далее. Щелкнув в Инспекторе объектов на странице Events в поле любого события, можно получить в программе заготовку метода нужного типа. При этом его имя будет состоять из имени текущего компонента и имени события (без префикса On), а относиться он будет к текущей форме. Например, обработчик щелчка левой кнопки мыши на форме будет выглядеть так:

procedure TForm1.Button1Click(Sender: TObject);

begin

end;

Поскольку события — это свойства объекта, их значения, можно изменять в любой момент во время выполнения программы. Эта замечательная возможность называется делегированием. Можно в любой момент взять способы реакции на события у одного объекта и присвоить (делегировать) их другому:

Object1.OnMouseMove := Object2.OnMouseMove;

Принцип делегирования позволяет избежать трудоемкого процесса порождения новых дочерних классов для каждого специфического случая, заменяя его простой подстановкой процедур. Можно при необходимости выбирать один из нескольких возможных вариантов обработчиков событий.

2.5  Некоторые общие события компонентов

Для большинства видимых визуальных компонентов, т. е. потомков класса TControl, определен набор обработчиков событий, связанных с мышью. Для выполнения какого-либо действия с помощью щелчка левой кнопки мыши для большинства случаев достаточно запрограммировать обработчик событий OnClick, а для реакции на двойной щелчок используется событие OnDbClick. Для более совершенного управления мышью лучше использовать обработчики следующих событий:

НЕ нашли? Не то? Что вы ищете?

·  OnMouseDown. Событие вызывается при нажатии любой кнопки мыши.

·  OnMouseMove. Событие вызывается при перемещении курсора мыши.

·  OnMouseUp. Событие вызывается при отпускании любой кнопки мыши.

Процедуры обработки этих событий получают следующие параметры:

·  Sender. Параметр представляет объект, который получил это событие (т. е. на каком компоненте щелкнули мышью).

·  Button. Параметр имеет одно из трех значений: mbRight, mbLeft, mbMiddle и используется для определения кнопки мыши, которую нажал пользователь.

·  Shift. Множество, которое может содержать следующие элементы: ssShift, ssCtrl, ssAlt, ssLeft, ssRight, ssMiddle, ssDouble. Используется для определения нажатия клавиш <Ctrl>, <Alt>, <Shift> (или комбинации этих клавиш) в момент щелчка мышью, а также для определения какой кнопкой мыши щелкнул пользователь.

·  X, Y. Координаты указателя мыши в пикселях относительно клиентской области окна с координатами (0,0) в верхнем левом углу.

Необходимо отметить, что событие OnClick возникает после события OnMouseDown, но перед событием OnMouseUp. Событие OnDbClick генерируется после события OnMouseUp.

Рисунок 5

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

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

If (Button=mbRight)

then Caption:=IntToStr(X)+’, ’+IntToStr(Y);

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Caption:='';

end;

Визуальные компоненты, которые являются потомками класса TWinControl, кроме обработчиков событий, связанных с мышью, также обладают набором обработчиков событий от клавиатуры.

·  OnKeyDown Событие возникает при нажатии любой клавиши клавиатуры.

·  OnKeyUp Событие возникает при отпускании клавиши клавиатуры

·  OnKeyPress Данное событие генерирует после OnKeyDown, но перед OnKeyUp

Процедуры обработки событий OnKeyDown и OnKeyUp получают следующие параметры:

·  Sender. Параметр представляет объект, который получил это событие (т. е. какой компонент в данный момент имеет фокус ввода).

·  Key. Параметр целого типа содержит виртуальный код клавиши, т. е. специальной константы, которая определена для каждой клавиши клавиатуры. Для буквенно-цифровых клавиш виртуальный код совпадает с кодом символа.

·  Shift. Множество, которое может содержать следующие элементы: ssShift, ssCtrl, ssAlt, ssLeft, ssRight, ssMiddle, ssDouble. Используется для определения нажатия клавиш <Ctrl>, <Alt>, <Shift> (или комбинации этих клавиш), а также для определения какой кнопкой мыши щелкнул пользователь.

Для процедуры обработки события OnKeyPress имеется такой набор параметров.

·  Sender. Параметр представляет объект, который получил это событие (т. е. какой компонент в данный момент имеет фокус ввода).

·  Key. Параметр символьного типа содержит символ, который получается в результате нажатия клавиш клавиатуры.

Таким образом, события OnKeyDown и OnKeyUp перехватывают нажатия большинства клавиш клавиатуры, в то время как событие OnKeyPress позволяет обрабатывать только нажатие буквенно-цифровых клавиш. При этом получаемый символ Key учитывает выбранный язык (раскладку клавиатуры) и нажатую клавишу Shift.

Для потомков класса TWinControl определены события OnEnter и OnExit, которые возникают в момент получения (потери) компонентом фокуса ввода.

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

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

If (Shift=[ssShift]) and (Key=Ord(‘A’)) then Caption:=’Ok’;

end;

Другой способ заключается в использовании события OnKeyPress.

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin

If key='A' then Caption:='Оk';

end;

Однако необходимо заметить, что этот обработчик будет срабатывать только, если выбран английский язык и отключена клавиша Caps Lock, поскольку только в этом случае возможно получить символ А путем нажатия комбинации Shift+А.

2.6  Контрольные вопросы

1.  Какие события используются для управления курсором мыши?

2.  Каким образом можно получить координаты курсора мыши на форме?

3.  Как можно определить какая именно клавиша мыши была нажата?

4.  Какие события используются для получения комбинации нажатых или отпущенных клавиш?

5.  Какое событие позволяет определить нажатый символ?

6.  Какие свойства общие для всех компонентов?

7.  Какие визуальные компоненты называют невидимыми?

8.  Какие свойства компонента отвечают за его местоположение на форме?

9.  Каким образом можно изменять свойства компонентов?

3.  Класс TForm

3.1  Роль формы в приложении

Классическое приложение Windows обязательно имеет хотя бы одно окно, при этом окно приложения должно уметь выполнять целый ряд важных операций: правильно отображать себя на экране, уметь взаимодействовать с другими окнами и операционной системой, управлять размещенными на нем элементами управления, реагировать на разнообразные события. В среде разработки Delphi понятие окна приложения совмещено с понятием формы.

Формой называется окно приложения на этапе разработки. На этапе разработки окно должно обладать целым рядом ценных свойств, которые обеспечивают процесс программирования и обязаны исчезнуть при запуске приложения. Самые важные из них заключаются в том, что форма умеет взаимодействовать с инструментами среды разработки (Палитрой компонентов, Инспектором объектов и т. д.) и размещенными на ней компонентами. Первое из названных свойств обеспечивается возможностями, унаследованными от базового класса иерархии VCL TComponent. Второе свойство обеспечено механизмами самого класса формы. Кроме этого, форма обеспечивает еще целый ряд удобных и полезных для разработчика функций. Это разметка рабочей области, возможность выравнивания компонентов и т. д. Для хранения каждой формы проекта используются два файла. Файл с расширением dfm хранит описание свойств формы и размещенных на ней компонентов. Для хранения исходного кода класса формы и ее компонентов предназначен файл модуля с расширением раs.

Формы играют исключительно важную роль в процессе создания приложения. Они обеспечивают создание пользовательского интерфейса с одной стороны, и хранение программной логики приложения — с другой. Хотя форма и является потомком класса TComponent, она не присутствует в Палитре компонентов. Для создания новой формы проекта необходимо использовать команду File / New Form из главного меню среды.

С точки зрения исходного кода, любой размещенный на форме компонент представляет собой всего лишь новую переменную объектного типа, объявленную в классе формы. Это объявление осуществляется автоматически в момент размещения компонента на форме. В результате в модуле этой формы сразу же становятся доступными все свойства и методы этих компонентов. Форма, на которой находится компонент, становится его владельцем. Форма, как владелец размещенных на ней компонентов, позволяет эффективно управлять ими на этапе выполнения приложения. Для этого класс формы имеет ряд свойств и методов, которые позволяют получить доступ к любому компоненту. Например, программными средствами можно передавать фокус ввода от одного элемента управления другому; выполнять для всех компонентов или их любого подмножества заданную последовательность действий.

В зависимости от настроек свойств, формы в проекте могут играть разные роли. Форма может быть главной формой проекта. Для этого необходимо, чтобы форма в файле проекта создавалась первой. В этом случае она автоматически появляется при запуске приложения, а ее закрытие приводит к завершению работы всей программы, остальные формы в проекте являются дочерними. Дочерние формы равноправны между собой. Их можно запускать в модальном и в немодальном режиме. Форма в модальном режиме не позволяет передавать фокус управления элементам управления других форм приложения. Это можно сделать только после закрытия формы. Свободное переключение возможно между формами, работающими в немодальном режиме. Также формы в приложении различаются по стилю оформления. Это может быть классическое окно с заголовком, рамкой, системными меню и кнопками или диалог и т. д.

Методы-обработчики формы также играют важную роль при создании приложений. Практика программирования показывает, что практически в каждой форме имеются операции, которые необходимо выполнять при создании, открытии формы и ее закрытии и т. д.

3.2  Свойства класса TForm

Одним из предков класса TForm является класс TWinControl, поэтому все свойства этого класса наследуются формой. Приведем свойства, которые являются специфическими для формы.

Таблица 5Свойства TForm

Свойство

Назначение

FormStyle

перечислимое свойство, которое определяет тип окна

FsNormal

обычное окно

FsStayOnTop

окно, остающееся поверх других даже в неактивном состоянии

BorderIcons

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

biSystemMenu

для вызова системного меню

biMinimize

для сворачивания окна

biMaximize

для разворачивания окна

biHelp

для вызова помощи

BorderStyle

перечислимое свойство, которое задает тип границы окна

bsNone

Форма представляет собой прямоугольник без рамки, заголовка и системных кнопок в заголовке. Размеры такой формы нельзя изменить без специальных приемов

bsSingle

Стандартное окно без возможности изменения размеров. Набор системных кнопок зависит от свойства BorderIcons

bsSizeable

Значение по умолчанию. Стандартная форма с возможностью изменения размеров. Набор системных кнопок зависит от свойства BorderIcons

bsDialog

Обрамление стандартного диалогового окна. В наборе системных кнопок отсутствуют biSystemMenu, biMinimize и biMaximize

bsToolWindow

Обрамление панели инструментов. Идентично стилю bssingle, но с уменьшенной высотой заголовка и системными элементами

bsSizeToolWin

Обрамление панели инструментов. Идентично стилю bsSizeable, но с уменьшенной высотой заголовка и системными элементами

WindowState

Перечислимое свойство, определяющее состояние окна

wsNormal

нормальное состояние

wsMinimized

свернутое состояние

wsMaximized

развернутое состояние

Icon

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

Menu

свойство определяет текущее главное меню для формы

PopupMenu

свойство определяет текущее всплывающее меню для формы

Position

свойство задает размеры и положение формы на экране при работе приложения

poDesigned

Принять те значения положения и размеров, которые были определены во время разработки приложения

poDefault

Принять положение и размеры, определенные средой Windows по умолчанию

poDefaultPosOnly

Принять только положение, определенное средой Windows по умолчанию

poDefaultSizeOnly

Принять только размеры, определенные средой Windows пo умолчанию

poScreenCenter

Поместить окно по центру экрана. В случае наличия нескольких мониторов в системе, форма размещается в центре монитора по умолчанию

poDesktopCenter

Поместить окно по центру рабочего стола (в том числе составленного из нескольких мониторов)

poMainFormCenter

Поместить окно по центру главной формы приложения

poOwnerFormCenter

Поместить окно по центру формы владельца

HorzScrollBar

VertScrollBar

сложные свойства, определяющие внешний вид полос прокрутки (горизонтального и вертикального)

AutoScroll

автоматическое размещение полос прокрутки на форме

3.3  События формы

При создании и отображении формы происходят пять следующих событий

Таблица 6 Cобытия TForm при создании и отображении формы

Событие

Назначение

OnCreate

Возникает при создании окна, но до его появления на экране. Позволяет распределить ресурсы и провести необходимую инициализацию компонентов и форм.

OnShow

Возникает при появлении окна на экране. К этому времени все компоненты и формы созданы и инициализированы

OnResize

Возникает при изменении размеров окна

OnActivate

Возникает в момент активизации окна (при получении фокуса ввода)

OnPaint

Возникает при необходимости прорисовки окна

Событие OnCreate происходит один раз за все время существования формы, прочие события могут вызываться неоднократно. При закрытии и уничтожении формы также генерируются пять событий.

Таблица 7 Cобытия TForm при закрытии и уничтожении формы

Событие

Назначение

OnCloseQuery

Возникает перед закрытием окна, в ответ на действия, закрывающие окно. Обработчик получает логическую переменную CanClose, определяющую может ли форма быть закрыта.

OnClose

Возникает перед закрытием окна. Параметр Action уточняет необходимые действия: саNоnе – не закрывать окно; caHide – спрятать окно; caFree – уничтожить окно; caMimimize – минимизировать окно

OnDeactivate

Возникает при передаче активности другому окну той же программы

OnHide

Возникает перед исчезновением окна

OnDestroy

Возникает перед уничтожением окна. Обычно используется для освобождения ресурсов, выделенных в OnCreate.

Кроме этих событий, для формы определены события от мыши и клавиатуры, которые класс TForm наследует от своих предков.

3.4  Пример использования событий формы

Рассмотрим фрагмент кода, который восстанавливает размеры и положение формы (свойства Top, Left, Width, Height, Caption), сохраненные в файл при предыдущем закрытии. Для этого создадим обработчик события OnCreate, в котором необходимые свойства формы инициализируются значениями из файла.

procedure TForm1.FormCreate(Sender: TObject);

var f: TextFile;

begin

AssignFile(f, ‘myfile. txt’);

If FileExists(f) then

begin Readln(f, IntToStr(Top));

Readln(f, IntToStr(Left));

Readln(f, IntToStr(Width));

Readln(f, IntToStr(Height));

Readln(f, Caption);

end;

end;

При попытке закрытия формы, т. е. при генерации события OnCloseQuery, создается диалоговое окно для подтверждения закрытия окна.

procedure TForm1.FormCloseQuery(Sender: TObject;

var CanClose: Boolean);

begin

If MessageDlg('Exit now?', mtConfirmation, [mbYes, mbNo], 0) = mrYes

then CanClose:=True

else CanClose:=False;

end;

end;

В обработке события закрытия формы OnClose значения необходимых свойств записываются в файл.

procedure TForm1.FormClose(Sender: TObject;

var Action: TCloseAction);

var f: TextFile;

begin

AssignFile(f, ‘myfile. txt’);

WriteLn(f, IntToStr(Top));

WriteLn(f, IntToStr(Left));

WriteLn(f, IntToStr(Width));

WriteLn(f, IntToStr(Height));

WriteLn(f, Caption);

end;

3.5  Контрольные вопросы

1.  Какова роль формы в приложении?

2.  Какую форму называют главной? дочерней?

3.  В каком свойстве содержится заголовок формы?

4.  Назовите возможные значения свойства BorderStyle класса TForm. Поясните их смысл.

5.  Для чего используется свойство BorderIcons класса TForm?

6.  На что влияет свойство Formstyle класса TForm?

4.  Графические возможности визуальных компонентов

Большое внимание в Delphi уделено возможностям работы с деловой графикой: простота и удобство ее использования напрямую сказываются на простоте и удобстве созданных приложений. Вместо сложного графического интерфейса Windows разработчик имеет возможность использовать несколько графических инструментов для создания графических изображений. Такими инструментами являются шрифт, перо и кисть (классы TFont, TPen, TBrush), назначением которых является удобный доступ к свойствам инструментов и прозрачная для пользователя обработка всех их изменений.. Эти классы не используются самостоятельно, а являются составными частями класса TCanvas. Класс TCanvas входит в качестве свойства Canvas во многие визуальные компоненты, которые должны уметь нарисовать себя и отобразить какую-либо графическую информацию, при этом свойство Canvas определяет область, куда выводится графическая информация.

4.1  Свойства класса TCanvas

Основными свойствами класса TCanvas являются Font, Pen, Brush. Типы этих свойств – классы TFont, TPen, TBrush соответственно.

Класс TFont инкапсулирует шрифт Windows. В Delphi допускаются только горизонтально расположенные шрифты. В конструкторе объекта по умолчанию принимается шрифт System цвета clWindowText и размером 10 пунктов. Приведем некоторые свойства этого класса.

Таблица 8 Класс TFont

Свойство

Назначение

Name

Содержит имя (начертание) шрифта, например, Arial

Style

Содержит стиль (особенности начертания) шрифта

fsBold

жирный

fsItalic

курсив

fsUnderline

подчеркнутый

fsStrikeOut

перечеркнутый

Color

Определяет цвет шрифта

Charset

Содержит номер набора символов шрифта. По умолчанию равно 1 (default_charset). Для вывода символов кириллицы требуется RUSSIAN_CHARSET

Height

Содержит значение высоты шрифта в пикселах

Класс ТРеn инкапсулирует свойства пера стандартного графического интерфейса Windows. В конструкторе по умолчанию создается непрерывное (pssolid) черное перо шириной в один пиксел. Свойства этого класса приведены ниже.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5