Смекни!
smekni.com

Учебно-методическое пособие для студентов физико-математических специальностей вузов Балашов (стр. 16 из 18)

begin

with StringGrid1 do

begin

ColCount:=SpinEdit1.Value+1;

RowCount:=SpinEdit2.Value+1;

for i :=1 to ColCount do

for j:=1 to RowCount do

Try {Начало блока}

a:=Random(10);

Cells[i,j]:=FloatToStr(1/a);

except

On EZeroDivide do ShowMessage('Деление на ноль в ячейке '+IntToStr(i)+’,’ +IntToStr(j)); {Проверка класса ошибки}

end;

end;

end;

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

On EObject:Expecrion do ………….

Для стандартных классов такой прием позволяет использовать единственное строковое свойство Message, со стандартным сообщением об ошибке, которое получают все наследники класса Exception.

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

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

function HexStrToInt(s:string):integer;

function hex(c:char):integer ;

begin

case c of

'0'..'9':Result:=ord(c)-ord('0');

'A'..'F':Result:=ord(c)-ord('A')+10;

end;

end;

Var i:integer;

begin

result:=0;

if s[1]='$' then delete(s,1,1);

For i:=1 to length(s) do

Result:=result*16+hex(s[i]);

end;

Функция hex на основании символа возвращает число. Если данный символ является цифрой или латинской буквой от A до F, то возвращаемое число будет истинно, однако если это не так, то результат будет просчитан неправильно. Следовательно, в операторе case необходимо учесть ветвь иначе, где должна вызываться исключительная ситуацию. Тогда функция hex будет иметь вид:

function hex(c:char):integer ;

begin

case c of

'0'..'9':Result:=ord(c)-ord('0');

'A'..'F':Result:=ord(c)-ord('A')+10;

else

raise EConvertError.Creat

(‘Недопустимое представление шестнадцатеричного числа ’);

end;

end;

В данном примере оператор raise инициализирует событие EConvertError, которое возникает при ошибке комвертации и в качестве параметра передает необходимое сообщение.

Задания:

1. Проверьте все программы из данной лабораторной работы.

2. Создайте текстовый редактор, который корректно работает при попытке открыть отсутствующий файл.

Лабораторная работа 11. Классы

Цель: Научиться создавать простейшие программы на языке программирования Delphi.

Классами в Object Раsса1 называются специальные типы, которые
содержат поля, методы и свойства. Как и любой другой тип, класс служит лишь образцом для создания конкретных экземпляров реализации, которые называются объектами. В предшественнике — Тиrbо Раsсal объектами называются типы, имеющие много общего с классами Object Раsса1. Однако существенные усовершенствования, внесенные в объектную модель Object Раsса1, заставили разработчиков языка ввести для обозначения объектов специальный термин — класс, заимствованный из Си++. Для совместимости с ранее разработанными программами системы Turbo Раsса1 7.0 в I Раsса1 сохранен тип-объект Object, поддерживающий «старую» объектную модель. Поскольку все возможности этой модели доступны классам, «Освободившийся» термин объект будут употреблять исключительно для обозначения конкретного экземпляра реализации класса.

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

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

Более подробно остановимся на понятии свойства.

Свойство — это специальный механизм классов, регулирующий доступ к полям. Свойства объявляются с помощью зарезервированных слов property, read и write (слова read и write считаются зарезервированными только в контексте объявления свойства). Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него. Например:

Type TaClass= class

IntField: Integer;

Function GetField: integer;

Procedure SetField (value: Integer);

Property IntegerValue: integer read GetField write SetField;

End;

В контексте программы свойство ведет себя как обычное поле. Например, можно написать такие операторы:

Var

aClass: TaClass;

Value: integer;

Begin

AClass:=TaClass.Create; {Обязательное обращение к конструктору

перед обращением к полю или свойству!}

……….

aClass.IntegerValue:= 0;

……….

Value:= aClass.IntegerValue;

……….

aClass .Destroy; {Удаление ненужного объекта }

……….

End.

Более того, возможен и такой оператор присваивания:

aClass.IntField:= NewValue;

Разница между этим оператором и оператором

AClass.IntegerValue:= NewValue;

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

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

Type TaClass= class

IntField:Intege;

Procedure SetField (value:Integer);

Property IntegerValue: integer read IntField write SetField;

End;

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

Любой вновь созданный класс может иметь секции (разделы), определяемые зарезервированными словами published (декларированные), private (личные), protected (защищенные), public (доступные) и automated (автоматизированные). Внутри каждой секции вначале описываются поля,
а затем методы и свойства.

Секции определяют области видимости элементов описанного класса. Секция public не накладывает ограничений на область видимости перечисленных в ней полей, методов и свойств — их можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (т. е. в окне инспектора объектов). Секция published используется только при разработке нестандартных компонентов. Среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу за заголовком класса и продолжается до первой объявленной секции. Эта секция — published. Программисту не следует помещать в нее собственные элементы описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: личные элементы описания доступны только внутри методов данного класса и в подпрограммах, находящихся в том же модуле, где описан класс. Элемент, объявленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его потомкам независимо от того, находятся ли они в том же модуле или нет. Наконец, секция automated используется только для объявления свойств и методов, которые будут добавлены к так называемому интерфейсу OLE-объектов автоматизации; область видимости членов этой секции не ограничена.

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

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

Самая общая структура абстрактных классов имеет следующий вид:


Класс TObject является предком всех других классов, используемых
в Delphi. Класс TObject содержит конструктор Create, деструктор Done
и метод Free, которые проверяют наличие объекта, и если он существует, то вызывают деструктор.

Среди методов класса TObject можно отметить следующие: ClassName функция, которая формирует строку, содержащую имя класса, заданное ему при создании (например TEdit, Tbutton, TForm и т. д.), ClassParent — строковая функция, применимая только к классам и определяющая класс непосредственного предка, InstanteSize — целочисленная функция, применимая только к классам и возвращающая размер класса или объекта
в байтах. ClassType — функция, возвращающая класс конкретного объекта. Для класса TObject определен метакласс TClass.

Пример 1

Для произвольного класса выдать все родительские классы и их размеры.