БГУ Пособие - Программирование в C++ Builder. Учебное пособие по курсу методы программирования для студентов специальностей
Скачать 1.24 Mb.
|
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ МЕХАНИКО-МАТЕМАТИЧЕСКИЙ ФАКУЛЬТЕТ Кафедра численных методов и программирования ПРОГРАММИРОВАНИЕ В С++ BUILDER Учебное пособие по курсу «МЕТОДЫ ПРОГРАММИРОВАНИЯ» для студентов специальностей G31 03 01 «Математика», G31 03 03 «Механика» Минск 2007 2 УДК 004.43(075.8) ББК 32.973.26-018.1я73 Б69 А в т о р ы : В. С. Романчик, А. Е. Люлькин Р е ц е н з е н т ы : старший преподаватель Н. А. Аленский, кандидат физико-математических наук, доцент, зав. кафедрой информацион- ных технологий БГУК П. В. Гляков кандидат физико-математических наук, доцент С. В. Суздаль Рекомендовано Ученым советом механико-математического факультета БГУ 2006 года, протокол № ___ Программирование в C++ BUILDER: учебное пособие для студ. механико-матем. фак. / В. С. Романчик, А.Е.Люлькин. Мн.: БГУ, 2007. –126 с. ISBN 985-485-498-1. В пособии рассматриваются вопросы, относящиеся к использованию технологии объект- но-ориентированного программирования в системе C++ Builder. Описание методологии по- строения классов и использования компонентов сопровождается многочисленными примерами. Предназначено для студентов 2-го курса механико-математического факультета, изучающих курс «Методы программирования». УДК 004.43(075.8) ББК 32.973.26-018.1я73 ©Романчик В.С., Люлькин А.Е. ISBN 985-485-498-1 БГУ, 2007 3 ВВЕДЕНИЕ Основные характеристики С++Builder. C++Builder включает язык C++, компилятор, интегрированную среду разработки приложений IDE (Integrated Development Environment), отладчик и различные инструмен- ты. C++Builder содержит комплект общих элементов управления, доступ к Windows API, библиотеку визуальных компонентов VCL (Visual Com- ponent Library), компоненты и инструменты для работы с базами данных. C++Builder добавляет к процессу программирования на языке C++ возможность быстрой визуальной разработки интерфейса приложений. Кроме библиотек OWL (Object Windows Library) и MFC (Microsoft Foundation Classes), он использует библиотеку VCL и позволяет включить в форму диалоги с пользователем, оставляя разработчику для реализации только функциональную часть, воплощающую алгоритм решения задачи. C++Builder имеет общую с Delphi библиотеку классов, часть из которых осталась написанной на языке Object Pascal. Благодаря этому, а также включению в С++Builder компиляторов С++ и Object Pascal, в приложениях можно использовать компоненты и код, написанные на Object Pascal, а также формы и модули Delphi. Компоненты C++Builder. Создание пользовательского интерфейса приложения заключается в добавлении в окно формы объектов, назы- ваемых компонентами. C++Builder позволяет разработчику создавать собственные компоненты и настраивать Палитру компонентов. Компоненты разделяются на видимые (визуальные) и невидимые (невизуальные). Визуальные компоненты появляются как во время выполнения, так и во время проектирования. Невизуальные компоненты появляются во время проектирования как пиктограммы на форме. Они не видны во время выполнения, но обладают функциональностью. Для добавления компонента в форму можно выбрать мышью нужный компонент в Палитре компонентов и щелкнуть левой клавишей мыши в нужном месте проектируемой формы. Компонент появится на форме, и далее его можно перемещать и изменять. Каждый компонент C++ Builder имеет три характеристики: свойства, события и методы. Инспектор объ- 4 ектов автоматически показывает свойства и события, которые могут быть использованы с компонентом. Свойства являются атрибутами ком- понента, определяющими его внешний вид и поведение. Инспектор объ- ектов отображает опубликованные (published) свойства компонентов на странице свойств (properties) и используется для установки published- свойств во время проектирования. Для изменения свойств компонента во время выполнения приложения нужно добавить соответствующий код. Помимо published-свойств, компоненты могут иметь открытые (public) свойства, которые доступны только во время выполнения приложения. Рис. 1. Окно Инспектора объектов События. Страница событий (Events) Инспектора объектов показывает список событий, распознаваемых компонентом и возникающих при изменении состояния компонента. Каждый экземпляр компонента имеет свой собственный набор функций - обработчиков событий. Создавая обработчик события, вы поручаете программе выполнить указанную функцию, если это событие произойдет. Чтобы добавить обработчик события, нужно выбрать компонент, затем открыть страницу событий Инспектора объектов и дважды щелкнуть левой клавишей мыши рядом с событием. Это заставит C++ Builder сгенерировать текст пустой функции с курсором в том месте, где следует вводить код. Далее нужно ввести код, который должен выполняться при наступлении данного события. 5 Среда разработки (IDE). C++ Builder представляет собой приложение, главное окно которого содержит меню (сверху), инструментальную панель (слева) и Палитру компонентов (справа). Помимо этого при запуске C++ Builder появляются окно Инспектора объектов и окно Object TreeView (слева), а также форма нового приложения (справа). Под окном формы приложения находится окно Редактора кода. Рис. 2. Главное окно интегрированной среды разработки Создание приложений в С++Builder. Первым шагом в разработке приложения C++ Builder является создание проекта. Чтобы создать новый проект, нужно выбрать пункт меню File|New| Application. C++ Builder создает файл Project.bpr, а также головной файл проекта Project.cpp, содержащий функцию WinMain(). Функция WinMain() в Windows-приложениях используется вместо функции main(). При добавление новой формы C++ Builder обновляет файл проекта и создает следующие дополнительные файлы: • файл формы с расширением .dfm, содержащий информацию о форме; • файл модуля с расширением .cpp, содержащий код на C++; • заголовочный файл с расширением .h, содержащий описание класса формы. 6 Для того чтобы откомпилировать текущий проект, нужно выбрать пункт меню Compile. Для того чтобы откомпилировать проект и создать исполняемый файл, из меню Run нужно выбрать пункт Run. В результате выполнения будет получена следующая форма: Рис. 3. Результат выполнения приложения Структура файла проекта. Для каждого приложения C++Builder создается xml-файл проекта Project.bpr и файл ресурсов. Еще один файл - головной файл проекта, содержащий функцию WinMain(), генерируется при выборе пункта меню File|New Application. Первоначально по умол- чанию этому файлу присваивается имя Project1.cpp. Если в процессе раз- работки приложения добавляются формы и модули, C++Builder обновля- ет файл. Для просмотра файла следует выбрать пункт меню Project|View Source. В головном файле проекта имеется определенный набор ключевых элементов: • Директива препроцессора #include • Директива #pragma hdrstop предназначена для ограничения списка заголовочных файлов, доступных для предварительной компиляции. • Директива USEFORM показывает модули и формы используемые в проекте. • Директива USERES компилятора присоединяет файлы ресурсов к выполняемому файлу. При создании проекта автоматически создается файл ресурсов .res для хранения курсоров, пиктограмм и других ресурсов. • Application->Initialize(). Это утверждение инициализирует приложение. 7 • Application->CreateForm(). Это утверждение создает форму приложения. Каждая форма в приложении имеет свое утверждение CreateForm. • Application->Run(). Это утверждение запускает приложение. • Блок try...catch используется для корректного завершения приложения в случае возникновения ошибки. Типичный головной файл проекта имеет следующий вид: //Project1.cpp -------------------------------------------------------- #include #pragma hdrstop USERES("Project1.res"); USEFORM("Unit1.cpp", Form1); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; } Структура файла Project1.bpr. Файл Project1.bpr представляет XML-проект (C++Builder XML Project), содержащий описание создавае- мого приложения. Это текстовый файл, содержащий указания на то, какие файлы должны компилироваться и компоноваться в проект, а так- же пути к используемым каталогам. Структура модуля. Модуль содержит реализацию функциональной части объекта на языке C++ и по умолчанию представляет собой файл Unit1.cpp. Каждый такой файл компилируется в объектный файл с расширением .obj. При добавлении к проекту новой формы генерируется новый модуль. Имя исходного файла модуля и файла формы (*.dfm) должны быть одинаковыми. При создании обработчика событий в тексте модуля генерируется шаблон функции обработчика события, в который вводится код, выполняемый при наступлении обрабатываемого события. Ниже приводится текст модуля, генерируемый для исходной формы: //Unit1.cpp ------------------------------------------------------------ #include #pragma hdrstop 8 #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;//указатель на объект //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //реализация конструктора Структура заголовочного файла. Заголовочный файл (файл с расширением .h, по умолчанию Unit1.h) генерируется при создании нового модуля и содержит описание класса формы. Такие описания генерируются автоматически и изменяются при внесении в форму новых компонентов или генерации новых обработчиков событий. В заголовочном файле содержится интерфейс, а в самом модуле – реализация методов. При удалении из формы компонентов их описания удаляются из заголовочного файла. При переименовании компонентов изменяются их описания в заголовочном файле, а также имена и описания обработчиков событий. Однако при этом не изменяются ссылки на эти компоненты и обработчики событий, используемые в других функциях. В связи с этим рекомендуется переименовывать компоненты и обработчики событий сразу же после их создания, пока на них не появились ссылки. В модуле могут содержаться классы и функции, не описанные в заголовочном файле, однако видимость их в этом случае ограничивается данным модулем. Ниже приводится заголовочный файл для исходной формы: //Unit1.h--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include #include #include #include { __published: // IDE-managed Components private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; #endif //--------------------------------------------------------------------------- 9 Файл формы. Форма является одним из важнейших элементов приложения C++ Builder. Процесс редактирования формы происходит при добавлении к форме компонентов, изменении их свойств, создании обработчиков событий. Когда к проекту добавляется новая форма, создаются три отдельных файла: 1) файл модуля (*.cpp) содержит код методов, связанных с формой; 2) заголовочный файл (*.h) содержит опи- сание класса формы; 3) файл формы (*.dfm) содержит сведения об опуб- ликованных (доступных в Инспекторе объектов) свойствах компонентов, содержащихся в форме. При добавлении компонента к форме заголовочный файл и файл формы модифицируются. При редактировании свойств компонента в Инспекторе объектов эти изменения сохраняются в файле формы. Хотя в C++ Builder файл *.dfm сохраняется в двоичном формате, его содержание можно просмотреть с помощью редактора кода. Для этого нужно нажать правую клавишу мыши над формой и из контекстного меню формы выбрать пункт View as Text. Ниже приводится листинг файла некоторой формы: //Unit1.dfm--------------------------------------------------------------------------- object Form1: TForm1 Left = 197 Top = 358 Width = 544 Height = 181 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 End Простейшее приложение. Важнейшей особенностью C++Builder яв- ляется автоматическая генерация кода программы. Когда к форме добав- ляете компонент, в тексте файла Unit1.h появляется объявление объекта класса данного компонента. Например, перенос на пустую форму компо- нента кнопки TButton сгенерирует объявление объекта Button1, а опре- деление события OnClick – объявление метода ButtonlClick , являющего- ся обработчиком этого события. 10 Рассмотрим простейшее приложение. Создается форма для сложения двух чисел. Используются компоненты: TEdit – для ввода чисел и ото- бражения результата; TLabel – для вывода строк “+” и “=”; TButton – кнопка, связанная с событием OnClick, для сложения чисел. Будем использовать следующие свойства и методы для компонентов: TEdit: Name (имя объекта), ReadOnly (режим "только чтение"), Text (текстовое поле); TLabel: Caption (текстовое поле); TButton: Caption (надпись на кнопке), OnClick (событие типа на- жатия кнопки). На рис. 4 приводятся окна Инспектора объектов в процессе работы со свойствами компонентов. Двойной щелчок по компоненту Button1 приведет к выводу окна ре- дактирования для Unit1.cpp и предложит определить тело метода But- ton1Click(), которое для рассматриваемой задачи должно иметь вид: void __fastcall TForm1::Button1Click(TObject *Sender) { Edit3->Text=IntToStr(StrToInt(Edit1->Text)+StrToInt(Edit2->Text)); } Рис. 4. Работа с компонентами Edit1 и Button1 11 Для преобразования строки в целое число и обратно используются функции StrToInt() и IntToStr(), соответственно. На рис. 5 показан ре- зультат выполнения приложения. Рис. 5. Форма в процессе выполнения приложения Рассмотрим основные инструменты визуальной разработки приложений. Администратор проектов. Предназначен для манипуляций с теку- щим проектным файлом с расширением .срр. Чтобы открыть окно адми- нистратора, выполните команду View|Project|Manager. Редактор форм. Форма представляет объект, отображаемый в виде окна с управляющими компонентами. C++Builder создает форму в окне Редактора при добавлении формы к проекту или берет ее из Хранилища объектов. Инспектор объектов. Инспектор объектов используется при проек- тировании объектов и методов и имеет две вкладки: Свойства (Properties) и События (Events). Просмотрщик объектов Object TreeView позволяет просматривать дерево объектов. Хранилище объектов. Обеспечивает возможность разделения (sharing) или повторного использования (reuse) содержащихся в нем объектов. В качестве объектов хранения могут выступать созданные пользователем формы, проекты, модули данных. Редактор кода. Предоставляет средство для просмотра и редактирования текста программного модуля (Unit). Палитра компонентов. C++Builder поставляется вместе с Биб- лиотекой Визуальных Компонентов VCL (Visual Component Library), со- держащей множество повторно используемых компонентов. C++Builder позволяет не только пользоваться готовыми компонентами, но и созда- вать новые компоненты. Формы и диалоговые окна. Главная форма (Form1) открывается при открытии приложения. Метод Close() закрывает форму и прекращает 12 выполнение приложения. Свойства формы могут устанавливаться как на этапе проектирования, так и на этапе выполнения приложения. Форма используется в качестве контейнера для размещения других компонен- тов. В табл. 1 приведены некоторые свойства формы. С формой связаны события: OnActivate – вызывается при активи- зации формы после получения фокуса ввода; OnCreate –вызывается при создании формы; OnClose – вызывается при закрытии формы; OnClick – вызывается при щелчке кнопки; OnKeyDown, OnKePress –первое собы- тие активизируется при нажатии любой клавиши, в том числе функцио- нальной, для второго события клавиша не должна быть функциональной; OnMouseDown, OnMouseMove и другие – связаны с мышью. При воз- никновении каждого события вызывается соответствующй метод- обработчик события. Например: void __fastcall TForm1::FormClick(TObject *Sender){ } Обработчику события передается указатель на вызвавший его объект. Дополнительными параметрами могут быть, например, текущие координаты указателя мыши и т.п. Форма создается при создании приложения. Приложение может содержать несколько форм. Существует два вида оконных приложений: SDI и MDI. SDI-приложения могут отображать несколько окон, не привязанных к главному. Каждая форма может отображаться в мо- дальном режиме и требовать закрытия при переходе к другой форме (Form2->ShowModal(), Form2->Close()). Пока модальное окно не закры- то, нельзя перейти к другому окну. В немодальном режиме разрешается доступ к нескольким формам. В качестве примера рассмотрим приложе- ние, состоящее из двух немодальных SDI форм: Form1 и Form3. Созда- дим кнопку и запишем код обработчика события void __fastcall TForm1::Button1Click(TObject *Sender) { Form3->Show(); } При этом необходимо включить в заголовочный файл Unit1.h первой формы заголовочный файл второй формы: #include "Unit3.h" На рис. 6 показан результат выполнения приложения. Рассмотрим еще одно приложение состоящее из двух форм: Form1 и AboutBox. Для этого в меню выберем File|New|Forms|AboutBox. В свойствах формы AboutBox выберем: Visible=true и FormStyle=fsStayOnTop. 13 Таблица 1 |