Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички по информатике / Конспект лекций (Delphi).pdf
Скачиваний:
63
Добавлен:
27.05.2015
Размер:
1.2 Mб
Скачать

44

3. БАЗОВЫЕ КЛАССЫ DELPHI

3.1 TObject

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

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

возможность создания, обслуживания и разрушения объектов путем выделения, инициализации и освобождения памяти, необходимой для работы объекта (например, методы Create, Destroy, Free);

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

(например, методы ClassInfo, ClassName, ClassNameIs, ClassType, ClassParent, FieldAddress);

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

Некоторые методы класса TObject используются непосредственно Delphi, и не могут быть вызваны пользователем. Другие же методы, наоборот требуют перекрытия в объектах и компонентах – наследниках TObject, имеющих более сложное поведение.

Хотя класс TObject и не является абстрактным классом, обычно объекты этого класса не создаются.

3.2 Exception

Класс Exception является наследником TObject и предком всех классов обработки исключительных ситуаций.

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

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

try…except – для анализа исключительной ситуации и описания поведения при ней;

45

try…finally – для создания обязательно выполняемых блоков, независимо от наличия исключительной ситуации.

Некоторые свойства и методы класса Exception:

property Message: string; – строка, описывающая исключительную ситуацию;

constructor Create (const Msg: string); – простейший конструктор для созда-

ния исключительной ситуации.

Генерацию исключительной ситуации можно произвести с помощью

оператора raise.

В Delphi определено множество классов исключений (EConvertError, EMathError, EZeroDivide и т.д.). Возможно создание собственных классов исключений.

EAccessViolation

Программа пытается обратиться к не принадлежащей ей

 

области памяти или использует недействительный указа-

 

тель

EArrayError

Ошибка при работе с массивами

EConvertError

Ошибка конвертации StrToInt и т.д.

EDivByZero

Целочисленное деление на ноль

EInOutError

Любая ошибка в файловых операциях

EIntError

Любая ошибка при целочисленных вычислениях

EIntOverflow

Целочисленное переполнение

EListError

Неверные действия со списками

EMatchError

Любая ошибка при операциях с плавающей точкой

EOverflow

Вещественное переполнение

EUnderfow

Слишком маленькое вещественное значение

EZeroDivide

Вещественное деление на ноль

3.3 TList

Класс TList является наследником TObject и служит для создания списка объектов и обеспечивает:

добавление или удаление объектов в листе;

поиск и доступ к объекту в листе;

сортировку объектов.

Некоторые свойства и методы класса TList:

property Capacity: Integer; – определяет максимальное количество элементов списка, на которые выделена память. Если при добавление нового элемента количество элементов превысит Capacity, то его значение будет автоматически увеличено;

property Count: Integer; – определяет текущее количество элементов в списке;

property Items[Index: Integer]: Pointer; – позволяет получать доступ к задан-

ному элементу листа;

46

function Add(Item: Pointer): Integer; – добавляет новый элемент в конец спис-

ка;

procedure Insert(Index: Integer; Item: Pointer); – добавляет новый элемент в заданное место списка;

procedure Clear; dynamic; – удаляет все элементы из списка, но не разрушает их;

procedure Delete(Index: Integer); – удаляет заданный элемент из списка по номеру;

function Remove(Item: Pointer): Integer; – удаляет заданный элемент из списка по адресу;

Следует помнить, что при работе со списком требуется осуществлять

операции приведения типов.

Первый элемент списка имеет индекс 0, второй - 1 и т.д.

3.4 TPersistent

Класс TPersistent является наследником TObject и предком всех объектов, не являющихся компонентами, использующих возможности копирования свойств и операции с потоками. Он обеспечивает:

чтение и сохранение неопубликованных данных в потоке;

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

средства для копирования содержимого одного объекта в другой. Некоторыми методами для реализации этих задач являются:

procedure DefineProperties(Filer: TFiler); virtual; – обеспечивает чтение и за-

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

procedure Assign(Source: TPersistent); (Destination.Assign(Source) - обраще-

ние) – копирует в Destination свойства из Source. Если в Destination метод Assign не перекрыт и Destination не знает, как копировать свойства из Source, то вызывается метод AssignTo объекта Source;

procedure AssignTo(Dest: TPersistent); virtual; (Sourse.AssignTo(Destination)) –

копирует в Destination свойства из Source.

Объекты класса TPersistent обычно не создаются. Пример использования класса:

type

TMyClass1 = class(TPersistent) public

a : integer;

procedure Assign(Source : TPersistent); override; procedure AssignTo(Dest : TPersistent); override;

end;

47

TMyClass2 = class(TPersistent) public

b : integer;

procedure Assign(Source : TPersistent); override; procedure AssignTo(Dest : TPersistent); override;

end;

TMyClass3 = class(TPersistent) public

c : integer; end;

{ TMyClass1 }

procedure TMyClass1.Assign(Source: TPersistent); begin

if Source is TMyClass1 then begin

a := (Source as TMyClass1).a; exit;

end;

inherited Assign(Source); end;

procedure TMyClass1.AssignTo(Dest: TPersistent); begin

if Dest is TMyClass1 then begin

(Dest as TMyClass1).a := a; exit;

end;

inherited AssignTo(Dest); end;

{ TMyClass2 }

procedure TMyClass2.Assign(Source: TPersistent); begin

if Source is TMyClass2 then begin

b := (Source as TMyClass2).b; exit;

end;

if Source is TMyClass1 then begin

b := (Source as TMyClass1).a; exit;

end;

inherited Assign(Source); end;

procedure TMyClass2.AssignTo(Dest: TPersistent); begin

48

if Dest is TMyClass2 then begin

(Dest as TMyClass2).b := b; exit;

end;

if Dest is TMyClass1 then begin

(Dest as TMyClass1).a := b; exit;

end;

inherited AssignTo(Dest); end;

var

MyClass11,MyClass12 : TMyClass1; MyClass21,MyClass22 : TMyClass2; MyClass31,MyClass32 : TMyClass3;

begin

MyClass11 := TMyClass1.Create; MyClass11.a := 1;

MyClass12 := TMyClass1.Create; MyClass21 := TMyClass2.Create; MyClass21.b := 2;

MyClass22 := TMyClass2.Create; MyClass31 := TMyClass3.Create; MyClass31.c := 3;

MyClass32 := TMyClass3.Create;

MyClass12.Assign(MyClass11); // MyClass12.a = 1 // TMyClass1.Assign

MyClass12.Assign(MyClass21); // MyClass12.a = 2

// TMyClass1.Assign - TPersistent.Assign - TMyClass2.AssignTo

MyClass22.Assign(MyClass21); // MyClass22.b = 2 // TMyClass2.Assign

MyClass22.Assign(MyClass11); // MyClass22.b = 1

//TMyClass2.Assign

//MyClass32.Assign(MyClass31);

//TPersistent.Assign - TPersistent.AssignTo – ошибка

//MyClass32.Assign(MyClass11);

//TPersistent.Assign - TMyClass1.AssignTo - TPersistent.AssignTo – ошибка

end;

Обычно AssignTo описывается в protected