Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа 2

.pdf
Скачиваний:
7
Добавлен:
14.03.2016
Размер:
429.99 Кб
Скачать

1

ОСНОВЫ ПРОГРАММИРОВАНИЯ НА OBJECT PASCAL

В СРЕДЕ DELPHI

Содержание

1.Цель работы

2.Теоретическая часть

2.1.Репозиторий объектов

2.2.Структура файла проекта

2.3.Структура модуля

3.Практическая часть

3.1.Создание заготовки для учебных программ

3.2.Учебная программа INTMULT

3.3.Разработка программы CALC

3.4.Учебная программа AVERAGE

3.5.Учебная программа UPSTRING

1.

Цель работы

1.

Получение навыков разработки приложений с использованием репозитория объектов

 

среды Delphi.

2.

Изучение структур файла проекта и модуля, создаваемых средой Delphi.

2.

Теоретическая часть

2.1. Репозиторий объектов

Репозиторий объектов является средством, позволяющим хранить и повторно использовать формы и проекты. Его можно пополнять собственными формами и проектами. Чтобы попасть в репозиторий объектов нужно выбрать команду из главного меню File|New. Репози-

торий состоит из пяти страниц – New, Forms, Dialogs, Data Modules и Projects. Страница New

содержит шаблоны для создания приложения (Application), объекта OLE-автоматизации

(Automation Object) нового компонента (Component), модуля данных (Data Module), динами-

чески загружаемой библиотеки (DLL), формы (Form), текстового файла (Text) и объекта, использующего витки (Thread Object). Страница Forms служит для выбора предопределенных форм. Среди них About box, Database Form, Dual List box и др. Для выбора шаблонов для диалоговых панелей следует обратиться к странице Dialogs. Здесь находятся шаблоны для панели с кнопкой «Help» (Dialog With Help), панели для ввода пароля (Password dialog) и

стандартной диалоговой панели с различным расположением кнопок(Standart Dialogs). Здесь же располагается эксперт диалогов – утилита, позволяющая создать диалоговую панель, ответив на ряд простых вопросов. На странице Projects находятся шаблоны для создания приложений, а на странице Data Modules – шаблоны для модулей данных.

Настройка репозитория объектов осуществляется с помощью диалоговой панели Project Options, открыть которую можно с помощью команд главного меню Tools|Repository. Здесь производится задание нового проекта и новой формы по умолчанию, задание новой главной формы приложения, а также добавление проектов в репозиторий.

2.2. Структура файла проекта

Любая программа в Delphi состоит из файла проекта (файл с расширением DPR) и одного или нескольких модулей (файлы с расширениями PAS). Каждый из таких файлов опи-

сывает программную единицу Object Pascal.

2

Файл проекта представляет собой программу, написанную на языке Object Pascal и предназначенную для обработки компилятором. Эта программа автоматически создается Delphi и содержит несколько строк. Чтобы увидеть их, можно запустить Delphi и щелкнуть по опции View/Project Source главного меню.

Структура файла проекта в среде Delphi выглядит следующим образом:

{Заголовок программы}

program

<имя_программы>;

{Раздел указания используемых модулей}

uses

<список_используемых_модулей>;

{Раздел описаний}

label

<описания_меток>;

const

<описания_констант>;

type

<описания_типов>;

var

<описания_переменных>;

threadvar

<описания_поточно-локальных_переменных>;

procedure

<описания_процедур>;

function

<описания_функций>;

exports

<описания_экспортируемых_имен>;

{Раздел операторов} begin

<операторы>;

end.

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

program Project1; uses

Forms,

Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin

Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run;

end.

В окне кода жирным шрифтом выделяются зарезервированные слова, а курсивом – комментарии. Каждое зарезервированное слово несет в себе условное сообщение для компилятора, который анализирует текст программы. Наличие комментариев в тексте программы делает ее понятнее и позволяет легко вспомнить особенности реализации программы. В Object Pascal комментарием считается любая последовательность символов, заключенная в фигурные скобки, но строка

{$R *.RES}

3

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

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

Тело программы начинается со слова begin и ограничивается терминатором end с точкой. Тело состоит из нескольких операторов языка Object Pascal. В каждом операторе реализуется некоторое действие – изменение значения переменной, анализ результата вычисления, обращение к подпрограмме и т. п.

2.3. Структура модуля

Среда Delphi имеет встроенную поддержку концепции модульного программирования на языке Object Pascal, что стимулирует прогрессивный и надежный стиль программирования с широким использованием модулей. В среде Delphi каждой форме обязательно соответствует свой модуль, что позволяет локализовать все свойства окна в отдельной программной единице. Кроме этого, невизуальные алгоритмические действия также оформляются в виде отдельных модулей. Структура модуля и назначение его разделов приведены ниже.

unit <идентификатор_модуля>;

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

{Интерфейсный раздел} interface

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

Связь модуля с другими модулями устанавливается специальным предложением:

{Список импорта интерфейсного раздела} uses <список_модулей>

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

{Список экспорта интерфейсного раздела} const

type var

procedure function

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

4

{Раздел реализации} implementation

В этом разделе указывается реализационная (личная) часть описаний данного модуля, которая недоступна для других модулей и программ.

{Список импорта раздела реализации} uses

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

{Подразделы внутренних для модуля описаний} label

const type var

procedure function

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

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

{Раздел инициализации} initialization

В этом разделе между зарезервированными словами initialization и finalization располагаются операторы начальных установок, необходимых для запуска корректной работы модуля. Эти операторы исполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Операторы разделов инициализации модулей, используемых в программе, выполняются при начальном запуске программы в том же порядке, в каком идентификаторы модулей описаны в предложениях uses файла проекта. Если операторы инициализации не требуются, то зарезервированное слово initialization может быть опущено.

{Раздел завершения} finalization

Раздел завершения finalization является необязательным и может присутствовать только вместе с разделом инициализации initialization. В разделе завершения располагается список операторов, которые будут выполняться при завершении модуля, что обычно происходит при окончании работы приложения. Разделы finalization модулей приложения выполняются в порядке, противоположном выполнению разделов initialization этих модулей. Раздел завершения используется, как правило, для освобождения ресурсов, выделенных приложению в разделе инициализации и тем самым гарантирует коррект-

5

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

В секции интерфейсных объявлений описываются программные элементы (типы, классы, процедуры и функции), которые будут «видны» другим программным модулям, а в секции реализаций раскрывается механизм работы этих элементов. Такое разделение модуля на две секции обеспечивает удобный механизм обмена алгоритмами между отдельными частями одной программы. Секция инициации используется крайне редко и обычно опускается вместе с открывающим ее словом begin.

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

unit Unit1; interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;

type

TfmExample1 = class(TForm) Panel1: TPanel;

Panel2: TPanel; edInput: TEdit; lbOutput: TLabel; mmOutput: TMemo; bbRun: TBitBtn; bbClose: TBitBtn;

private

{Private declarations }

public

{Public declarations }

end; var

fmExample1: TfmExample1; implementation

{$R *.DFM} end.

Весь этот текст сформирован Delphi, но в отличие от файла проекта программист может его изменять, придавая программе нужную функциональность. В интерфейсной секции описан один тип (класс TfmExample1) и один объект (переменная fmExample1).

Класс является образцом, по которому создаются объекты, и наоборот, объект – это экземпляр реализации класса. Образцы для создания элементов программы в Object Pascal называются типами. Перед его объявлением стоит зарезервированное слово type (тип), извещающее компилятор о начале раздела описания типов.

Стандартный класс TForm реализует все нужное для создания и функционирования пустого Windows-окна. Класс TfmExample1 порожден от этого класса. Термин «порожден» означает, что класс TfmExample1 унаследовал все возможности родительского класса TForm и добавил к ним собственные в виде дополнительных компонентов, которые, были вставле-

ны в форму fmExample.

Объект fmExample формально относится к элементам программы, которые называются переменными. Текст модуля доступен как Delphi, так и программисту. Delphi автоматически вставляет в текст модуля описание любого добавленного к форме компонента, а также создает заготовки для обработчиков событий; программист может добавлять свои методы в ранее

6

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

3. Практическая часть

3.1 Создание заготовки для учебных программ

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

1. Запустите среду Delphi и измените следующие свойства формы, значения которых отличаются от умалчиваемых, в окне инспектора объектов (Object Inspector).

 

Форма

Свойство

Значение

Caption

Учебная программа

Height

320

Name

fmExample

Position

poScreenCenter

Width

440

2. Со страницы Standard палитры компонентов поместите в окно формы два компонента Panel. В окне Object Inspector нужно изменить некоторые свойства этих компонентов в соответствии с таблицей.

Первая (нижняя) панель

Вторая (верхняя) панель

Свойство

Значение

Свойство

Значение

Align

alBottom

Align

alBottom

Caption

 

BevelOuter

bvNone

Height

84

Caption

 

 

 

Height

84

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

Компонент Panel имеет развитые средства создания различных эффектов трехмерности за счет использующихся в нем двух кромок – внешней и внутренней. Для того чтобы убрать внешнюю кромку свойству BevelOuter (внешняя кромка) присвоено значение bvNone.

3. Разместите два компонента BitBtn (страница Additional) на нижней панели в окне формы. Измените некоторые свойства этих компонентов в соответствии с таблицей.

 

Кнопка OK

Кнопка Close

 

(компонент BitBtn на странице Additional)

(компонент BitBtn на странице Additional)

Свойство

 

Значение

Свойство

 

Значение

Kind

 

bkOk

Kind

 

bkClose

Left

 

32

Left

 

128

Name

 

bbRun

Name

 

bbClose

Top

 

48

Top

 

48

7

Компонент BitBtn является командной кнопкой с надписью и пиктограммой. Он представляет собой разновидность стандартной кнопки Button. Ее отличительная особенность – свойство Glyph, с помощью которого определяется растровое изображение, рисуемое на поверхности кнопки. Существует несколько стандартных разновидностей кнопки BitBtn, задаваемых свойством Kind. В программе используются две кнопки. Кнопка Ok предназначена для подтверждения ввода, а Close – для завершения работы программы.

Свойства Left (Слева) и Top (Сверху) определяют положение левого верхнего угла компонента относительно такого же угла своего контейнера.

4.Со страницы Standard перенесите компонент Edit на верхнюю панель в окне формы,

иизмените его свойства в соответствии с таблицей.

Строка ввода (компонент Edit на странице Standard)

Свойство

Значение

Name

edInput

Left

128

Text

 

Top

16

Width

289

Компонент Edit – стандартный управляющий элемент Windows для ввода, представляющий собой однострочный редактор текста. Он может быть использован для отображения короткого фрагмента текста и позволяет пользователю вводить текст во время выполнения программы.

Свойство Text (Текст) у компонента Edit определяет текст, который будет содержать строка ввода в момент появления на экране. Следует очистить это свойство, чтобы начальный текст не мешал вводу данных для программы.

5. Со страницы Standard перенесите компонент Label в любое свободное место над панелями в окне формы, и измените его свойства в соответствии с таблицей.

Метка

(компонент Label на странице Standard)

Свойство

Значение

Align

alBottom

Caption

 

Name

lbOutput

Компонента Label (метка) предназначены для размещения на форме различного рода текстовых надписей. Для этого служит свойство Caption. В учебной программе метка предназначена для размещения коротких сообщений, которые будет формировать программа.

6. Со страницы Standard перенесите компонент Memo в любое свободное место над панелями в окне формы, и измените его свойства в соответствии с таблицей.

Многострочный редактор (компонент Memo на странице Standard)

Свойство

Значение

Align

alClient

Lines

 

ScrollBars

ssBoth

Name

mmOutput

Wordwrap

False

8

Компонент Memo предназначен для ввода, редактирования и/или отображения достаточно длинного текста (32 Кб, 10–20 страниц). Текст хранится в свойстве Lines класса TStrings и представляет собой пронумерованный набор строк (нумерация начинается с нуля).

Чтобы в окне Memo не было текста, мешающего выводу программой требуемой информации необходимо очистить свойство Lines. Для этого щелкните по этому свойству в окне Инспектора объектов и вызовите диалоговое окно изменения свойства. Затем удалите текст Memo1 (или mmOutput), если к этому моменту вы уже дали компоненту рекомендуемое имя) и закройте окно.

Свойство ScrollBars позволяет поместить в редактор полосы прокрутки, вертикальную, горизонтальную или обе сразу, для того, чтобы можно было увидеть текст, отсекаемый границами компонента. В учебной программе значение ssBoth (оба) свойства ScrolBars помещает в окно компонента Memo две полосы прокрутки – горизонтальную и вертикальную.

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

False.

Значение alClient свойства Align означает, что компонент Memo займет всю оставшуюся не заполненной часть формы.

7.Сохраните модуль формы в файле с именем Example.pas (File/Save As) в каталоге репозитория Delphi. Этот каталог имеет имя Objrepos и размещается в каталоге размещения

Delphi (по умолчанию – c:\Program Files\Borland\Delphi 2).

Чтобы вызвать диалоговое окно регистрации формы в архиве, щелкните по форме правой кнопкой мыши и в появившемся вспомогательном меню выберите продолжение Add To Repository. Не рекомендуется пользоваться опцией меню Project/Add То Repository, так как в этом случае в репозиторий будет добавлен проект, а не форма. Проекты из репозитория копируются целиком вместе с многочисленными родительскими классами, что замедляет время создания нового проекта и приводит к неоправданным затратам дисковой памяти.

В строке Title напишите имя формы fmExample, в строке Description - пояснение, например, «Прототип главной формы для учебной программы». Раскройте список Page и выберите в нем Forms и закройте окно регистрации кнопкой ОК. Теперь форма зарегистрирована и ее в любой момент можно выбрать с помощью опции File/New главного меню Delphi.

8.С помощью опции меню Tools/Repository вызовите диалоговое окно и установите выбор в переключателях New Form (новая форма) и Main Form (главная форма). Закройте диалоговое окно клавишей OK.

Закройте созданное окно заготовки учебной программы (File/Close All).

9

3.2. Учебная программа INTMULT

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

С помощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем Intmult.pas в папке С:\Projects\Intmult\, а модуль под именем Main.pas в той же папке.

Поместите на форму fmExample новую кнопку BitBtn так, чтобы она полностью закрыла собой bbRun. Назовите новую кнопку bbResult (свойство Name), установите для нее свойство Kind в bbОК и сделайте ее временно невидимой (свойство Visible – значение False). После такой подготовки в момент начала работы новая кнопка не будет видна и не помешает пользователю щелкнуть по кнопке bbRun. В обработчике события bbRun-Click следует спрятать кнопку bbRun и показать кнопку bbResult, чтобы пользователь смог подтвердить ввод второго операнда.

Чтобы пользователь не мог случайно ввести строку, которая не содержит правильного представления целого числа, удалите из формы редактор edInput и поместите на его место компонент MaskEdit (страница Additional). Дайте ему прежнее имя edInput (свойство Name) и раскройте диалоговое окно свойства EditMask. Это свойство указывает маску компонента, т. е. определяет, какие символы и в какой последовательности может набирать пользователь в окне ввода. В строке Input Mask введите

#99999999;1;

В окошке Character for Blanks вместо умалчиваемого символа-заполнителя «_» укажите пробел и закройте окно кнопкой ОК.

TMaskEdit – аналог TEdit, но с возможностью форматированного ввода. Формат определяется в свойстве EditMask в виде некоторого шаблона. Шаблон состоит из трех частей, отделенных друг от друга символами «;». Первая часть задает маску ввода, вторая – это символ «0» или «1», определяющий, записывается ли в Text результат наложения маски или исходный текст («0» – исходный текст). В третьей части указывается символ, который в окне редактора будет стоять в полях, предназначенных для ввода символов. В редакторе свойств для EditMask есть заготовки некоторых форматов: даты, валюты и т.п.

Маска состоит из описателей полей ввода, специальных символов и литералов. Описатель указывает, какой именно символ может ввести пользователь в данное поле (описатель всегда описывает поле единичной длины, т.е. рассчитанное на ввод одного символа). Так запись #99999999 означает, что в водимой строке первый символ (#) может содержать цифру, или знак «+» или «–», а на месте символов «9» может находится любая цифра, ни какие другие символы кроме указанных не могут вводится в данные поля. Благодаря этому максимальный размер множителя составляет девятизначное число без знака, или восьмизначное со знаком. Сформированная таким образом маска заставит компонент автоматически контролировать ввод пользователя и отвергать любые символы, кроме знаков "+" или "–" в первой позиции (элемент маски «#») и цифр (элементы «9»).

Дважды щелкните по кнопке bbResult и введите такой код для обработчика события OnClick этой кнопки:

procedure TfmExample.bbResultClick(Sender: TObject); // Обработка ввода 2-го операнда

begin // Преобразуем текст из edInput в целое число

10

Y := StrToInt(Trim(edInput.Text));

//Сообщаем в Memo о вводе 2-го операнда mmOutput.Lines.Add('2-ой операнд: '+edInput.Text);

//Вычисляем и показываем результат mmOutput.Lines.Add('Результат: ' +

IntToStr(X)+'*'+IntToStr(Y)+'='+IntToStr(X*Y)); edInput.Text:=''; // Очищаем ввод edInput.SetFocus; // и возвращаем ему фокус

lbOutput.Caption:='Введите 1-й операнд:'; // Приглашаем к вводу bbResult.Hide; // Прячем кнопку bbResult

bbRun.Show; // и показываем bbRun end;

Выражение StrToInt(Trim(edInput.Text)) состоит из вызова стандартных для Object Pascal функций: сначала вызывается функция Trim, которая возвращает строку-аргумент (в нашем случае edInput.Texf) без обрамляющих ее (т. е. ведущих и ведомых) пробелов; затем с помощью вызова StrToInt строка символов преобразуется к целому числу.

Для ввода обработчика события OnClick кнопки bbRun нужно сначала с помощью списка выбора в верхней части окна Инспектора Объектов отыскать и выбрать компонент bbRun, так как он полностью закрыт кнопкой bbResult, затем дважды щелкнуть в правом столбце строки OnClick на странице Events и ввести такой код:

procedure TfmExample.bbRunClick(Sender: TObject);

//Обработка ввода 1-го операнда

begin

//Преобразуем текст из edInput в целое число

X := StrToInt(Trim(edInput.Text));

//Сообщаем в Memo о вводе 1-го операнда mmOutput.Lines.Add('1-ый операнд: '+edInput.Text); edInput.Text := ''; // Очищаем ввод edInput.SetFocus; // и возвращаем ему фокус

lbOutput.Caption := 'Введите 2-й операнд:'; //Приглашаем к вводу bbResult.Show; // Показываем кнопку bbResult

bbRun.Hide;

//и прячем bbRun

end;

Далее необходимо передать фокус ввода компоненту edInput в момент старта программы и определить переменные X и Y для хранения операндов. Разыщите в окне кода программы описание класса TfmExample и отредактируйте его следующим образом:

private

{ Private declarations }

X,Y: Integer;

Затем с помощью списка выбора в окне Инспектора Объектов выберите форму fmExample и после двойного щелчка на строке ОпActivate страницы Events введите такой обработчик события:

procedure TfmExample.FormActivate(Sender: TObject); // Подготовка к началу работы

begin

edInput.SetFocus; // Передаем фокус ввода редактору edInput lbOutput.Caption := 'Введите 1-й операнд:';

end;

Программа аварийно завершится, если при щелчке по кнопкам bbRun или bbResult редактор не содержит текста. Чтобы избежать того, перед вызовом StrToInt вставьте

if Trim(edInput.Text) = '' then Exit;