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

Курсовая работа_ф_3 / Иванова Г.С. - Основы программирования

.pdf
Скачиваний:
852
Добавлен:
02.04.2015
Размер:
13.53 Mб
Скачать

Пргтоэюение

П5. Создание приложений Windows с использованием среды программирования Delphi

Интегрированная среда программирования Delphi (рис. П5.1) предназ­ начена для создания 32-разрядных приложений Windows. В отличие от про­ грамм, исполняемых в MS DOS, приложения Windows используют принцип событийного программирования, согласно которому программа представля­ ет собой совокупность подпрограмм - обработчиков событий, таких, как по­ лучение сигналов от клавиатуры, мыши, таймера и т.п. Она не имеет алго­ ритма в традиционном смысле, так как связь между отдельными частями не задана жестко, а зависит от последовательности наступления собьггий.

Панель быстрого доступа

Панель компонентов

[ШшШ1Ш1ЙЯ111

Ш Foiml

|Form1: TForml

\Ш\ ТГогш! = cXa»s(T: огш)

Инспектор объектов Заготовка формы Заготовка программы

Рис. П5.1. Вид экрана при входе в Delphi

391

Приложение

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

Создание приложения начинают с заготовки, предоставляемой Delphi. (Она представляет собой минимальное приложение и может быть запущена на выполнение, правда при отсутствии полезного эффекта.) Мышью выбира­ ют на панели необходимый интерфейсный компонент и переносят его на за­ готовку формы. При этом на первой закладке Properties Инспектора Объек­ тов высвечиваются параметры компонента, заданные по умолчанию, кото­ рые можно переопределить, а на второй Events - перечень событий, которые он может обрабатывать. То же происходит при выделении мышью уже уста­ новленного компонента.

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

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

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

В результате успешной компиляции и компоновки программы создают­ ся: исполняемый файл типа «ехе», имя которого совпадает с именем проек­ та, объектные модули с расширением .dcu и файлы ресурсов с расширением

.res.

Рассмотрим последовательность создания простейших приложений в Delphi на конкретных примерах.

Пример П5Л. Разработать калькулятор - приложение Windows, выпол­ няющее основные арифметические операции.

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

1. Определение имени проекта и первого модуля. Для определения име­ ни проекта используют пункт меню File\Save Project As... В появившемся ок­ не создайте новую папку и сохраните в ней файл с именем MyProject. Для оп­ ределения имени модуля необходимо щелкнуть либо по заготовке формы

392

Прплооюение

(Forml), либо по окну заготовки программа (Unitl). Затем, используя пункт меню File\Save As..., сохраняем в той же папке, что и проект, модуль формы

исаму форму под именем Calc.

2.Определение заголовка окна программы. Заголовок окна программы задается в свойствах окна формы. Для определения необходимо, предвари­ тельно выделив щелчком форму, на странице Propeties Инспектора объектов щелчком выделить свойство Caption (Заголовок) и ввести имя «Калькуля­ тор».

3.Размещение на форме окна ввода/отобраэюения чисел - однострочно­ го текстового редактора. Для выполнения этой операции на странице Standart палитры компонентов необходимо найти кнопку Edit, мышью перетащить этот компонеьгг в нужное место формы (рис. П5.2 , а) и мышью же скоррек­ тировать его размер. Чтобы удалить текст из окна компонента на странице Properties Инспектора объектов необходимо найти свойство Text и очистить его поле.

Одновременно с размещением компонент Delphi добавляет объектные поля в класс с именем TForml, наследуемый от стандартного класса TForm (рис. П5.2, б).

4.Размещение кнопок операций на форме. Для выполнения этой опера­ ции на странице Standart палитры компонентов необходимо найти кнопку Button. Для того чтобы не перетаскивать каждый компонент отдельно, перед выбором мышью компонента следует нажать клавишу Shift. Теперь, щелкая мышью в нужных местах, можно установить сразу все семь кнопок. Для отмены работы с кнопкой необходимо щелкнуть мышью по стрелке под сло­ вом Standart палитры компонентов. Затем, последовательно щелкая мышью

^ ^ ^ ^ ^ ^ ^ ^ Е Ш г!

 

Cub

1

,

'

 

<i»^ ^ ш">

д^Калысулятор B S E i

\\_ jt3^e

 

 

 

 

^ 1

Шшш

TForrril

=

cXassfTForin)

J

 

ЩлШ'Ж}^-'

 

E d i t l :

TEdit;

 

 

 

 

B u t t o n l :

TButton;

 

 

iliii

 

B u t t o n 2 :

TButton;

 

 

 

B u t t o n s :

TButton;

 

 

•iilliS

 

B u t t o n 4 :

TButton;

 

 

ш

 

B u t t o n s :

TButton;

J

 

щшШШ1ШМШттмШ¥^^Ш1ШШ .<;|

a

 

 

 

 

б

 

 

Рис. П5.2. Вид формы {а) и окна программы (б) во время проектирования

393

Прилоэюение

по установленным кнопкам, измените их размеры. После этого, используя Инспектор объектов, установите требуемые названия кнопок (свойство Caption на странице Properties инспектора объектов) соответственно на «С», «=», «+», «-», «*», «/» и «Quit». Теперь программу необходимо «научить» вы­ полнять требуемые функции.

5. Добавление обработчиков событий. Для добавления обработчиков событий обычно используют страницу Events Инспектора объектов. На этой странице указаны все события, на которые может реагировать выделенный компонент. Выделите компонент Button 1 и, щелкнув по соответствующей строке, выберете событие OnClick («щелчок мыши по компоненту»). Двой­ ным щелчком по полю рядом с ним вызовите заготовку обработчика данно­ го события и введите его текст:

Procedure TForml.ButtonlClick(Sender: TObject); begin

EditLClear; {очистить окно компонента Editl} operation:='@*; {установить состояние «первая операция»} EditLsetfocus; {установить активным окно компонента Editl}

end;

Если обработчик некоторого события уже определен, то по двойному щелчку мыши по его имени осуществляется переход на его текст.

Аналогично добавляем тексты обработчиков других событий:

• Button2Click - щелчок по кнопке «=»:

Procedure TForml.Button2Click(Sender: TObject);

Var s:string; begin

operate; {выполнить предыдущую операцию} operation:-'-^' {установить состояние «операция =»} Str(sum:6:3,s); {преобразовать результат в строку} EditLtext:=s; {вывести строку в окно компонента Editl} ButtonLsetfocus; {установить курсор на кнопку Button 1}

end;

Button3Click - щелчок по кнопке «+»:

procedure TForml.Button3Click(Sender: TObject); begin

operate; {выполнить предыдущую операцию} operation:-*-\-^; {установить состояние «операция +»} EditLsetfocus; {установить активным окно компонента Editl} end;

394

Прилолсеиие

• Button4Click - щелчок по кнопке «-»:

procedure TForml.Button4Click(Sender: TObject); begin

operate; {выполнить предыдущую операцию} operation:^*''; {установить состояние «операция -»} EditLsetfocus; {установить активным окно компонента Editl}

end;

• ButtonSClick - щелчок по кнопке «*»:

procedure TForml.Button5Click(Sender: TObject); begin

operate; {выполнить предыдущую операцию} operation:='*^; {установить состояние «операция *»} EditLsetfocus; {установить активным окно компонента Editl}

end;

• Button6Click - щелчок по кнопке «/»:

procedure TForml.Button6Click(Sender: TObject); begin

operate; {выполнить предыдущую операцию} operation:-V*; {установить состояние «операция /»} EditLsetfocus; {установить активным окно компонента Editl}

end;

• Button7Click - щелчок по кнопке «Quit»:

procedure TForml.Button7Click(Sender; TObject); begin

Close; {завершить работу приложения} end;

в. Добавление процедуры. Для выполнения вычислений необходимо до­ бавить процедуру Operate. Поскольку она вызывается из обработчиков собы­ тий, ее необходимо вставить перед ними в секции реализации модуля:

Procedure Operate;

Var s:string; code:integer; n:double;

Begin

 

s:-FormLEditLtext;

{читаем сроку из Editl.text}

FormLEditLclear;

{очищаем Editl}

395

Пргшоэюение

Val(s,n,code); {преобразуем строку в число} case operation of {выполняем операцию}

'@'; sum:-n;

'+'; sum:=sum'^n; '-': sum:=sum'n; =sum*n;

У: sum:=sum/n; end;

end;

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

Var Sunudouble;

operation:с1гаг=Щ';

8.Сохранение проекта. Для сохранения проекта используют пункт ме­ ню FiIe\SaveAll.

9.Компиляция проекта. Для выполнения компиляции используют ком­ бинацию клавиш Ctrl-F9 или пункт меню Project\Compile. Если при компиля­ ции обнаружены ошибки, то внимательно проверьте текст программы.

10.Запуск программы на выполнение. Для запуска программы исполь­ зуют клавишу F9 или пункт меню Run/Run или кнопку Run на панели быст­ рого доступа.

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

Пример П5.2. Разработать приложение Windows для возведения вводи­ мых чисел в квадрат.

Ан а л и з . Начинаем с объектной декомпозиции интерфейсной и пред­ метной частей приложения. Интерфейсная часть включает только Окно при­ ложения. Предметная - объект Число, который отвечает за инициализацию числа и возведение его в квадрат (рис. П5.3).

Созда1ь

^

 

При

анализе

реализуемых

 

^ функций учтем, что при вводе чи-

Вычислить

J

 

^^^ ВОЗМОЖНЫ ошибки. Слсдова-

 

I

"^^^

тельно,

необходим

интерфейс с

Уничтожить

(

 

I

 

 

-'V J тремя основными состояниями:

 

Ввод числа, Демонстрация ре-

Рис. П5.3. Объектная декомпозиция

зультата и Демонстрация сообще-

396

Приложение

 

 

OK

Демонстрация]

 

Ввод Enter

 

 

сообщения

[Число введено

 

 

 

 

неверно]

Нормальное выполнение

 

 

Ввод

 

Ввод Enter

 

 

числа

 

 

 

 

 

[Число введено

 

 

 

верно]

 

 

Следующее

Демонстрация]

Выход

 

 

результата

 

Рис. П5.4. Диаграмма переходов состояний интерфейса

ния об ошибке (рис. П5.4). Из двух первых состояний необходимо обеспе­ чить возможность выхода, поэтому объединим их в дополнительное состоя­ ние - Нормальное выполнение.

П р о е к т и р о в а н и е и н т е р ф е й с а . Основное окно приложе­ ния проектируем, используя средства визуальной среды Delphi (рис. П5.5), аналогично тому, как это было сделано в предыдущем примере. Затем уточ­ няем внешний вид приложения в каждом из состояний интерфейса (рис. П5.6): определение жестких ограничений на действия пользователя позволя­ ет избежать некорректной работы программы в условиях событийного про­ граммирования.

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

»1Я»^^^||^ш^яеш

TButton

TLabel

TEdit

TBevel

Рис. П5.5. Проектирование формы основного окна приложения

397

Приложение

РяИИМ^ИшШ^ШЯИнЁз! яЮйЯШшвИШ!^

3]^^ЙГ^'-ЧИ€;йО>;:.-:/"

* : - 1 Г

^ ./Ir^>.l...>..-l;l.'>:'.S'.J:..^...^....'^I;I-'' iii»ii»>w»>it>'^>ijiiii>^;^i

5^;<[ij 625

^'лЖШШ^:|й

!Яу:|

РвшШШШшШМШвиЕ!

•;B^«fte-4MCif10^

Рис. П5.6. Интерфейс приложения «Возведение числа в квадрат»:

а- ввод числа (исходное состояние); б - демонстрация результата;

в- демонстрации сообщения об ошибке

Forml - главная форма приложения:

Name: MainForm ~ имя объекта-формы;

Caption: 'Возведение числа в квадрат' - заголовок окна;

Labell ~ первая метка:

Name: InputLabel - имя объекта-метки;

Caption: 'Введите значение' ~ текст метки;

Label2 - вторая метка:

Name: OutPutLabel - имя объекта-метки;

Caption: 'Квадрат значения равен:' - текст метки;

Editl - первый однострочный редактор:

Name: InputEdit ~ имя объекта-редактора;

Edit2 - второй однострочный редактор:

Name: OutPutEdit - имя объекта-редактора;

398

Прилоэюение

Enable: false - запрет активизации редактора пользователем; Readonly: true - запрет ввода текста в редактор;

Button1 - первая кнопка:

Name: NextButton ~ имя объекта-кнопки; Caption: 'Следующее' - название кнопки; Button2 - вторая кнопка:

Name: ExitButton - имя объекта-кнопки; Caption: 'Выход' - название кнопки.

П р о е к т и р о в а н и е о б ъ е к т а п р е д м е т н о й о б л а с т и . Анализ взаимодействия объектов, полученных в процессе объектной декомпозиции показывает, что класс TNumber для реализации объекта Чис­ ло должен включать поле Num для хранения введенного значения, конструк­ тор и метод определения квадрата числа. Деструктор он может наследовать от класса TObject. Полная диаграмма классов приложения показана на рис. П5.7 (серым выделены стандартные классы Delphi). Классы TMainForm и TNumber связаны отношением ассоциации, так как класс формы посылает классу объекта сообщения.

Р е а л и з а ц и я . Описание класса TNumber и его методов целесообраз­

но поместить в специальном модуле:

 

 

 

Unit UnitNumber;

 

 

 

Interface

 

 

 

 

Type

 

 

 

 

TNumber=class(TObject)

 

 

 

private

Num:single;

 

 

 

public

Constructor Create(aNum:single);

 

 

end;

Function SqrNumber:single;

 

 

 

 

 

 

 

 

ТТРода

 

- ; - '

. - ^ ' . ' ; j

 

 

V 'Sp¥0^- 1

 

^

 

A

 

Шш^^:;М,

TMainForm

 

TNumber

1

 

 

 

—-о MainFormActivateInputEditKeyPressed

Управляет •

Num

 

 

Create()

 

Щ^ШШ:

NextButtonClick

 

Sqr( )

1

 

Destroy()

 

 

 

 

ExitButtonClick

1Ш1Ши11

Рис. П5Л. Ди?1грамма классов приложения

399

Приложение

Var N: TNumber; Implementation

Constructor TNumber. Create(aNum:single); begin

inherited Create;

Num:=aNum;

end;

Function TNumber.SqrNumber:single; begin Result: ^Sqr(Num);

end;

end.

В секции реализации модуля MainForm указываем использование модуля UnitNumber.

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

 

 

 

Таб л и ц а

П5.1

Реальные

События компонентов

 

Действия

 

события

 

 

 

 

 

 

 

Запуск

MainForm: OnActivate -

 

Настройка

интерфейса

на

приложения

получение окном управления

ввод числа (рис. П5.6, а)

 

Ввод цифр

 

 

Обрабатывается компонентом

 

 

TEdit автоматически

 

Ввод Enter I

InputEdit: OnKeyPressed

 

Если введено не число, то вы­

j ввод алфавитно-цифровой инвод

сообщения

об ошибке

(рис.

1 формации в окно компонента П5.6, б), иначе -

создание объекта

редактирования

Число, генерация запроса о квадра­

 

 

те

числа, вывод

результата

(рис.

П5.6, в) и уничтожение объекта

j

Щелчок по

 

I кнопке ОК

 

1

Щелчок по

NextButton: OnClick

:кнопке Следущелчок мышью по кнопке I ющее

I

Щелчок по

ExitButton: OnClick

i кнопке Выход

щелчок мышью по кнопке

Обрабатывается окном сооб­ щения автоматически

Настройка интерфейса на ввод числа (рис. П5.6, а)

Завершение приложения

400

Соседние файлы в папке Курсовая работа_ф_3