Курсовая работа_ф_3 / Иванова Г.С. - Основы программирования
.pdfПргтоэюение
П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
