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

книги / Объектно-ориентированное программирование

..pdf
Скачиваний:
11
Добавлен:
12.11.2023
Размер:
16.61 Mб
Скачать

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, OnDbICIick - при обычном и двойном нажатии клавиш мыши соответственно;

OnMouseMove - при перемещении мыши (многократно); OnMouseDown, OnMouseUp - при нажатии и отпускании клавиш мыши;

п р и п е р е т а с к и в а н и и о б ъ е к т а м ы ш ь ю : OnDragDrop - в момент опускания объекта на форму;

OnDragOver - в процессе перетаскивания объекта над формой (многократно); д р у г и е ;

OnHelp - при вызове подсказки;

OnChange - при изменении содержимого компонент.

Список событий более простых компонент сущ ественно короче, например, метка (класс TLabel) может реагировать на 9 событий:

181

4. Создание приложений Windows

OnClick, OnDblClick, OnM ouseDown, OnM onseUp - события мыши; OnD ragD rop, OnD ragO ver, O nEndDrag, O nStartD rag - события при

перетаскивании объекта мышью.

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

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

Таким образом, в Delphi и C++ Builder разработчику предоставляются средства визуального проектирования интерф ейса и некоторы е вспом огательны е средства (в виде библиотеки классов) разработки содержательной части задания.

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

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

Существуют и особенности выполнения самих этапов разработки. Рассмотрим два примера.

П ример 4.1. Приложение «Возведение чисел в квадрат» (вариант 1). Пусть необходимо разработать приложение, которое должно осуществлять последовательный ввод вещественных чисел (с проверкой правильности вводимых чисел) и возведение вводимых чисел в квадрат.

Анализ .

1. Разработку начинаем с анализа задачи с целью определения основных состояний интерфейса.

Для данной задачи можно использовать интерфейс с тремя состояниями: а) исходное состояние, в котором приложение ожидает ввода числа,

которое необходимо возвести в квадрат; б) состояние вывода результата;

в) возможное состояние вывода сообщ ения об ошибочном вводе исходного числа.

2. Для каждого состояния продумываем внеш нее представление (экранную форму), т.е. вид окна приложения в каждом случае (рис. 4.11).

182

4.3. Технология разработки приложений Windows

Состояние ввода

Состояние вывода результата

Состояние вывода сообщения об ошибке

_

Возведение в квадрат [= .

В в е д и те зн а ч е н и е :

Следующее

I

т

Введенная строка содержит неверные символы.

ОК

Рис. 4.11. Экранные формы

3.Разрабатываем граф состояний интерфейса, отражающий возможные варианты смены состояний (рис. 4.12).

4.Выполняем объектную декомпозицию интерфейсной и предметных частей приложения. Интерфейсная часть включает два объекта: главное окно приложения и окно сообщения об ошибке. Предметная часть очень проста и может быть реализована без выделения объектов (рис. 4.13).

183

4. Создание приложений Windows

Активизировать

П р о е к т и р о в а н и е .

 

Главное окно

1.

Логическое проектирование и

 

разработка структуры классов выполняется

 

приложения

 

с использованием среды разработки Delphi.

 

ч____________ /

 

а)

Вначале организуем новый прое

Активизировать

и, используя визуальную технологию ,

 

 

 

Сообщение

создаем окно главной формы (рис. 4.14).

 

При этом среда автоматически строит

 

об ошибке

 

S____________ >

описание класса TForml, наследуемого от

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

библиотечного класса TForm, и включает в

него объектные поля визуальных компонент,

 

 

 

 

руководствуясь эскизом экранной формы,

б)

С помощью Инспектора Объектов настраиваем параметры формы

компонент следующим образом:

Forml:

Name:=MainForm; Caption:=’Возведение числа в квадрат’;

Labell:

Name:=’InputLaber; Сарйоп:=’Введите значение’;

ЬаЪеП:

Name:=OutPutLabel; Сарйоп:=’Квадрат значения равен:’;

Editl:

Name:=InputEdit;

EdU2:

Name:=OutPutEdit;

Enable:=false;

ReadOnly:=true;

Возведение в квадрат

TForm TBevel 'TEdit 'TLabel 'TButton

Рис. 4.14. Проектирование главного окна приложения

184

4.3. Технология разработки приложений Windows

Методы:

Form Activate

InputEditKeyPressed

NextButtonClick

ExitButtonClick

Рис. 4.15. Диаграмма классов интерфейса приложения

Buttonl:

Name:=NextButton;

Сарйоп:=’Следующее’;

Button2:

Name:=ExitButton; Caption.- ’Выход ’;

Д иаграм м а класса TM ainForm , построенного при визуальны м проектировании, представлена на рис. 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, в.

Обработчик события СЗ - «нажатие кнопки Выход» (On Click для кнопки Выход) должен закрывать окно приложения.

Обработчик события С4 - «нажатие кнопки Следующее» (On Click для кнопки Следующее) должен вновь настраивать интерфейс в соответствии с экранной формой, изображенной на рис. 4.11, а.

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

г)

Решаем, что окно сообщения об ошибке отдельно проектировать н

будем: для его отображения используем специальную функцию MessageDlg.

2.

Физическое проектирование или разбивку программного продукта н

модули среда Delphi выполнит автоматически, поместив класс формы в отдельном модуле.

Э в о л ю ц и я .

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

Unit MainUnit;

Interface

Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dia­

logs, StdCtrls, ExtCtrls;

 

Type TMainForm = class(TForm)

{Класс «Главная форма»}

Bevell: 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 *.DFM}

{обработчик события «активация формы»}

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 Key: Char);

Varx.real;Code:integer; Begin

if Key=#13 then { если нажата клавиша Enter, то} begin

Key: =#0; {предотвратить звуковой сигнал при вводе символа перехода на следующую строку в однострочном редакторе}

ValflnPutEdit. Text,х,Code); {преобразовать введенную строку в число}

if Code=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

MessageDlgf Значение содержит недопустимые символы. mtError, [тЬОк], 0); {показать окно Сообщение об ошибке}

end End;

{обработчик события «нажатие кнопки Следующее»}

Procedure TMainForm.NextButtonClick(Sender: TObject); Begin

FormActivate(NextButton); {вернуться к исходным настройкам интерфейса}

End;

{обработчик события «нажатие кнопки Выход»}

Procedure TMainForm.ExitButtonClick(Sender: TObject); Begin Close; {закрыть окно приложения и завершить его}

End;

End.

Основная программа (проект) в процессе разработки с использованием среды Delphi создается автоматически и выглядит следующим образом:

Program Examplel;

Uses Forms, MainUnit in 'MainUnit.pas' {MainForm}; {$R *.RES}

Begin

Application.Initialize; {инициализация приложения}

Application.CreateForm(TMainForm, MainForm); {создание формы}

Application.Run; {запуск цикла обработки сообщений}

End.

В процессе компиляции программы будут участвовать следующие файлы:

*.dpr - файл проекта программы - исходный текст на Pascal (создается автоматически);

*.pas - файлы, содержащие исходные модули программы (в том числе модули форм);

*.dfm - текстовые файлы описания форм.

В результате - будет получен файл .ехе программы и целый ряд вспомогательных файлов.

Пример 4.2. Приложение «Возведение чисел в квадрат» (вариант 2).

Если использовать для разработки той же программы среду C++ Builder, то первые два этапа будут выполняться идентично, хотя описание класса TMainForm будет автоматически создано на C++ в файле MainUnit.h:

ftifiidefMain UnitH ttdefme MainUnitH

1SS

4.3. Технология разработки приложений Windows

Mnclude <Classes.hpp> #,include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> Mnclude <ExtCtrls.hpp>

class TMainForm:public TForm

{

_ published: II компоненты, управляемые средой (объекты VCL)

TLabel *InputLabel; TLabel *OutPutLabel; TBevel *Bevell; TEdit *InputEdit; TEdit *OutPutEdit; TButton *NextButton; TButton *ExitButton;

void _ _fastca.ll FormActivate(TObject *Sender);

void _ Jastcall InputEditKeyPress(TObject *Sender, char &Key); void _ Jastcall NextButtonClick(TObject *Senderj;

void _ Jastcall ExitButtonClick(TObject *Sender);

private:

II объявления пользователя

public:

И объявления пользователя

_ Jastcall TMainForm(TComponent* Owner);

};

extern PACKAGE TMainForm *MainForm; ttendif

Затем на третьем этапе будут программироваться обработчики событий, в результате чего будет получен файл MainUnitcpp:

Mnclude <vcl.h> ^pragma hdrstop Mnclude <math.h> Mnclude <stdlib.h> Mnclude «MianUnit.h»

&pragmapackage(smart init) ttpragma resource ' *.dfm' TMainForm *MainForm;

Jastcall TMainForm::TMainForm(TComponent* Owner)

:TForm(Owner) { } // конструктор формы

//обработчик события «активация формы»

void _ Jastcall TMainForm::FormActivate(TObject *Sender)

{

NextButton->Enabled=false; Идезактивировать кнопку. Следующее

InputEdit->ReadOnly=false; Иразрешить ввод в Редактор ввода

189

{ CloseQ;}

4. Создание приложений Windows

InputEdit->Enabled=true;

II активизировать Редактор ввода

InputEdit->Clear();

// очистить Редактор ввода

InputEdit->SetFocus();

// установить фокус на Редактор ввода

OutPutEdit-> Visible=false;

// скрыть Редактор вывода

OutPutLabel-> Vtsible=false;

// скрыть Метку редактора вывода

}

//обработчик события «нажатие клавиши Enter при вводе значения» void _Jastcall TMainForm::InputEditKeyPress(TObject *Sender,

char &Key)

{float x;

if (Key=='\r')

 

// если введен символ «конец строки», то

{Key='\0';

 

// предотвратить выдачу звукового сигнала

try

//

выполнить, контролируя возникновение исключений

{x=StrToFloat(InputEdit->Text);

И преобразовать в число

InputEdit->Readonly=true;

//

запретить ввод в Редактор ввода

InputEdit->Enabled=false;

 

//

дезактивировать Редактор ввода

OutPutLabel-> Visible=true;

// показать Метку вывода

OutPutEdit-> Visible=true;

 

//

показать Редактор вывода

OutPutEdit->Text=FloatToStr{x*x); И вывести результат в Редактор

NextButton->Enabled-true;

 

вывода

// активизировать кнопку Следующее

NextButton->SetFocus();

// установить фокус на кнопку Следующее

}

 

 

 

перехватить исключение преобразования

catch (EConvertError&) И

{TMsgDlgButtons SJ;

// объявить объект класса «множество»

Sl«m bO K ;

 

// занесения кода кнопки ОК во множество S1

MessageDlg("Строка содержит недопустимые символы. ”,

mtError, S1, 0);

И вывести окно Сообщение об ошибке

}

}

}

И обработчик события- «нажата кнопка Следующее»

void _ Jastcall TMainForm::NextButtonClick(TObject *Sender)

{ FormActivate(NextButton); II вернуться к исходным настройкам

}

Иобработчик события «нажата кнопка Выход»

void _ Jastcall TMainForm::ExitButtonClick(TObject *Sender)

// завершить работу приложения

Файл проекта Examplel.cpp C++Builder также создает автоматически:

#include <vcl.h> #pragma hdrstop

USERES(“Example1.res ”); // включить файл ресурсов

190