Лекции Практические и лабораторные занятия Курсовая работа (проект) Самостоятельная работа студента




Скачать 1.86 Mb.
страница 2/7
Дата 11.10.2016
Размер 1.86 Mb.
1   2   3   4   5   6   7

Определение класса.


Все классы, используемые в Delphi (уже определенные в библиотеках объектов и создаваемые разработчиком для конкретного приложения), наследуются от класса TObject.
Формат описания нового класса выглядит следующим образом:

Type имя объявляемого класса> = class(имя родителя>)
private скрытые элементы класса>
protected защищенные элементы класса>
public общедоступные элементы класса>
published опубликованные элементы класса>
automated элементы, реализующие OLE-механизм>
end;

Имя родителя указывать не обязательно, по умолчанию считается, что, если имя родителя не указано, то класс непосредственно наследуется от TObject.


Внутри описания класса выделяется до пяти секций.
Секция private содержит внутренние элементы, обращение к которым возможны только в пределах модуля (а не класса, как в С++), содержащего объявление класса.
Секция protected содержит защищенные элементы, которые доступны в пределах модуля, содержащего объявление класса, и внутри потомков класса.
Секция public содержит общедоступные элементы, к которым возможно обращение из любой части программы.
Секция published содержит опубликованные элементы, которые по ограничению доступа аналогичны public. Для визуальных компонент, вынесенных на панель компонент, информация об элементах, размещенных в этой секции, становится доступной через Инспектор Объектов.
Секция automated содержит элементы, доступ к которым также выполняется аналогично public. Но для элементов, описанных в этой секции генерируется дополнительная информация, используемая OLE. Секцию имеет смысл объявлять для потомков класса TAutoObject.

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

Типы методов

Методы объекта могут быть описаны как статические (static), виртуальные (virtual), динамические (dynamic) или как методы обработки сообщения (message), для чего к ним добавляются соответствующие директивы.



Статические методы. Статические методы работают подобно обычным процедурам или функциям. Этот тип методов устанавливается по умолчанию. Адрес такого метода известен уже на стадии компиляции, и компилятор в коде программы оформляет все вызовы данного метода как статические. Такие методы работают быстрее других, однако не могут быть перегружены в целях полиморфизма объектов.

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

Динамические методы. Динамические методы в целом подобны виртуальным методам, но обслуживаются другой диспетчерской системой. Каждому динамическому методу компилятор назначает уникальное число и использует его вместе с адресом метода для построения таблицы динамических методов (DMT- Dynamic Method Table), В отличие от VMT, DMT содержит методы лишь данного объекта, благодаря чему обеспечивается экономия используемой памяти, но замедляется вызов метода, поскольку для поиска его адреса, скорее всего, будет пересмотрена не одна DMT в иерархии объектов.

Методы обработки сообщения. Методы обработки сообщений предназначены аля обработки приходящих сообщений, с помощью которых происходит обмен информацией в операционной системе Windows. Значение после ключевого слова message определяет сообщение, в ответ на которое вызывается данный метод. Такие методы создаются для реакции на те или иные сообщения Windows.

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

  1. От какого класса наследуются все классы, используемые в Delphi

  2. Формат описания нового класса

  3. Сколько и какие секций выделяется внутри описания класса

  4. Что представляют собой методы

Лекция 12

Тема: Объектная модель Delphi Pascal. Свойства. Простые свойства. Свойства – массивы. Индексированные свойства. Метаклассы. Ссылка на класс (метакласс). Операции is и as. Методы класса.

Цель: познакомить со свойствами, метаклассами, познакомить со свойствами-массивами

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

Объявление массива

Массив, как и любая переменная программы, перед использованием должен быть объявлен в разделе объявления переменных. В общем виде инструкция объявления массива выгладит следующим образом: Имя: [нижний_индекс..верхний_индекс] of тип

 где:


  • имя — имя массива;

  • array — зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива;

  • нижний_индекс и верхний_индекс — целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива;

  • тип — тип элементов массива.

  • Memol.Lines[0] := 'Строка';

Свойства-массивы имеют перечисленные ниже особенности.

  • Свойства-массивы объявляются с указанием одного или нескольких индексных параметров. Тип индексов должен быть целым или строковым (в отличие от обычных массивов, свойства-массивы могут индексироваться строками).

  • Доступ к значению свойства-массива может быть только косвенным (через методы SetXXXX/GetXXXX).

  • Если в определении свойства-массива используется несколько индексов (многомерные свойства-массивы), методы доступа должны содержать параметры для каждого индекса в том же порядке, что и в объявлении свойства.

  • Свойства-массивы нельзя объявлять в секции published. Доступ к значениям свойства-массива на этапе конструирования возможен только с помощью специализированного редактора свойств.

Метаклассы. Ссылки на классы

Язык Object Pascal позволяет рассматривать классы как своего рода объекты, которыми можно манипулировать в программе. Такая возможность рождает новое понятие — класс класса; его принято обозначать термином метакласс.

Для поддержки метаклассов введен специальный тип данных — ссылка на класс (class reference). Он описывается с помощью словосочетания class of, например:


Code:

type

TResourceGaugeClass = class of TResourceGauge;



 Переменная типа TResourceGaugeClass объявляется в программе обычным образом:

Code:

var

ClassRef: TResourceGaugeClass;



 Значениями переменной ClassRef могут быть класс TResourceGauge и все порожденные от него классы. Допустимы, например, следующие операторы:

Code:

ClassRef := TResourceGauge;

ClassRef := TDiskGauge;

ClassRef := TMemoryGauge;


 По аналогии с тем, как для всех классов существует общий предок TObject, у ссылок на классы существует базовый тип TCIass:

Code:

type TCIass = class of TObject;

 

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



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

  1. Что такое массив?

  2. Как объявить массив?

  3. Какие особенности имеют свойства-массивы?

Лекция 13

Тема: Объектная модель Delphi Pascal. Механизм определения типов на этапе выполнения программы. Делегирование методов. Библиотека стандартных классов Delphi. Отношения «основной - вспомогательный» и «старший - младший».

Цель: познакомить с библиотекой стандартных классов Delphi

Помимо наследования и перекрытия методов родителя Delphi дает еще одну возможность модифицировать поведение того или иного объекта. Речь идет о делегировании метода одного объекта другому.

Для этого в класс, которому делегируется метод, вставляется поле процедурного типа с обязательным упоминанием, что делегируемый метод должен быть методом класса, с помощью зарезервированных слов of object:

type


TNotifyEvent = procedure(Sender: TObject); TMyClass = class

FaEvent: TNotifyEvent of object;

end;

TAnotherClass - class



procedure MyEvent(Sender: TObject);

end;


Теперь экземпляр класса TAnotherClass может делегировать свою процедуру MyEvent объекту класса TMyClass:

var


FMyClass: TMyClass; FAnotherClass: TAnotherClass; begin

FMyClass TMyClass.Create; FAnotherClass := TAnotherClass.Create; FMyClass.FaEvent := FAnotherClass.MyEvent;

end;

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



Библиотека стандартных классов Delphi VCL содержит сотни классов, на базе которых разработчик может создавать собственные приложения Windows.

На рисунке ниже показана иерархия основных базовых классов библиотеки VCL, на базе которых созданы все остальные классы Delphi.




Рис. Иерархия классов основных компонент библиотеки VCL

Как уже упоминалось ранее, все компоненты библиотеки наследуются от класса TObject, который содержит целый ряд специальных методов существенно снижающих сложность программирования в Delphi:

type TObject = class
constructor Create; {конструктор}
destructor Destroy; virtual; {деструктор}
procedure Free; {уничтожить, если элемент был создан}
class Function InitInstance(Instance: Pointer): TObject; {инициализирует память при создании объекта}
class Function NewInstance: TObject; virtual; {выделяет пямять для размещения объекта}
Procedure CleanupInstance; {осуществляет корректное завершение работы со строками и другими сложными структурами при уничтожении объекта}
Procedure FreeInstance; virtual; {освобождает память, выделенную под размещение объекта}
Function ClassType: TClass;{возвращает класс объекта}
class Function ClassName: ShortString; {возвращает имя класса}
class Function ClassNameIs(const Name: string): Boolean; {проверяет принадлежность объекта указанному классу}
class Function ClassParent: TClass;{возвращает тип предка}
class Function ClassInfo: Pointer;{возвращает указатель на таблицу RTTI}
class Function InstanceSize: Longint;{возвращает размер объекта в байтах}
class Function InheritsFrom(AClass: TClass): Boolean;{проверяет принадлежность класса или объекта семейству указанного класса}
Procedure Dispatch(var Message);{посылает сообщение объекту}
class Function MethodAddress(const Name: ShortString): Pointer; {возвращает адрес опубликованного метода по имени}
class Function MethodName(Address: Pointer): ShortString;
{возвращает имя опубликованного метода по его адресу}
Function FieldAddress(const Name: ShortString): Pointer;
{возвращает адрес опубликованного поля по его имени}
Function GetInterface(const IID: TGUID; out Obj): Boolean; {проверяет соответствие указанного интерфейса класс}
class Function GetInterfaceEntry(const IID: TGUID):
PInterfaceEntry; {возвращает указатель на структуру, содержащую описание специального интерфейса класса}
class Function GetInterfaceTable: PInterfaceTable; {возвращает указатель на структуру, содержащую описание интерфейса для класса}
Function SafeCallException(ExceptObject: TObject;
ExceptAddr: Pointer): Integer; virtual; {метод поддержки исключение OLE}
Procedure DefaultHandler(var Message); virtual;{выполняет обработку сообщения по умолчанию}
end;

От класса TObject наследуется родоначальник всех классов, которые могут иметь секцию published - класс TPersistent. Этот класс обеспечивает корректную работу Инспектора Объектов с опубликованными свойствами (сохранение их в файлах формы, инициализацию опубликованных свойств при компиляции программы и копирование полей одного объекта в другой).

От класса TPersistent наследуются классы TComponent (компоненты) - родоначальник всех классов-компонент и некоторые другие вспомогательные классы, например: TStrings (строки), TCollection (коллекции), TCanvas («холсты» - поля, на которых можно «рисовать»), TGraphicObject (графические объекты), TGraphic (графические элементы), TPicture (изображения).

От класса TComponent наследуются все компоненты приложения, в том числе и само приложение (класс TApplication). Особенность потомков класса TComponent заключается в том, что объекты-компоненты могут находиться между собой в отношении «основной – вспомогательный».

Основной компонент отвечает за управление памятью при размещении вспомогательных компонентов: выделение памяти при создании компонента и освобождение памяти при его уничтожении. Для всех компонент, размещенных в форме (TForm) основным компонентом является форма, а для самой формы основным компонентом является приложение (TApplication).

Реализация отношения «основной – вспомогательный» в класса TComponent осуществляется с использованием следующих свойств:



  1. свойство Owner, которое должно содержать указатель на основной компонент для текущего компонента (оно инициализируется автоматически при помещении компонента в форму);

  2. свойство ComponentIndex - содержит номер текущего компонента в массиве Components (начиная с 0) основного компонента; определяет порядок создания и изображения вспомогательных компонентов;

  3. свойство Components[Index] - свойство-массив типа TComponent, содержит указатели на все вспомогательные компоненты текущего компонента;

  4. свойство ComponentCount - содержит количество вспомогательных компонент текущего компонента.

Таким образом, при необходимости можно просмотреть свойство-массив Components размером ComponentCount и найти нужные вспомогательные компоненты.

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

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

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

От класса TControl наследуются классы TWinControl - оконные элементы управления и TGraphicControl - графические элементы управления.

Оконные элементы управления имеют собственную функцию окна и, соответственно, могут получать сообщения Windows (TEdit, TMemo, TListBox), в том числе сообщения от клавиатуры, т.е. могут получать фокус ввода. Соответственно, класс TWinControl включает методы обработки сообщений клавиатуры, которые формируют события клавиатуры.

Графические элементы управления порождаются от TGraphicControl и не могут обрабатывать ввод с клавиатуры (TLabel, TImage, TBevel). Они в основном используются для отображения информации.

Класс TWinControl устанавливает между оконными элементами управления отношение «старший – младший». Это отношение определяет подчиненность изображений оконных элементов управления на экране. Например, если форма становится невидимой, то невидимыми становятся все ее младшие элементы управления (метки, кнопки и т.д.).



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

  1. Что представляет собой делегирование

  2. Для чего используется делегирование

  3. Что содержится библиотека стандартных классов Delphi VCL

Лекция 14

Тема: Создание и обработка сообщений и событий. Сообщения Delphi. Методы обработки сообщений. Генерация сообщений. Создание событий. Обработка сообщений VCL. Управление циклом обработки сообщений.

Цель: познакомить с методами обработки сообщений

Стандартная библиотека классов Delphi VCL предлагает разработчику достаточно большой набор сообщений и методов их разработки. Однако он имеет возможность добавить новое сообщение или переопределить методы обработки существующих сообщений.


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

  1. описать тип сообщения;

  2. объявить номер (или индекс) сообщения;

  3. объявить метод обработки нового сообщения в классе, который должен его обрабатывать;

  4. инициализировать (передать) сообщение.

Сообщения 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.

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


  1. Какие действия нужно выполнить для создания нового сообщения

  2. Для чего используется номер (или индекс) сообщения для идентификации

Лекция 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 отличается от первой тем, что данному исключению можно временно присвоить имя и обращаться к свойствам исключения. Обращаться к свойствам исключения можно с помощью конструкции .. Посмотрим

try
ScrollBarl.Max := ScrollBarl.Min - 1;
except
on E: EInvalidOperation do
MessageDlg( 'Игнорируем исключение: '- + E.Message, mtlnformation, [mbOK], O)
end;

В приведенном примере мы присваиваем исключению EInvalidOperation временное имя Е. Затем в окне сообщения выводим текст ошибки E.Message, выдаваемый Delphi по умолчанию (если бы не было нашего обработчика ошибки).

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

try
{ операторы }


except
on do
begin
{операторы обработки исключения}
raise; // Регенерация исключения
end;
end;

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


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

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

  1. Что понимают под исключительной ситуацией


  1. ПРАКТИЧЕСКИЕ И ЛАБОРАТОРНЫЕ ЗАНЯТИЯ

Лабораторная работа №1

Тема: Язык программирования Delphi. Этапы разработки программы.

Цель: Сформировать практические навыки: реализация линейных процессов обработки данных с помощью оператора присваивания Object Pascal; построение однооконных интерфейсов с помощью визуального компонента «окно» (класс TForm) и визуальных компонентов панели инструментов Standard: «метка» (класс TLabel), «редактор» (класс TEdit), «кнопка» (класс TButton).
1   2   3   4   5   6   7


База данных защищена авторским правом ©infoeto.ru 2022
обратиться к администрации
Как написать курсовую работу | Как написать хороший реферат
    Главная страница