Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
65
Добавлен:
10.12.2013
Размер:
166.21 Кб
Скачать

События

Событие — это специальное свойство, являющееся указателем функции. Тип обобщенного указателя на функцию, которой передается один параметр типа ТОЬject (обычно Self — данный объект), — TNotifyEvent. Подобный тип используется в Delphi для событий типа OnClick и многих других, которые передают в обработ­чик только один параметр — Sender: TObject. Если требуется ввести в класс подоб­ное событие, достаточно определить в объявлении класса соответствующее поле и метод работы с ним. Например:

private

FMyEvent: TNotifyEvent;

published

property MyEvent: TNotifyEvent read FMyEvent write FMyEvent;

При возникновении события надо про­верять функцией assigned, которая возвращает true, имеется ли обработчик пользователя, и, если имеется, то вызвать его. Для этого можно использовать оператор вида:

ifassigned(FMyEvent)thenOnMyEvent(Self);

Функция OnMyEvent, которая вызывается этим оператором, это и есть обра­ботчик пользователя. Его имя совпадает с именем свойства, перед которым добав­ляется префикс «On».

Место, куда надо включать подобный оператор, зависит от вида события. Если событие вызывается каким-то из ваших методов, то вызов обработчика пользовате­ля надо осуществлять из этого метода. Если событие связано с какими-то сообщениями, поступающими от других приложений или от Windows, то надо предусмот­реть обработчик соответствующего сообщения и из него вызывать обработчик пользователя.

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

Обработчики сообщений.

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

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

Познакомимся с основными из них на примере обработчиков TEdit:

• OnChange - программа реагирует на изменение значений компоненты (например, на каждое вводимое значение)

• OnClick - программа реагирует на нажатие клавиши мыши на эту компоненту.

• OnDoubleClick (DblClick) - двойное нажатие клавиши мыши.

• OnKeyPress - программа реагирует на нажатие клавиши клавиатуры.

ВОПР 6

    Подобно фундаменту здания, форма представляет собой фундамент программы, на котором строится все остальное. Форма — это место, где пользователь общается с программой. Приложение может иметь несколько форм, каждая из которых выполняет свое особое предназначение.     Delphi инкапсулирует концепцию форм в класс TForm, и каждая форма, создаваемая с помощью конструктора форм (Form Designer), наследует основные свойства, методы и события этого класса.

Свойства TForm     Класс TForm предоставляет возможность изменять его поведение и внешний вид формы с помощью ряда свойств.

Свойство Activeопределяет, имеет ли форма фокус ввода. Если имеет, оно возвращает True, если нет False. Windows выводит заголовок активной формы цветом, отличающимся от цвета неактивных.

Может быть активной только однаформа.

    Свойство Borderlcons представляет собой набор логических значений, использующийся для определения набора пиктограмм в заголовке формы.     Значения biMinimize и biMaximize создают пиктограммы, которые позволяют свернуть и развернуть форму с помощью мыши.

Значение biHelp выводит кнопку с вопросительным знаком. Щелчок на ней вызывает контекстно-зависимую справку, которая выводится, как текст подсказки Hint, т.е. без вызова Windows Help.

Height и Width   Эти свойства определяют высоту и ширину формы в пикселях и обычно используются для изменения размеров формы во время работы на дисплеях разной разрешающей способности. Вот пример увеличения размеров формы до размеров всего экрана.

    {Перемещаем форму в верхний левый угол экрана.}     Left:= 0;     Тор:= 0;     (Изменяем размеры формы.)     Width:= Screen.Width;     Height:= Screen.Height;       (Класс TScreen, о котором будет сказано ниже, и его экземпляр Screen предоставляют доступ к информации о размерах всего экрана.)  

KeyPreview     Объект TForm наследует от класса TWinControl обработку событий OnKeyDown, OnKeyUp и OnKeyPress, и свойство KeyPreview определяет ситуации, в которых эти сообщения запускаются. Если значение KeyPreview равно False, события клавиатуры пересылаются только тому управляющему элементу, который имеет фокус ввода. В неординарном случае, когда в форме нет управляющих элементов, событие передается форме. Если же значение свойства установлено равным True, событие сначала пересылается форме, а затем — управляющему элементу, имеющему фокус ввода.

    Обычно свойство используется KeyPreview для обработки функциональных клавиш, которые должны быть переданы форме независимо от текущего активного элемента.     Без этого свойства обработка функциональных клавиш сводится к написанию для каждого элемента дополнительного обработчика, который должен отслеживать нажатие функциональных клавиш. Более элегантным является использование разделяемого обработчика событий, так что лучше всего применять свойство KeyPressed.     При этом все нажатия клавиш отсылаются обработчикам событий OnKeyDown, OnKeyUp и OnKeyPress автоматически и для "отлова" функциональной клавиши надо написать только один обработчик события OnKeyDown формы. Вот пример закрытия формы при нажатии клавиши <F2.       procedure TFormI.FormKeyDown(Sender: TObject; var Key: Word;                                                             Shift: TShiftState):             begin                 {Проверить, нажата ли клавиша <F2.}                 if Key = VK_F2 then                     {Закрыть форму.}                     Close;             end;

    Position — это свойство перечислимого типа, определяющее размещение формы при запуске приложения. Значение по умолчанию (poDesigned) заставляет форму выводиться в месте, определенном при разработке приложения. Положение и размер формы при этом берутся из свойств Left, Top, Height и Width. Поскольку вы не можете знать заранее, в какой системе будет запущено ваше приложение, может оказаться, что на мониторе с низким разрешением при использовании этого значения свойства будет видна только часть формы.        Хотя свойство Position позволяет определить, каким образом будет выводиться форма, профессионально сделанные приложения сами запоминают свое расположение на экране и при следующем запуске выводятся в той же позиции и с тем же размером. Обычно сохранение позиции и размеров экрана выполняется в самый последний момент — при уничтожении формы.

События TForm     Класс ТForm добавляет несколько событий к родительскому классу TWinControl. Эти события позволяют изменять поведение формы путем выполнения загрузки и сохранения информации о состоянии формы или распределения и освобождения дополнительных ресурсов.     Когда форма создается и отображается, происходит пять следующих событий.

        1. OnCreate запускается при создании формы и позволяет распределять ресурсы и инициализировать форму.         2. OnShow происходит непосредственно перед выводом формы на экран. К этому времени все элементы управления и компоненты созданы и инициализированы.

        3. OnResize генерируется при изменении размера формы во время выполнения приложения. Обычно здесь помещается код для изменения размера и положения на экране элементов управления, не поддерживающих свойство Align. Событие OnResize также однократно генерируется при создании формы, когда Delphi устанавливает начальные размеры формы.

        4. OnActivate происходит при получении формой фокуса ввода. OnActivate вызывается только при переходе фокуса ввода от одной формы к другой в пределах одного приложения. При переключении между приложениями Delphi генерирует событие OnActivate глобального объекта Application.         5. OnPaint запускается, когда необходимо перерисовать форму. Это может происходить, когда форма только что стала видимой, при частичном удалении перекрывающих ее элементов или увеличении размеров. Событие полезно, если вы перерисовываете какую-то часть формы самостоятельно.

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

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

    procedure TFormI.FormCloseQuery(Sender: TObject;         var CanClose: Boolean);     begin         CanClose:= MessageDIg('Close form?', mtConfirmation,                             [mbYes,mbNo], 0) = mrYes;     end;

        2. OnClose генерируется непосредственно перед закрытием формы. Обычно оно используется для изменения стандартного поведения формы при закрытии. Для этого Delphi передает в обработчик события переменную Action, которая может принимать одно из четырех значений: caHide, caMinimize, caNone или caFree. По умолчанию для не MDI-форм используется caHide, скрывающее форму. Для дочерних MDI-форм значение по умолчанию, сворачивающее форму, равно caMinimize. Если Action установлено равным caNone, закрытия не происходит. caFree заставляет Delphi закрыть форму и освободить всю связанную с ней память. Если после этого сослаться на объект формы, произойдет исключительная ситуация.

        3. OnDeActivate происходит при потере формой фокуса ввода. Запуск происходит по тем же правилам, что и запуск события OnActivate.         4. OnHide запускается непосредственно перед тем, как форма станет невидимой.

        5. OnDestroy генерируется непосредственно перед уничтожением формы. Обычно оно используется для освобождения ресурсов, выделенных в OnCreate.

ВОПР 7

TControl – абстрактный базовый класс всех визуальных компонентов. Наследником является классTWinControl.

TWinControl – абстрактный класс для всех средств управления окнами.

TWinControl имеет следующее уникальное свойство:

Handle– выдает элемент, который нужен для связи с соответствующими структурами Windows.

Уникальный обработчик класса TWinControl:

  • OnSetFocus – действие, когда компонент получил фокус ввода.

Прямым наследником этого класса является класс TGraphicControl.

TGraphicControl – базовый класс всех неоконных средств управления, является наследником TWinControl.

TGraphicControl имеет следующее уникальное свойство:

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

Примерами TGraphicControl являются TLable, TImage –описанные выше.

TLable – текст без возможности редактирования (метка). Элемент этого типа обычно используется, когда необходимо отобразить текст, который не может быть отредактирован пользователем, например заголовки компонентов, не имеющих собственного свойстваCaption, однако для большинства средства управления, Caption является заголовоком окна

Наследники класса TControl образуют всю палитру видимых компонентов Delphi. Терминологически они называются элементами управления, так как на их основе прежде всего реализуются управляющие элементы Windows - кнопки, переключатели, списки и т. п. В тексте книги я часто буду употреблять слова компонент и элемент как синонимы.

. Класс TControl определяет свойство Parent, которое содержит ссылку на родительский компонент:

property Parent: TWinControl;

Это свойство не следует путать с собственником Owner: Owner создал компонент (не обязательно - видимый), a Parent управляет видимым компонентом. Поскольку кон­структор TComponent.Create не изменяет свойства Parent (в родительском классе TCornponent такого свойства нет), при создании видимых компонентов на этапе про­гона программы это свойство необходимо изменять программно. Например, следую­щий обработчик события OnCreate формы Forml вставит надпись Дочерний эле­мент в левый верхний угол формы:

procedure TForml.FormCreate(Sender: TObject);

var IbLabel: TLabel;

begin

IbLabel := TLabel.Create (Self); IbLabel. Parent := Self;

IbLabel.Caption := 'Дочерний элемент'; end;

Если убрать оператор

IbLabel.Parent := Self;

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

Соседние файлы в папке Экзамен