От класса TObject наследуется родоначальник всех классов, которые могут иметь секцию published - класс TPersistent. Этот класс обеспечивает корректную работу Инспектора Объектов с опубликованными свойствами (сохранение их в файлах формы, инициализацию опубликованных свойств при компиляции программы и копирование полей одного объекта в другой).
От класса TPersistent наследуются классы TComponent (компоненты) - родоначальник всех классов-компонент и некоторые другие вспомогательные классы, например: TStrings (строки), TCollection (коллекции), TCanvas («холсты» - поля, на которых можно «рисовать»), TGraphicObject (графические объекты), TGraphic (графические элементы), TPicture (изображения).
От класса TComponent наследуются все компоненты приложения, в том числе и само приложение (класс TApplication). Особенность потомков класса TComponent заключается в том, что объекты-компоненты могут находиться между собой в отношении «основной – вспомогательный».
Основной компонент отвечает за управление памятью при размещении вспомогательных компонентов: выделение памяти при создании компонента и освобождение памяти при его уничтожении. Для всех компонент, размещенных в форме (TForm) основным компонентом является форма, а для самой формы основным компонентом является приложение (TApplication).
Реализация отношения «основной – вспомогательный» в класса TComponent осуществляется с использованием следующих свойств:
свойство Owner, которое должно содержать указатель на основной компонент для текущего компонента (оно инициализируется автоматически при помещении компонента в форму); свойство ComponentIndex - содержит номер текущего компонента в массиве Components (начиная с 0) основного компонента; определяет порядок создания и изображения вспомогательных компонентов; свойство Components[Index] - свойство-массив типа TComponent, содержит указатели на все вспомогательные компоненты текущего компонента; свойство ComponentCount - содержит количество вспомогательных компонент текущего компонента.Таким образом, при необходимости можно просмотреть свойство-массив Components размером ComponentCount и найти нужные вспомогательные компоненты.
Особое место среди потомков TComponent занимает класс TControl, от которого наследуются все элементы управления, размещаемые в окне формы. Соответственно, этот класс содержит свойства, определяющие расположение элементов управления относительно формы на экране.
Считается, что любой элемент управления занимает прямоугольник внутри окна формы. Положение этого прямоугольника определяется относительно окна формы координатами верхнего левого и нижнего правого углов.
Класс TControl определяет методы, обрабатывающие сообщения мыши и обеспечивающие генерацию соответствующих событий (обычное, двойное нажатие, движение с нажатыми клавишами и т. п.).
От класса TControl наследуются классы TWinControl - оконные элементы управления и TGraphicControl - графические элементы управления.
Оконные элементы управления имеют собственную функцию окна и, соответственно, могут получать сообщения Windows (TEdit, TMemo, TListBox), в том числе сообщения от клавиатуры, т. е. могут получать фокус ввода. Соответственно, класс TWinControl включает методы обработки сообщений клавиатуры, которые формируют события клавиатуры.
Графические элементы управления порождаются от TGraphicControl и не могут обрабатывать ввод с клавиатуры (TLabel, TImage, TBevel). Они в основном используются для отображения информации.
Класс TWinControl устанавливает между оконными элементами управления отношение «старший – младший». Это отношение определяет подчиненность изображений оконных элементов управления на экране. Например, если форма становится невидимой, то невидимыми становятся все ее младшие элементы управления (метки, кнопки и т. д.).
Контрольные вопросы
Что представляет собой делегирование Для чего используется делегирование Что содержится библиотека стандартных классов Delphi VCLЛекция 14
Тема: Создание и обработка сообщений и событий. Сообщения Delphi. Методы обработки сообщений. Генерация сообщений. Создание событий. Обработка сообщений VCL. Управление циклом обработки сообщений.
Цель: познакомить с методами обработки сообщений
Стандартная библиотека классов Delphi VCL предлагает разработчику достаточно большой набор сообщений и методов их разработки. Однако он имеет возможность добавить новое сообщение или переопределить методы обработки существующих сообщений.
При создании нового сообщения необходимо выполнить следующие действия:
Сообщения Delphi. В Delphi определено около 100 стандартных типов сообщений. В соответствии с правилами Windows сообщение состоит из нескольких полей. Первое поле обычно называется Msg. Оно должно содержать индекс сообщения - 16 разрядное целое положительное число (тип Cardinal). Далее следуют поля, содержащие передаваемые значения. Последние поля обычно используются для записи результата обработки сообщения. Они могут отсутствовать.
Например, основной тип сообщений, используемых в Delphi, определяется следующим образом:
Type TMessage=record
Msg:Cardinal;
case Integer of
0: (WParam:LongInt; LParam:LongInt; Result:LongInt);
1: (WParamLo:Word; WParamHi:Word;
LParamLo:Word; LParamHi:Word;
ResultLo:Word; ResultHi:Word);
end;
end;
Номер сообщения. Номер (или индекс) сообщения используется для идентификации сообщения в системе: он определяет вид события, о котором система уведомляет приложение (нажатие клавиш, нажатие кнопок мыши и т. д.).
При создании собственных сообщений следует учитывать, что номера с 0 до $399 зарезервированы за системой. Первый свободный номер обозначен константой WM_USER = $400, относительно которой обычно и определяются номера пользовательских сообщений:
Const Mes1 = WM_USER;
Mes2 = WM_USER+1;
Методы обработки сообщений. Класс, объекты которого должны принимать и обрабатывать некоторые сообщения, должен включать специальные методы обработки этих сообщений. При разработке этих методов необходимо учитывать специальные правила, существующие в Delphi.
Метод обработки сообщения по умолчанию является динамическим, причем спецификаторы dinamic или override при его описании опускаются:
Procedure wm<имя метода>(var Message:<тип сообщения>);
message <номер сообщения>;
Имена методов обработки некоторого сообщения, переопределяемых в иерархии классов, могут не совпадать: переопределяемый метод идентифицируется по совпадающему номеру сообщения, указываемому после специальной директивы message. Номер сообщения обычно задается в виде символического имени, но может указываться и целой положительной константой.
Добавление метода обработки сообщений к классу выполняется так же, как и любого другого метода:
type <имя класса>= class <имя класса-родителя>
public
Procedure wm<имя метода>(var Message:<тип сообщения>);
message <номер сообщения>;
. . .
end.
Контрольные вопросы
Какие действия нужно выполнить для создания нового сообщения Для чего используется номер (или индекс) сообщения для идентификацииЛекция 15
Тема: Обработка исключений. Структура фрагментов с исключениями. Создание исключений. Генерация исключений. Обработка исключений.
Цель: знать понятие исключительной ситуации, ее обработку средствами Delphi
Под исключительной ситуацией мы будем понимать некое непредвиденное событие, способное повлиять на дальнейшее выполнение программы.
При обработке такой ситуации Delphi, как обычно, работает с объектами. С точки зрения компилятора Delphi исключительная ситуация - это объект. Для работы с этим специфичным объектом в Delphi (точнее, в Object Pascal) были введены следующие языковые конструкции:
ry.. except и try.. finally.
Рассмотрим эти языковые конструкции более подробно.
Итак, конструкция try.. except имеет следующий синтаксис:
try
{исполняемый код};
except
on Exceptionl do {код, исполняемый в случае возникновения ошибки 1};
on Exception2 do {код, исполняемый в случае возникновения ошибки 2};
else
{код, обработчик всех не перехваченных ранее ошибок};
end;
Если при выполнении кода, размещенного в разделе try, генерируется исключение, то выполнение этого раздела прекращается и управление передается коду, размещенному в разделе except. Раздел except может использоваться двумя способами. Во-первых, в нем могут располагаться любые операторы, кроме обработчиков исключений, начинающихся с приставки on. Это и операторы сообщения об ошибке, и команды, позволяющие освобождать системные ресурсы, а также другие операторы и команды. Во-вторых, раздел except используется для обработки исключений. В этом случае в него могут включаться только операторы обработки исключений. Если среди обработчиков встретился обработчик, соответствующий сгенерированному исключению, то выполняется оператор этого обработчика, исключение разрушается и управление передается коду, расположенному после оператора on Exception do. Раздел, расположенный после ключевого слова else, служит для обработки любых исключений, не описанных в разделе except. Этот раздел не является обязательным. Если при обработке исключительной ситуации не будет найден подходящий обработчик, то произойдет обработка системным обработчиком исключений.
Рассмотрим простой пример обработки исключительной ситуации деления на ноль :
try
а:=10;
b:=0;
c:=a/b;
except
on EZeroDivide do MessageBox('Делить на ноль нельзя!');
end;
Итак, как можно видеть из приведенного выше примера, для обработки разных исключений служат разные операторы. Рассмотрим более подробно оператор обработки on.. do. Данный оператор находится внутри раздела except и может иметь две формы:
on <класс исключения> do <оператор>;
или
on <имя>: <класс исключения>
do <операторы, в которых можно использовать свойства исключения>
Этот оператор обрабатывает только тот класс исключений, который в нем указан. При указании родительского (базового) класса, все классы исключений - потомки данного класса - также будут обработаны. Для обработки всех исключений можно обратиться к базовому классу всех исключений: Exception. После обработки исключения оно разрушается. Вторая форма оператора on.. do отличается от первой тем, что данному исключению можно временно присвоить имя и обращаться к свойствам исключения. Обращаться к свойствам исключения можно с помощью конструкции <имя>.<имя свойства>. Посмотрим
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |


