Информатика в техническом университете / Информатика в техническом университете. Объектно ориентированное программирование
.pdf4. Создание приложений Windows
ш |
Меню |
у Панель быстрого доступа |
/Панель компонент |
||||||
|
|
|
|
|
|
|
|
о ^ |
|
File Edit' Search View/ |
Project |
Run Component |
Database/ Jools Workgroups |
Help |
|||||
|
|
|
|
|
standard |
fAdditional]lltional y^n32 |
| System ) Internet |
|DataAc ] [ J I Z 1 |
|
|
|
|
a |
о |
g ^ r |
|
Чг^АЕННга Ш Ф Ш |
||
|
|
|
1 |
т"""|'1Р>| |
|
|
|
HI-IE3 |
|
Fonn1:TForm1 |
|
|
|
|
|
|
|
^ |
|
Properties |
Events |
|
|
|
|
|
|
|
|
ActiveControl |
|
|
|
|
|
|
|
|
|
AutoScroli |
True |
|
|
|
|
|
|
|
|
•bSorderlcons |
[biSystemMen |
|
|
|
|
|
|
||
BorderStyle |
bsSizeable |
|
|
|
|
|
|
||
Caption |
>Form1 |
|
|
|
|
|
|
|
|
ClientHeight |
189 |
|
|
|
|
|
|
|
|
CllentWidth |
290 |
|
|
|
|
|
|
|
|
Color |
|
clBtnFace |
|
|
|
|
|
|
|
1 Ctl3D |
|
True |
|
|
nUL |
|
|
|
ЛП |
|
|
|
|
|
|
|
|
||
'Инспектор Объектов |
|
1: |
1 |
Modified |
Insert |
|
|||
|
' Заготовка формы^ |
Окно заготовки программы |
|||||||
(Страница свойств) |
|
||||||||
|
|
|
|
|
|
|
|
(находится под формой) |
Рис. 4.9. Вид экрана при входе в Delphi
Так класс TForm включает метод обработки сообщения WM_CHAR. В шисимости от того, какая именно кнопка мьшш была нажата, этот метод может ызывать:
1) обработчик события OnKeyPress - при нажатии любой клавиши, эторой соответствует код ASCII (в основном - алфавитно-цифровая часть лавиатуры);
2) обработчики событий OnKeyDown и OnKeyUp - соответственно, при ажатии и отпускании любой клавиши, включая и те, которым соответствует эдАЗСП (рис. 4.10).
Таким образом, в Ве1рЫ и C++Builder обработка сообщений заменена бработкой событий^ при этом программист в большинстве случаев збавляется от необходимости расшифровки сообщений системы.
Перечень событий, предусмотренных для визуальных компонент, можно осмотреть в Инспекторе Объектов, поместив нужный компонент из меню змпонент на форму, выделив его щелчком мыши и переключившись в нспекторе Объектов на страницу Events (события). Так, например, для класса Form предусмотрена возможность подключения обработчиков следующих )бьггий:
$0
4.3. Технология разработки приложений Windows |
|
||||
Определен |
|
Обработчик сообщения WM_CHAR |
t |
||
для класса |
^ |
|
|
|
|
Могут |
|
|
|
|
|
определяться |
|
|
|
Обработчик |
|
при разработке |
|
Обработчик |
Обработчик |
|
|
приложения |
|
события |
события |
события |
|
|
|
KeyDown |
KeyUp |
KeyPressed |
|
Рис. 4.10. Подключение обработчиков событий при обработке сообщения
п р и и з м е н е н и и с о с т о я н и я ф о р м ы :
OnCreate - в начальной стадии создания формы - используется при необходимости задания параметров (цвет или размер);
OnActivate - при получении формой фокуса ввода (окно становится активньп^! и ему адресуется весь ввод с клавиатуры);
OnShow - когда форма (окно) становится видимой;
OnPaint - при необходимости нарисовать или перерисовать форму; OnResize - при изменении размеров формы на экране;
OnDeactivate - при потере формой фокуса ввода (окно становится неактивным);
OnHide - при удалении формы с экрана (окно становится невидимым); OnCloseQuery - при попытке закрыть форму - обычно используется для
создания запроса-подтверждения необходимости закрытия окна; OnClose - при закрытии формы;
OnDestroy - при уничтожении формы; от к л а в и а т у р ы и м ы ш и :
OnKeyPressed - при нажатии клавиш, которым соответствует код ASCII; OnKeyDoun, OnKeyUp - при нажатии и отпускании любых клавиш,
включая те, которым соответствует код ASCII;
OnCIick, OnDblClick - при обычном и двойном нажатии клавиш мыши соответственно;
OnMouseMove - при перемещении мыши (многократно); OnMouseDown, OnMouseUp - при нажатрш и отпускании клавиш мьппи;
п р и п е р е т а с к и в а н и и о б ъ е к т а м ы ш ь ю : OnDragDrop - в момент опускания объекта на форму;
OnDragOver - в процессе перетаскивания объекта над формой (многократно); д р у г и е ;
OnHelp - при вызове подсказки;
OnCbange - при изменении содержимого компонент.
Список событий более простых компонент существенно короче, например, метка (класс TLabel) может реагировать на 9 событий:
181
4. Создание приложений Windows
OnClick, OnDblClick, OnMouseDown, OnMouseUp - события мьппи; OnDragDrop, OnDragOver, OnEndDrag, OnStartDrag - собыгия при
перетаскивании объекта мьппью.
В зависимости от типа собыгия, для каждого обработчика предусмотрен соответствующий список параметров. При необходимости программист может добавить свой обработчик каких-либо сообщений, возможно, предусмотрев в нем подключение обработчиков своих событий.
Конструирование окна приложения выполняется с использованием визуальной технологии, т.е. проектировщик, создавая проект окна, переносит на него мьппью нужные элементы с панели компонент, имея возможность сразу же визуально оценить полученный вариант. Параллельно, используя Инспектор Объектов, он может задать или изменить некоторые параметры и/или определить обработчики событий для включаемых компонент.
Таким образом, в DelpM и C++ Builder разработчику предоставляются средства визуального проектирования интерфейса и некоторые вспомогательные средства (в виде библиотеки классов) разработки содержательной части задания.
Процесс создания приложений Windows в указанных средах включает те же этапы, что процесс разработки объектных программ для MS DOS, но вьшолнение этих этапов имеет некоторую специфику.
Прежде всего, процесс создания программы имеет ярко вьфаженный итерационный характер. Обычно вначале вьшолняется анализ, проектирование и реализация интерфейса или даже его части. А затем программа поэтапно наращивается до получения окончательного варианта.
Существуют и особенности выполнения самих этапов разработки. Рассмотрим два примера.
Пример 4.1. Приложение «Возведение чисел в квадрат» (вариант 1).
Пусть необходимо разработать приложение, которое должно осуществлять последовательный ввод вещественных чисел (с проверкой правильности вводимых чисел) и возведение вводимых чисел в квадрат.
Ан а л и з .
1.Разработку начинаем с анализа задачи с целью определения основных состояний интерфейса.
Для данной задачи можно использовать интерфейс с тремя состояниями: а) исходное состояние, в котором приложение ожидает ввода числа,
которое необходимо возвести в квадрат; б) состояние вывода результата;
в) возможное состояние вывода сообщения об ошибочном вводе исходного числа.
2. Для каждого состояния продумываем внешнее представление (экранную форму), т.е. вид окна приложения в каждом случае (рис. 4.11).
182
4.3. Технология разработки приложений Windows
Состояние ввода |
Состояние вывода результата |
||||
Возведение в квадрат |
|
Возведение в квадрат Hi-iia |
|||
Введите значение: |
Следующее |
1 Введите значение: |
1 Следующее || |
||
L |
п^ |
\1 |
|||
Выход |
Выход |
||||
|
|
Квадрат числа равен: |
|
||
|
|
|4489 |
1 |
|
Состояние вьшода сообщения об опшбке
Введенная строка содержит неверные символы.
ОК
Рис. 4.11. Экранные формы
3.Разрабатьюаем граф состояний интерфейса, отражающий возможные варианты смены состояний (рис. 4.12).
4.Вьшолняем объектную декомпозицию интерфейсной и предметных частей приложения. Интерфейсная часть включает два объекта: главное окно приложения и окно сообщения об ошибке. Предметная часть очень проста и может бьггь реализована без вьщеления объектов (рис. 4.13).
Рис. 4.12. Граф состояний интерфейса
183
|
4. Создание прилолсений Windows |
||
Активиз1фовагь |
JL |
П р о е к т и р о в а н и е . |
|
|
1. Логическое проектирование или |
||
Главное окно |
|||
разработка структуры классов вьшолняется |
|||
|
приложения |
||
|
с использованием среды разработки DelpM. |
||
|
|
||
Активюироватъ |
|
а) Вначале организуем новый проект |
|
|
и, используя визуальную технологию, |
||
|
|
||
|
Сообщение |
создаем окно главной формы (рис. 4.14). |
|
|
При этом среда автоматически строит |
||
|
об ошибке |
||
|
описание класса TForml, наследуемого от |
||
|
|
||
Рис 4.13. Объектная декомпозиция |
библиотечного класса TForm, и включает в |
||
него объектные поля визуальных компонент, |
руководствуясь эскизом экранной формы. б) С помощью Инспектора Объектов настраиваем параметры формы и
KOMHoneirr следующим образом:
Forml:
Name:=MainForm; Сарйоп:='Возведение числа в квадрат';
Labell:
Name:='InputLaber; Сарйоп:='Введите значение';
Label2:
Name:=OutPutLabeI; Сар11оп:='Квадрат значения равен:';
Editl:
Name:=InputEdit;
EdU2:
Name:=OutPutEdit;
Enable:=false;
ReadOnly:=true;
y*' Возведение в квадрат Н 1 н Ю
TForai TBevel 4Edit ^TLabel TButton
Рис. 4.14. Проектирование главного окна приложения
184
4.3. Технология разработки приложений Windows
|
|
ШШ9^^шл1111111111111111 |
|
^ljl |
1 |
^^^^^^^^ш^^ш, Методы: |
|
|
|||
1И1И11 |
|
TMainForm |
Form Activate |
|
InputEditKeyPressed |
||
11ИИ1|| |
|
|
NextButtonClick |
ilBillli |
ExitButtonClick |
|
|
Рис. 4.15. Диаграмма классов интерфейса приложения |
Buttonl:
Name:=NextButton;
Сар1юп:='Следующее';
Button2:
Name:=ExitButton;
Сар1юп:='Выход';
Диаграмма класса TMainForm, построенного при визуальным проектировании, представлена на рис. 4.15.
в) Исходя из возможных вариантов (списка событий задействованных компонент), определяем события, по которым будет происходить смена состояний интерфейса (рис. 4.16).
Параллельно определяем, какие основные операции должны быть выполнены при смене состояний интерфейса.
шя^^^)-^ |
(^Выво,д результата |
События:
С1 - активация формы
С2 - нажатие клавиши Enter при вводе значения
СЗ - нажатие кнопки Выход С4 - нажатие кнопки Следующее С5 " нажатие кнопки ОК
Рис. 4.16. Определение множества обрабатываемых событий
185
4. Создание приложений Windows
Обработчик события С1 - «активащм формы» (OnFormActivate) должен выполнять настройку интерфейса в соответствии с экранной формой, изображенной на рис. 4.11, а (прятать метку результата и поле его вывода, запрещать нажатие кнопки Следующее, чистить поле ввода и устанавливать на него курсор).
Обработчик события С2 - «нажатие клавиши Enter при вводе значения» (OnKeyPressed для поля ввода) должен проверять правильность ввода. При правильном вводе далее он должен вычислять квадрат введенного значения и выводить результат в экранную форму, изображенную на рис. 4.11, б (соответственно, запрещая ввод значений, разрешая нажатие кнопки Следующее и показывая метку результата и результат). При неправильном вводе он должен выводить сообщение об ошибке, используя экранную форму, изображенную на рис. 4.11, е.
Обработчик события СЗ - «нажатие кнопки Выход» (Он Click для кнопки Выход) должен закрьгоать окно приложения.
Обработчик события С4 - «нажатие кнопки Следующее» (On Click для кнопки Следующее) должен вновь настраивать интерфейс в соответствии с экранной формой, изображенной на рис. 4.11, а.
На основании этой информащш на следующем этапе разрабатьгоаются алгоритмы соответствующих процедур - обработчиков указанных событий.
г) Решаем, что окно сообщения об ошибке отдельно проектировать не будем: для его отображения используем спещ1альную фушащю MessageDlg.
2. Физическое проектирование или разбивку программного продукта на модули среда Delphi выполнит автоматически, поместив класс формы в отдельном модуле.
Э в о л ю ц и я .
Используя шаблоны, предоставляемые средой, создаем обработчики событий, выбраштых при разработке интерфейса:
Unit MainUnit;
Interface
Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dia
logs, StdCtrls, ExtCtrls; |
|
Type TMainForm = classfTForm) |
{Класс «Главная форма»} |
Bevel1: TBevel; |
{рамка} |
NextButton, ExitButton: TButton; {кнопки Следующее и Выход} InputLabel, OutPutLabel: TLabel; {метки ввода и вьшода} InPutEdit, OutPutEdit: TEdit; { редакторы ввода и вьшода } procedure FormActivate(Sender: TObject); {обработчик события
«активация формы»}
procedure InPutEditKeyPress (Sender: TObject; var Key: Char);
{обработчик события «нажатие клавиши Enter при вводе значения»}
186
4.3. Технология разработки приложений Windows
procedure NextButtonClick(Sender: TObject); {обработчик события
«нажатие кнопки Следующее»}
procedure ExitButtonClick(Sender: TObject); {обработчик события
«нажатие кнопки Выход»}
end;
Var MainForm: TMainForm; {объявить объект класса TMainForm}
Implementation {$R "".DEM}
{обработчик события «активащм формы»}
Procedure TMainForm. FormActivate(Sender: TObject);
Begin |
|
NextButton.Enabled: =false; |
{дезактршировать кнопку Следующее} |
InPutEdit.ReadOnly: -false; |
{разрешить ввод в Редактор ввода} |
InPutEdit.Clear; |
{очистить Редактор ввода} |
InPutEdit.Enabled: =true; |
{активизировать Редактор ввода} |
InPutEdit.SetFocus; |
{установить фокус ввода} |
OutPutLabel. Visible: -false; |
{скрыть Редактор вывода} |
OutPutEdit. Visible: -false; |
{скрыть Метку редактора вывода} |
End;
{обработчик события «нажатие клавиши Enter при вводе значения»}
Procedure TMainForm.InPutEditKeyPress(Sender: TObject;
Var x:real;Code: integer; |
var Key: Char); |
||
|
|||
Begin |
|
|
|
ifKey=#13 then { если нажата клавиша Enter, то} |
|||
begin |
|
|
|
Key: =#0; |
{предотвратить звуковой сигнал при вводе символа перехода |
||
|
на следующую строку в однострочном редакторе} |
||
Val(InPutEdit.Text,x,Code); {преобразовать введенную строку в |
|||
ifCode=0 |
then |
число} |
|
{если преобразование прошло успешно, то} |
|||
begin |
|
|
|
InputEdit.ReadOnly: =true; |
{запретить ввод в Редактор ввода} |
||
InputEdit.Enabled: -false; |
{дезактивировать Редактор ввода} |
||
OutPutLabel. Visible: -true; {показать Метку вывода} |
|||
OutPutEdit. Visible: =true; |
{показать Редактор вывода} |
||
OutPutEdit. Text: =floattostr(sqr(x)); {вьшести результат в |
|||
NextButton.Enabled:=true; |
Редактор вывода} |
||
{активировать кнопку Следующее} |
|||
NextButton.SetFocus; |
{установить фокус на кнопку |
||
end |
|
|
Следующее} |
|
|
|
|
else |
{иначе, если введено не число, то} |
187
4. Создание прилолсений Windows
MessageDlgC Значение содерлсит недопустимые символы. \ mtError, [mbOk], 0); {показать окно Сообщение об ошибке}
end End;
{обработчик собьггия «нажатие кнопки Следующее»}
Procedure TMainForm.NextButtonClick(Sender: TObject); Begin
FormActivate(NextButton); {вернуться к исходным настройкам интерфейса}
End;
{обработчик собьггия «нажатие кнопки Выход»}
Procedure TMainForm.ExitButtonClick(Sender: TObject);
Begin Close; {закрьггь окно приложения и завершить его}
End;
End.
Основная программа (проект) в процессе разработки с использованием среды Delphi создается автоматически и выглядит следующим образом:
Program Example!;
Uses Forms, MainUnit in 'MainUnit.pas' (MainFormj;
{$R *RES} |
|
Begin |
|
Application. Initialize; |
{инициализация приложения} |
Application.CreateForm(TMainForm, MainForm); {создание |
|
Application.Run; |
формы} |
{запуск цикла обработки сообщений} |
|
End |
|
В процессе компиляции программы будут участвовать следующие файлы: *.dpr - файл проекта программы - исходный текст на Pascal (создается
автоматически);
*.pas - файлы, содержащие исходные модули программы (в том числе модули форм);
*.dfin - текстовые файлы описания форм.
В результате - будет получен файл .ехе программы и целый ряд вспомогательных файлов.
Пример 4.2. Приложение «Возведение чисел в квадрат» (вариант 2).
Если использовать для разработки той же программы среду C++ Builder, то первые два этапа будут выполняться идентично, хотя описание класса TMainForm будет автоматически создано на C++ в файле MainUnit.h:
mjhde/MainUnitH Mefine MainUnitH
188
4.3. Технология разработки приложений Windows
^include <Classes.hpp> Mnclude <Controls,hpp> #include <StdCtrls.hpp> ^include <Forms.hpp> ^include <ExtCtrls.hpp>
class TMainForm : public TForm
{ |
|
|
|
|
_ _published: |
II |
компоненты, управляемые средой (объекты VCL) |
||
TLabel VnputLabel; |
|
|||
TLabel *OutPutLabel; |
|
|||
TBevel ""Bevell; |
|
|
||
TEdit |
4nputEdit; |
|
|
|
TEdit *OutPutEdit; |
|
|||
TButton *NextButton; |
|
|||
TButton *ExitButton; |
|
|||
void _ Jdstcall |
FormActivate(TObject *Sender); |
|||
void |
J'astcall InputEditKeyPress(TObject ^Sender, char iScKey); |
|||
void _ Jastcall |
NextButtonClick(TObject |
""Sender); |
||
void _Jastcall |
ExitButtonClick(TObject |
^Sender); |
||
private: |
|
II |
объявления пользователя |
|
public: |
|
II |
объявления пользователя |
_ J'astcall TMainForm(TComponent* Owner);
};
extern PACKAGE TMainForm *MainForm; #endif
Затем на третьем этапе будут программироваться обработчики событий, в результате чего будет получен файл MainUnit.cpp:
^include <vcl.h> ^pragma hdrstop Mnclude <math.h> ^include <stdlib.h> ^include «MianUnit.h»
#pragmapackage(smart_init) ^pragma resource ' *.dfm' TMainForm *MainForm;
Jastcall TMainForm: :TMainForm(TComponent* Owner) : TForm(Owner) { } // конструктор формы
//обработчик события «активация формы»
void _ J'astcall TMainForm: :FormActivate(TObject "^Sender)
{
NextButton->Enabled=false; II дезактивировать кнопку Следующее
InputEdit'>Readonly =false; II разрешить ввод в Редактор ввода
189