Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка 1.doc
Скачиваний:
33
Добавлен:
13.02.2015
Размер:
689.66 Кб
Скачать

Программа работы

  1. Создать программу, моделирующую основные функции текстового редактора "Блокнот" (рис. 3.2.).

Рис. 3.2. Внешний вид текстового редактора "Блокнот"

  1. Создайте новый проект и сохраните все его файлы в папке с именем ‘…\Лабораторная работа № 3’.

  2. Расположите на форме компоненты Memo, ImageList, OpenDialog, SaveDialog, FontDialog, как это показано на рис. 3.3.

Рис 3.3. Вид формы на этапе проектирования

  1. Откройте редактор "Блокнот" (ПускПрограммыСтандартныеБлокнот).

  2. Создайте главное меню вашего редактора в соответствии с главным меню программы "Блокнот", настройте "горячие" клавиши.

  3. С помощью компонента ImageList подберите соответствующие пиктограммы для нескольких пунктов созданного меню.

  4. Установите у окна Memo1 свойство Align в alClient, а надпись Memo1 удалите.

  5. Настройте компоненты OpenDialog и SaveDialog в соответствии с соответствующими диалогами программы "Блокнот".

  6. Создайте обработчики пунктов меню в соответствии с их названиями.

  7. Примечание. Пункты меню Поиск и Справка сделать неактивными, команды Файл/Макет страницы, Файл/Печать тоже.

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

  1. Охарактеризуйте компонент MainMenu и опишите основные его свойства.

  2. Опишите процесс создания главного меню.

  3. Охарактеризуйте компонент Memo и опишите основные его свойства.

  4. Перечислите функции компонента Memo для работы с буфером.

  5. Перечислите основные свойства и методы свойства Lines компонента Memo.

  6. Охарактеризуйте диалоговые компоненты OpenDialog и SaveDialog и опишите основные их свойства.

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

  8. Запишите обработчики открытия и сохранения файлов и объясните принцип их работы.

  9. Охарактеризуйте компонент FontDialog и опишите основные его свойства.

  10. Охарактеризуйте компонент ImageList.

Лабораторная работа № 4 понятие класса

Цель работы: изучить синтаксис объявления класса и режимы доступа к его элементам, а также получить практический навык работы с объектной переменной в интегрированной среде разработкиDelphi.

Теоретические сведения

Объект (Object) – это структура, которая объединяет данные и действия над ними, а также защищает и то и другой от неправильного использования или непредвиденного воздействия из вне.

С точки зрения объектно-ориентированного языка программирования, объект – это переменная, тип которой определяется пользователем. Тип объекта называется классом (class).

Синтаксис объявления класса в языке С++ следующий:

type//раздел объявления типов

<Имя класса> = class(<Имя родительского класса>)

// раздел доступапо уполчанию

private

<поля, методы, свойства, события>;

protected

<поля, методы, свойства, события>;

public

<поля, методы, свойства, события>;

published

<поля, методы, свойства, события>;

end;

<Имя класса> – любой разрешенный идентификатор язык Pascal. Его принято начинать с символа ‘T’, сокращенно от словаType.

<Имя родительского класса> – имя предопределенного или пользовательского класса, которого будет родителем данного класса.

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

<Имя класса> = class или <Имя класса> = class(TObject).

Раздел Private(Закрытый) – предназначен для объявления элементов, доступ к которым разрешен только данному классу.

Раздел Protected(Защищенный) – предназначен для объявления элементов, доступ к которым разрешен как данному классу, так и всем его наследникам.

Раздел Public(Открытый) – предназначен для объявления элементов, доступ к которым разрешен всем без исключения.

Раздел Published(Публикуемый) – предназначен для объявления элементов, доступ к которым разрешен всем, включая интегрированную среду разработкиDelphi.

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

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

<Имя класса> = class(<Имя родительского класса>)

// раздел по уполчанию

end;

Кроме этого можно объявить класс без единого раздела. В этом случае, он будет содержать только унаследованные элементы от своих родителей.

<имя класса> = class(<имя родительского класса>);

В любом Элементы класса бывают 3 видов:

  1. Поля (Field)– это переменные, объявленные внутри класса и предназначенные для хранения данных объекта.

  2. Методы (Method)– это процедуры и функции, принадлежащие классу и предназначенные для работы с данными объекта.

  3. Свойства (Property)– это элементы класса, объединяющий методы чтения и записи полей данных.

Поляобъявляются также как и любая переменная языкаPascal:

<Имя поля>: <Тип поля>;

<Имя поля> – любой возможный идентификатор языка ObjectPascal. Общепринято начинать имя поля с символа ‘F’ от словаField.

<Тип поля> – любой предопределенный или пользовательский тип языка ObjectPascal.

Например, FField1: String; FField2: Double; FField3: Integer; FField4: TObject.

Методы классаобъявляются, так же как и обычные процедуры и функции языкаObjectPascal.

procedure<Имя метода>(<Список параметров>);

function<Имя метода>(<Список параметров>): <тип возвращаемого значения>;

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

implementation

procedure<Имя класса>.<Имя метода>(<Список параметров>);

var

<Список локальных переменных>;

begin

<Тело метода>;

end;

function<Имя метода>(<Список параметров>): <Тип

возвращаемого значения>;

var

<Список локальных переменных>;

begin

<Тело метода>;

end;

В отличие от обычных процедур и функций языка Pascalметодам класса неявно передается специальный указатель (Self) на вызвавший их объект. За счет этого метод узнает данные, какого конкретного объекта ему необходимо использовать. Этот механизм позволяет значительно сократить затраты памяти так как методы принадлежат только классу, а не всем его объектам.

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

  1. Объявление объекта.

  2. Создание объекта.

  1. Работа с объектом.

  2. Уничтожение объекта.

1. Объявление объектаосуществляется также как и объявление любой переменная языкаPascal, но она имеет тип соответствующего класса

var

<Имя объекта>: <Имя класса>;

<Имя объекта> – это любой возможный идентификатор языка Pascal. Если объявляется только один объект, то его имя принято задавать по имени класса без указания первого символа ‘T’. Например,

var

MyObject: TMyObject; // объявление объекта

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

var

<Имя объекта1>, ..., <Имя объекта N> : <Имя класса>;

Объектная переменная по своей структуре является указателем и предназначена для хранения 32–разрядного адреса ячейки памяти, начиная с которой располагается сам объект. Первоначально, её значение равно нулю (nil), т.е. она не ссылается не на один объект. Поэтому для её использования, сначала, необходимо создать сам объект и связать его с именем переменной.

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

constructor<имя конструктора>(<список параметров>);

Действия конструктора различны в зависимости от способа его вызова.

  1. Если конструктор вызывается по имени класса

<Имя объекта> := <Имя класса>.<Имя конструктора>;

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

  1. Если конструктор вызывается по имени объекта

<Имя объекта>.<Имя конструктора>;

то сразу выполняется его тело, а память под сам объект не выделяется.

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

constructor<Имя класса>.<Имя конструктора>(<Список

параметров>);

var

<Список локальных переменных>;

begin

<тело конструктора>;

end

Класс может не содержать ни одного конструктора. В этом случае, он наследует его от свойх родителей. Например, в базовом классе всех объектов TObjectопределен конструкторCreate, который в своем теле не выполняет ни каких действий и перекрывается в классах – наследниках.

3. Работа с объектом осуществляется за счет использования его элементов – полей, методов и свойств. Для доступа к ним необходимо указать имя элемента после имени объекта через точку:

<Имя объекта>.<Имя элемента>;

Если последовательно обращаются к элементам одного и того же объекта, то для упрощения записи можно использовать оператор with.

with <Имя объекта>do <Тело оператора>;

В теле обращение к элементам объекта, записанного между директивами withиdo, осуществляется без указания имени объекта и точки после него.

with <имя объекта>do

begin

<имя элемента1>;

................

<имя элементаN>;

end;

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

4. Удаление объектаосуществляются с помощью специального метода, который называется деструктором. Синтаксис его объявления следующий:

destructor<Имя деструктора>(<Список параметров>);

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

Класс может не содержать ни одного деструктора. В этом случае, он наследует его от своих родителей. Например, в базовом классе всех объектов TObjectопределен деструкторDestroy, который не выполняет в своем теле ни каких действий, а переопределяется в классах – наследниках.

Однако объекты следует уничтожать другим методом, который также определен в классе TObjectи имеет имяFree. Он, первоначально, проверяет был ли создан сам объект (объектная переменная не равно нулю) и только после этого удаляет его, вызывая деструкторDestroy. Использование этого метода позволяет исключить большинство ошибок, возникающих при работе с динамической памятью и способных привести к перезагрузке всей операционной системы.