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

Информатика в техническом университете / Информатика в техническом университете. Объектно ориентированное программирование

.pdf
Скачиваний:
105
Добавлен:
06.03.2018
Размер:
9.48 Mб
Скачать

4. Создание приложений 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