Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
база данных.docx
Скачиваний:
167
Добавлен:
24.03.2015
Размер:
5.83 Mб
Скачать

11.4. Разработка приложения

С++ Builder относится к системам визуального программирования, назы­ваемым также системалм RaD (Rap d Application Development, быстрая раз­работка приложений). Pajpa6oTKa приложения в С++ Builder включает два взаимосвязанных этапа:

  • создание пользовательского интерфейса приложения;

  • определение функциональности приложения.

Пользовательский интерф( ис приложения опреде ч чет спсх об взаимодействия ноль ювателя и приложения, т. е. внешний вид формы (форм) при выполнении приложения и то, каким образом пользоват ель управляет приложением. Интер­фейс кочет руируется пут ем размещения в форме компонентов, называемых ин­терфейсными компонентами или элементами управления. Создается пользова тельский интерфейс при тожения с помощью окна Формы, которое в среде раз­работки представляет собой модель формы времени выполнения.

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

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

Пример простейшего приложения

Создадим для примера простейшее приложение. Слово «создадим» в дан­ном случае является не совсем точным, г. к. создавать и т ем более программи­ровать не придется вообще ничего: С++ Builder изначатьно предоставляет готовое приложение, состоящее из одной формы.

Сразу же после создания нового приложения С++ Builder предлагает раз­работчику «пустую» форму. Данная форма не является пустой в буквальном смысле слова - она содержит основные элементы окна Windows: заголовок Forml, кнопки сворачивая ш, разворачивания и закрытия окна, изменения размеров окна и кнопку вызова системного меню окна. Именно эта форма отображается при первом запуске С++ Builder в окне формы.

Любое приложение Windows выполняется в соответс твующем окне. Даже если оно ничего не делает в смысле функциональности, т. е. является пустым, то все равно до.чжно иметь свое окно. С++ Builder — это среда разработ ки приложений под Windows, поэтому для любого разрабатываемого приложе­ния автоматически предлагается окно (форма), для которой уже созданы два фалла — с описанием и модулем.

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

IIpoi тейшее приложение представляет из себя заготовку или каркас, обес­печивающий разработчика всем необходимым для кажд< >го приложения во обще. Так, не нужно писать свой обработчик событий клавиатуры или драй­вер мыши, а также создавать пакет процедур для работы с окнами. Более того, нет необходимости интегрировать драйвер мыши с пакетом для работы с ок­нами. Эти все уже выполнена создателями С++ Builder, и каркас приложения представляет собой полностью завершенное и функционирующее приложе­ние, которое никаких действий не производит.

Отметим, что окно (а вместе с ним и приложение) действительно ничего не делает с точки зрения пользователя — оно не предостав тяе т функциональ­ности, специфичной для каждого приложения. Вместе с гем это пустое окно выполняет достаточно бо. [ыпую работу с точки зрения npoi раммиста. Напри­мер, оно ожидает действий пользователя, связанных с мышью и клавиагу рой, и peai ирует на изменение своего размера, перемещение, закрытие и не­которые другие команды.

В полной мере оценить эти возм< >жност и окна можег только программист, который писал приложения под Windows традиционным спосебо i, г. е. вруч ную и без IDE. Изнутри Windows представляет собой систему с индексами, кон текстами, обратными вызовами и множеством других сложнейших элемен­тов, которые надо знать, которыми нужно управлять и в которых легко запу­таться. ()днако поскольку эти элементы имеют ся в каждом функционирующем приложении Windows, достаточно написать их один раз и в дальнейшем уже пользоваться готовыми блоками. Именно это и осуществляет система С++ Builder, избавляя тем самым программиста от сложной рутинной работы.

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

При конструиров 1нии приложения разработчик добав тлет к простейше­му приложению новые формы, управляющие элементы, а также новые обра­ботчики событий.

Создание пользовательского интерфейса

Пользовательский интерфейс приложения составляют компоненты, кото­рые ра .работчик выбирает в Палитре компонентов и размещает в форме. При конструировании интерфейса приложения действует принцип WYSIWYG (What You See Is What You Get — «что видите, то и получаете»), и разработ­чик при создании приложения видит форму почти такой же, как и при его выполнении

Компонелты являются струкгурными единицами и делятся на визуаль ные (видимые) и невизуальные (системные). При /том понятия «видимый» и «невидимый» относятся только к этану выполнения, на этане проектирова­ния видны все компоненты приложения.

К визуальным компонентам относятся, например, кнопки, списки или пе­реключатели, а также собственно форма Так как с помощью визуальных ком нонентов пользователь управляет приложением, их также называют управ ляющими компонентами или элементами управления. Именно визуальные компоненты oi)разуют чо. [ьзовательский интерфейс при тюженич.

К невизуальньш компонентам относятся компонент ы, выполняющие вспо­могательные, но не менее важные действия, например, таймер Timer (позво­ляет отсчит ывать интервалы времени).

При создании интерфейса приложения для каждого компонента выпол • няются следующие операции:

  • выбор компонента в Палитре компонентов и размещение его в форме;

  • изменение свойств компонента.

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

Выбор компонента в Пали гре компонентов выполняется щелчком мыши на нужном компоненте, например на кнопке Button, в результате чего его значок принимает утопленный (нажатый) вид. Если после этого щелкнуть на сво6< >д- ьом месте Формы, то на ней появляется выбранный компонент, а его значок в Палитре компонентов принимает обычный (ненажатый) вид. Значки компо­нентов от ражают назначение компонент ов, и при наличии небольших практи­ческих навыков выбор нужного компонента происходит достаточно быстро. Кроме того, при наведении на каждый компонент указателя мыши отобража­ется всплывая ицая подсказка с информацией о его назначении.

Обозначения классов (типов объектов) в С++ Builder, в том числе компо­нентов, начинаются с буквы Т. Иногда типы (TButtuil, TLabel) используются вместо имен (Button, Label) для обозначения компонентов. Мы будем исполь зовать для компонентов имена или типы в зависимости от ситуации.

После размещения компонента в форме система C+i- Builder автоматически вносит изменения в файлы моду тя и предст авления формы. В описание класса формы (заголовочный файл модуля формы) для каждого нового компонента добавляется строчка формата

<Тип компонента> *<Имя компонента^

Имя нового компонента является значением его свойства Name, а тип со­впадает с типом выбранного в Палитре компонента. Например, для кнопки Button 1 эта строчка первоначально будет иметь вид: TButton *Button1;

В файле представления для кнопки Button может быть записан следую­щий код:

object Button 1: TButton Left= 98 Top= 110 Wirtth=75 Height= 25 Caption= 'Button1' TabOrder= 0 end

13 За к 474

Для размещения в форме нескольких одинаковых компонентов удобно перед выбором компонента в Палитре компонентов нажать и удерживать кла­вишу <Shift>. В этом случае после щелчка мыши в облает и формы и разме­щения там выбранного компонента его значок в Палитре остается утоплен­ным, и I аждый последующий щелчок в форме приводит к появлению в ней еще одного такого же компонента. Для отмены выбора этого компонента дос­таточно выбрать другой компонент- или щелкнуть мышью на изображении стре. 1ки в левом углу Палитры компонентов.

После размещения компонента в форме можно с помощью мыши изменять его положение и разм( ры. В случае нескольких компонентов можно выно пня гь выравнивание или перевод того или иного компонента на передний или зад­ний пиан. При этом действия разработчика не отличаются от действий в среде обычного графического редактора. Одновременно выделить в форме несколь­ко компонентов можно щелчками мыши на них при нажатой клавише <Shift>.

По умолчанию компоненты выравниваются в форме по линиям сетки, что определяет флаж< «с Snap to grid (Выравнивать по сетке), входящий в набор парам» тров интегрированной среды разработки. В ряде спучаев эгот флажок приходится отк почать, например, при плотном размещении компонентов в форме. По умо. 1чанию niai сетки равен восьми пикселам, а сетка при проек гировании отображается на поверхности формы. Необходимость выравнива­ния по се гке. видимость сетки (флажок Display grio (Отображать сетку)) и размер шага сетки по гооизонтали и вертикали устанавливаются на вкладке Designer (Конструктор) диалогового окна Environment Options (Парамет­ры среды), вызываемого одноименной коман юй меню Tools (Средства).

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

Рис. 11.7. Доступ к свойствам компонента

j Object; Inspector

£5

c":. Forml

BHDl

Button*

TButton

J

Properties

Event;

■ ■

[□Action

OK 1

f Action

I"

Caption

m

j Engblf

J

true

ti

|AII Hiown

Б

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

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

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

Управление свойствами в процессе проектирования заклк чается в изме­нении значений свойств компонентов непосредственно в окне формы («ри­сование») или с помощью Инспектора объектов.

Разработчик может изменить значение свойства компонента, введя или выбрав нужное значение. При этом одновременно изменяется соответствую­щий компонент, т. е. уже при проектирсчании видны результаты сделанных изменений. Например, при изменении заголовка кнопки (свойство Caption) оно сразу же отображается на ее поверхности.

Для подтверждения нового значения свойства достаточно нажать клави­шу <Enter> или перейти к другому свойству или компоненту. Отмена изме­нений производится клавишей <Esc>. Если введено недопустимое для свой­ства значение, то выдается предупреждающее сообщение, а изменение значения отвергается. Изменения свойств автоматически учитываются в фай ле описания формы, используемом компи штором при создании формы, а при изменении свойства Name изменения внося гея и в описание класса формы.

Для большинства свойств компонентов (например, для свойств Color (цвет), Capt.on (заголовок) и Visible (видимость)) имеются значения по умолчанию.

Для обращения к компоненту в приложении предназначено свойство Name, первоначальное значение которого образуется автоматически следу­ющим образом: к имени компонента добав. шется его номер в порядке поме­щения в форму. Например, первая кнопка Button по аучает имя Button 1, вто- оая — Button2 и т. д. Первоначально от значения свойства Name получает свое значение и свойство Caption.

Обычно разработчик предпочитает дат ь компонентам более информатив­ные имена, чем имена по умолчанию. При этом целесообразно включать в имя данные о типе компонента и его назначении в приложении. Так, кнопке типа TButton, предназначенной для закрытия окна, можно присвоить имя btnClose или ButtonClose. Каждый разработчик самостоятельно устанавливает удоб­ные правила именования компонентов. Для простоты мы будем часто исполь­зовать имена, назначаемые по умол"анию. например. Forml, Button 1 или Editl.

Значения свойств. < вязанных с размерами и положением компонента (на­пример, Left и Тор), автоматически изменяются при перемещении компонен­та мышью и настройке его размеров.

Если в форме выделено несколько компонентов, то в окне Инспектора объектов доступны свойства, общие для всех этих компонентов. При этом сделанные в окне Инспектора объектов изменения действ} ют на все выде­ленные компоненты.

Для установки значений свойств в Инспекторе объектов используются подключающиеся автоматически редакторы свойств:

  • простой (текстоьый) — значение свойства вводится или редактируется как обычная строка символов, которая интерпретируется как числовой или строковый тип С++ Builder; используется для таких свойств, как Caption, Lett, Height и Hint;

  • nept шсляемыи — значение свойства выбирается в раскрыьающемся спис­ке. Список раскрывается щелчком на стрелке, которая появляется при установке указателя мыши в области значения свойства. Можно не вы- бира гь нужное значение, а ввести его с клавиатуры, однако на практике это обычьо не делается, т. к. допускаются только предлагаемые значения. Кроме того, возраст ает трудоемкость и увеличивается вероятность ошиб­ки. Испо. гьзуется для таких < чойств. как FormStvIe, Visible и ModalResult;

  • множественный — значение свойства представляет собой комбинацию значений из предлагаемого множества. В окне Инспектора объектов сле­ва от имени свойства множес гвенного типа стоит знак << +». Формирова­ние значения свойства выполняется с помощью дополнительного спис­ка. раскрываемого двойным щелчком на имени свойства. Э тот список содержит перечень всех допустимых значений свойства, справа от каж­дого значения можно указать true или false. Выбор true означает, что дан­ное значение включается в комбинация) значений, a false — нет. Исполь­зуется для таких свойств, как Borrierloons и Anchors;

  • обдекта — свойство является объектом и, в свою очередь, содержит другие свойства (подсвойства), каждое из которых можно редактиро­вать отдельно. Используется для т аких свойств, как Font, Items и Lines. В области значения свойства-объекта в скобках указывается тип объек­та, например, (TFont) или (TSrings). Для свойства-объекта слева от имени может стоять знак «+», в этом случае управление его свойства­ми выполняется так же, как и для свойства множественного типа, т. е. через раскрывающийся список. Этот список в левой части содержит имена подсвойств, а в правой — значения, редактируемые обычным

11. Borl \na С++ Puiidet 330

способом. В области значения может отображаться кнопка с тремя точ­ками. Это означает, что для данного с войства имеется специальный редактор, который вызывается нажагием этой кнопки. Так, для свой­ства Font открывается стандартное окно Windows для установки па­раметров шрифта.

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

RI Jtton 1 - >Caption = "OK";

Такой способ требует, однако, больше] о объема работ, чем в случае исполь­зования Инспектора объектов, кроме того, подобные установки вступают в силу только во времи выполнение приложения и на этапе ра {работки не вид ны, что в ряде случаев затрудняет управление визуальными компонентами. Тем не менее, для наглядности во многих примерах значения отдельных свойств мы будем устанавливать с помощью операторов присваивания, а не через Инспектор объектов.

Отметим, что есть свойст ва времени выполнения, недоступные через Инс­пектор объектов, с которыми можно работать только во впемг выполнения приложения. К таким свойствам относятся, например, число записей RecordCount набора данных или поверхность рисования Canvas визуально го компонента.

Определение функциональности приложения

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

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

Допустим, что при создании интерфейса приложения в форме была раз­мещена кнопка Button, предназначенная для закрытия окна По умолча­нию эта кнопка получила имя и заголовок Button 1, однако заго товок (свой­ство Caption) с помошью окна Инспектора объектов было заменено более осмысленным — ОК. При выполнении приложения кнопку Buttonl мпж но нажимат ь с помощью мыши или к павиатуры. Кнопка отображает нажа тие визуально, однако никаких действий, связанных с закрытием формы, не выполняется. Подобное происходит потому, что для кнопки не опреде­лена реакция на какие-либо действия пользователя, в том числе и на ее нажатие.

Чтобы кнопка могла реагировать на то или иное < обытие, для него необхо­димо создать и пи указать процед> ру обработки, которая будет вызываться при во шикновении этого события. Для создания процедуры обработки со­бытия, или обработчика, нужно прежде всего выделить в форме кнопку и пе­рейти на страницу Events (События) окна Инспектора объектов, где указы­ваются все возможные для данной кнопки собьп ия (рис. 11.8).

[object Inspector

f'r.Forml Я [НП

| Button! ШиКзп

Properties Ь vents

  • ? г'

  • OK II

Action

н

OnLnck

Button!Cue jJ-'

OnCoi itextPof.

OnPragDrop j

.ill

|AII shown Л

Рис. 11.8. Доступ к событиям компонента

Так как при нажатии кнопки возникает событие OnClick, следует создать обработчик именно этого события. Нужно сделать двойной щелчок в об тасти значения события OnClick, в результате С++ Builder ав гоматически создает в модуле формы заготовку процедуры-обработчика. При этом окно Редактора кода переводится на передний план, а курсор устанавливас гея в то место про цедуры, где программист должен написать код, выполняемый при нажатии кнопки Button 1. Поскольку при нажатии кнопки ОК должно закрываться окно, то в этом месте можно указать Form 1 ->С1оье() или просто CloseQ. Фай­лы в составе mi >дуля формы будут иметь следующий вид:

Заголовочный Файл:

//

#ifndefUnitlH#defineUmtlH

#include <Classes.hpp> «include <Controls.hpp> #.nclude <StdCtrls.hpp>

#include <Forms.hpp>

//

class TForml : public TForm{

published: 11 IDE-managed Components

// Объявление объекта кнопки типа TButtonс именем OK TButton*ОК;

IfЗаголовок процедуры обработчика void _fastcall OKCIick(TObject *Sender); private:// User declarations public:// User declarations

_ fastcall TForml (TComponent* 0wn3r);};

//

extern PACKAGE TForml *Form1;

//

#endif

Файл реализации:

//

#include <vcl.h> #pragma hdrstop

#include "Unitl .h"

//

#pragma package(smart_init) #pragma resource "*.dfm" TForml *Form1;

//

_ fastcall TForml ::TForm1 (TComponent* Owner)

: TForm(Owner){

}

//

void _fastcall TForml ::OKCIick(TObject *Sender) {

Form1->Close();

}

//

Здесь полужирным начертанием выделен код, набранный программис­том; все остальное среда С++ Builder создала автоматически, в том числе и включение заголовка процедуры-обработчика в описание класса фпрмы Formt.

В обработчике событий (приведенном в примере и в других обработчи­ках) параметр Sender указывает на компонент, который получил событие и вызван обработчик. Иногда полезно иметь общий обработчик для разных объектов, который ведет себя по-разному в зависимости от класса вызвавше- 1 о его объекта. В такой ситуации использование параметра Sender может быть очень полезным. Заметим, что в заголовках функции он объявлен как указа тель на объект типа TObject в виде TObjec* '"Sender.

Класс TObject является базовым классом для всех классов в С++ Builder, но в нем нет < войств, пригодны к к использованию в обработчиках событий. В этой связи при необходимости обращения к некоторым свойствам обьектов нужно выполнять приведение типа параметра Sender к к дассу, в котором нуж­ные свойства об-.явлены

К примеру, пусть в обработчике требуется задать клманду, помещающую в однострочный редактор Edit текст Выполнен щелчок на компоненте <имя компонентах Имя компонента определяется значением его свойства Name Поскольку в классе TObject это свойст во отсутствует, тин параметра нужно приводить к классу TComponent. в котором это свойство появ ляется впер­вые, или к любому его наследнику, например TControl. В результате решаю щий поставленную задачу оператор можно записать в виде:

Editl ->Text="Выполнен щелчок.® компоненте "Ч ((ГСотрогк :nt *)Sender)->Name.

или

Editl ->Text = "Выполнен щелчок на компоненте "+((TControlu)Sender)-^Name;

Здесь выражения ((TComponent *)Sonder) и ((TControl *)Sender) задают приведение типа параметра Sender к типу указа геля на объект соответству­ющего класса.

Среда С Builder обеспечивает автомат изацию набора кода при вызове свойств и методов объектов и записи стандартных конструкций языка С++. Так, после указания имени объекта и разделяющего знака > автоматически появляется список (рис. 11.9), содержащий дост упные свойства и методы это­го объекта. При необходимости с помощью комбинации клавиш <Ctrl>+<npo6e. t > можно обеспечить принудительный вызов этого списка. Имя выбранного свойства или метода автоматически добав. шется справа от знака >. Если метод содержит параметры, то отображается подсказка, содержащая состав и типы параметров.

Перечень стандартных конструкций языка вызывается нажатием комби­нации клавиш <Ctrl>-t <J>. После выбора требуемой коне грукции автома­тически добавляется ее код. Например, при выборе оператора for в коде по­явится следующий текст:

for (;;)

Имя обработчика TForml "OKCIick образуется прибавлением к имени ком­понента имени события без префикса On. Это имя является значением собы­тия, для которого создан обработчик, в нашем случае — для события OnClick

Unitl upp I

Г4- ■

Erticl-> }

//

p operty bnol TEdn SiutoS elect

uiopeit;i buol TEdit :AutoSize

propert'i TBevelEdge- TEdil Beveltdge:

property TBevdCut TEdil.. BewOlnni

rrcpeit. TPevelKirid TE*lil..l II

i

J

Jji27 (3 |Mn«!d Inert ■ \UriiH - срр /и nill. hjpiagiam'f

Рис. 11.9. Список свойств и методов объекта Editl

нажатия кнопки с именем ОК. При изменении через окно Инспектора объек­тов имени кнопки происходит автоматически переименование этой процеду­ры во всех файлах (.dfin и .срр) проекта.

Аналогично создаются ооработчики для других событий и доугих компо­нентов. Более подробно события рассматриваются при изучении соответству­ющих компонентов.

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

При удалении какого-либо компонента все его непустые обработчики ос­таются в м« >дуле формы.

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

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