Out.close();//закрытие потока 10 глава




Основными элементами модуля являются:

  • Заголовок модуля - предназначен для идентификации модуля и должен быть уникальным для данного проекта. Совпадает с именем файла с расширением *.pas.
  • Секция интерфейса (начинается зарезервированным словом interface). Секция интерфейса является местом, где объявляются константы, типы, переменные, процедуры* и функции, которые доступны для использования другими программными модулями. При объявлении процедур и функций в секции интерфейса необходимыми являются только их заголовки. Тела, или реализации, этих процедур и функций располагаются в секции реализации.
  • Секция реализации (начинается зарезервированным словом implementation) содержит процедуры и функции, включая обработчики событий. Объявления обработчиков событий должны присутствовать в секции интерфейса. Помимо этого, секция реализации может иметь дополнительные процедуры, функции и объявления констант, типов и переменных, упоминания о которых нет в секции интерфейса, но эти объявления видимы только в пределах данного модуля.
  • Секции инициализации и завершения (начинаются с зарезервированных слов initialization и finalization) - необязательные секции для размещения операторов, выполняемых соответственно при запуске и завершении приложения. Предложение uses (необязательное) содержит имена других модулей, используемых данным модулем и может располагаться непосредственно за ключевым словом interface и за ключевым словом implementation. Предложение uses делает секцию интерфейса других модулей доступной в данном модуле.

Отметим, однако, что для создания новых модулей Delphi требуется наличие Delphi. В С++ Builder их можно только использовать. Возможности редактирования форм и модулей Delphi в С++ Builder существенно ограничены - допустимы только операции, не затрагивающие секцию интерфейса модуля. Например, возможно перемещение интерфейсных элементов в пределах содержащих их компонентов-контейнеров, изменение размеров, копирование в буфер обмена, но запрещено их добавление или удаление. Возможны изменения внутри кода процедур и функций, но запрещено добавление новых обработчиков событий.

 

Файл проекта

Для каждого приложения среда автоматичекисоздает три файла: файл проекта, make-файл и файл ресурсов. Файл проекта генерируется при выборе пункта меню File|New Application. При этом среда автоматически присваивает проекту имя Project1.cpp, который далее можно изменить. Если в процессе разработки приложения появляются новые модули и формы, среда автоматически изменит файл проекта. Файл проекта выглядит точно так же как файл любого модуля. Он написан на языке С++ и компилируется вместе с другими файлами при создании исполняемого файла. Для просмотра файла проекта нужно воспользоваться меню Project|View Source. После тог можно вызывать файл проетов щелкнув по вкладке на Project1.cpp. После чего появится окно:

Рассмотрим структуру файла проекта.

Файл начинается с директивы препроцессору #include<vcl\vcl.h>, которая нужна для того, чтобы включить в проекте файлы библиотеки компонентов.

Следующая директива pragma hrdstop говорит о том, что бы среда ограничила дальнейшее предварительное компилирование файлов доступных для предварительного компилирования.

Директива USERFORM сообщает какие модули и формы используются в проекте.

Директива USERES присоединяет файлы ресурсов (вспомогательные программы, картинки, звуковые файлы и т.п.) к выполняемому файлу. При создании проекта автоматически создается файл ресурсов с расширением res для хранения курсора, пиктограммы и других файлов. В данном примере этой директивы нет, поскольку пока ничего не создано.

Application->Initialize() – метод необходимый программе для связи с Windows.

Application->CreateForm() – метод, который создает форму, т.е. окно в которое будут помещены все компоненты. Если в приложении имеется несколько форм, то каждая создается своим методом CreateForm()

Application->Run() – запускает приложение, т.е. переводит его в состояние ожидания наступления одного из событий на которое должно реагировать данное приложение.

try{...}catch (Exception &exception) – используется для корректного завершения приложения в случае возникновения ошибки при инициализации, создании форм, запуске приложения и т.д.

 

Make-файл

Make-файл (makefile)- это текстовый файл, содержащий макросы, директивы, инструкции по компиляции и сборке проекта. Файл генерируется автоматически при создании проекта. Его содержимое зависит от установок программиста, указанных в опциях проекта.

 

Файл модуля

 

Головной файл

Приложения создаваемые в среде C++Builder состоят из головного файла проекта, отдельных модулей и заголовочных файлов. Структура всех файлов, большей частью, создается автоматически. Головной файл, как правило, остается без изменений, более того, по умолчанию, он даже не выводится на экран. В остальные модули вносятся свой код, который заставляет работать программу. Тем не менее, увидеть головной файл можно если в меню Project выбрать View Sourse. После чего появитс примерно следующий код

//---------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

//------------------------------------------------------------

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);

}

catch (…)

{

try

{

throw Exception(“”);

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

Особенностью создания приложений для Windows является то, что вместо функции main головной файл использует функцию WinMain. Первый выполняемый оператор функции WinMain это функция Application->Initialize, которая инициализирует объекты компонентов приложения. Следующие операторы создают объект формы, или форм. Если форм несколько, то они создаются в той последовательности, в которой расположены операторы. В рассматриваемом случае имеется только один такой оператор – функция Application->CreateForm, создающая одну форму. Следующий оператор – это тоже функция – Application->Run начинает выполнение программы. После его выполнения программа переходит к обработке событий, которые управляют ее ходом.

Все названные функции заключены в блок try после которого расположен блок сatch. По умолчанию в последнем расположен стандартный обработчик исключений – это функция Application->ShowException.

Последним оператором головного файла является return 0, -. оператор, информирующий операционную систему о благополучном завершении приложения.

Программист при необходимости может изменять головной модуль.

 

Файлы модуля формы

Каждый модуль формы состоит из двух файлов: заголовочного и файла реализации. Каждый из них расположен на своей вкладке, которую можно открыть щелкнув по соответствующему ярлыку. Builder дает им имена. В данном случае это Unit1.cpp и Unit1.h.

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

Заголовочный файл в данном случае Unit1.h начинается с директив препроцессора, которые Builder вносит автоматически. В частности, подключаются библиотеки содержащие компоненты, которые используются при построении формы. Тоже можно сказать о константах, переменных и большинстве функций. При подключении некоторых функций автоматическое подключение библиотек не производится и программист обязан сам позаботится об этом.

 

После директив препроцессора следует описание класса создаваемой формы. Builder сам дает имя формы, которое выглядит как __TForm1, т.е. имя формы начинается с двойного подчеркивания, далее идет слово TForm, и номер содаваемой формы в данном проекте. Рассматриваемый класс содержит три раздела: __published – это открытый раздел класса, private – закрытый раздел, и public – тоже открытый раздел.

В разделе __published находятся объявления указателей компонентов, используемых при построении формы. Здесь же находятся прототипы функции обработки событий этих компонентов. Этот раздел Builder создает автоматически.Обычно в этот раздел программист ничего не добавляет. В разделы public и privateпрограммист может добавить свои объявления переменных, констант и функций. Помните, все, что объявлено в разделе private будет доступно только в пределах данного модуля.

В раздел public Builder включает конструктор, создаваемого класса __fastcall TForm1(TComponent* Owner), точнее прототип конструктора. Первое слово, стоящее перед именем констуктора __fastcall это не тип возвращаемого значения (ведь конструктор ничего не возвращает), а указание препроцессору на место хранения данной функции. В данном случае это стекрегистр. Обычно параметры передаются через стек. Количество параметров передаваемых через регистр ограничено, поэтому __fastcall применяется только для функций, которые требуют не более трех параметров типа char, int, unsigned, long или указателей.

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

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

 

 

Начинаем работать в Borland C++ Builder

Виктор Алексанкин, Наталия Елманова

Компьютер-Пресс, 1997, N 4.

  • Введение
  • Среда разработки C++ Builder
  • Компоненты C++ Builder
    • Свойства компонентов
    • События
    • Методы
  • Менеджер проектов
  • Создание приложений в С++ Builder
  • Пример: создание простейшего приложения

Введение

Borland C++ Builder - выпущенное недавно компанией Borland средство быстрой азработки приложений, позволяющее создавать приложения на языке C++, используя при этом среду разработки и библиотеку компонентов Delphi. В настоящей статье рассматривается среда разработки C++ Builder и основные приемы, применяемые при проектировании пользовательского интерфейса.

Среда разработки C++ Builder

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

Рис.1. Среда разработки C++ Builder

Формы являются основой приложений C++ Builder. Создание пользовательского интерфейса приложения заключается в добавлении в окно формы элементов объектов C++ Builder, называемых компонентами. Компоненты C++ Builder располагаются на палитре компонентов, выполненной в виде многостраничного блокнота. Важная особенность C++ Builder состоит в том, что он позволяет создавать собственные компоненты и настраивать палитру компонентов, а также создавать различные версии палитры компонентов для разных проектов.

Компоненты C++ Builder

Компоненты разделяются на видимые (визуальные) и невидимые (невизуальные). Визуальные компоненты появляются во время выполнения точно так же, как и во время проектирования. Примерами являются кнопки и редактируемые поля. Невизуальные компоненты появляются во время проектирования как пиктограммы на форме. Они никогда не видны во время выполнения, но обладают определенной функциональностью (например, обеспечивают доступ к данным, вызывают стандартные диалоги Windows 95 и др.)

Рис. 2. Пример использования видимых и невидимых компонентов

Для добавления компонента в форму можно выбрать мышью нужный компонент в палитре и щелкнуть левой клавишей мыши в нужном месте проектируемой формы. Компонент появится на форме, и далее его можно перемещать, менять размеры и другие характеристики.

Каждый компонент C++ Builder имеет три разновидности характеристик: свойства, события и методы.

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

Рис.3. Инспектор объектов

Свойства компонентов

Свойства являются атрибутами компонента, определяющими его внешний вид и поведение. Многие свойства компонента в колонке свойств имеют значение, устанав иваемое по умолчанию (например, высота кнопок). Свойства компонента отображаются а странице свойств (Properties). Инспектор объектов отображает опубликованные (published) свойства компонентов. Помимо published-свойств, компоненты могут и чаще всего имеют общие (public), опубликованные свойства, которые доступны только во время выполнения приложения. Инспектор объектов используется для установки свойств во время проектирования. Список свойств располагается на странице свойств инспектора объектов. Можно определить свойства во время проектирования или написать код для видоизменения свойств компонента во время выполнения приложения.

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

События

Страница событий (Events) инспектора объектов показывает список событий, распознаваемых компонентом (программирование для операционных систем с графическим пользовательским интерфейсом, в частности, для Windows 95 или Windows NT пре полагает описание реакции приложения на те или иные события, а сама операционная система занимается постоянным опросом компьютера с целью выявления наступления какого-либо события). Каждый компонент имеет свой собственный набор обработчиков событий. В C++ Builder следует писать функции, называемые обработчиками событий, и связывать события с этими функциями. Создавая обработчик того или и ого события, вы поручаете программе выполнить написанную функцию, если это событие произойдет.

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

Рис.4. Прототип обработчика событий.

Методы

Метод является функцией, которая связана с компонентом, и которая объявляется как часть объекта. Создавая обработчики событий, можно вызывать методы, используя следующую нотацию: ->, например:

Edit1->Show();

Отметим, что при создании формы связанные с ней модуль и заголовочный файл с расширением *.h генерируются обязательно, тогда как при создании нового модуля он не обязан быть связан с формой (например, если в нем содержатся процедуры расчетов). Имена формы и модуля можно изменить, причем желательно сделать это сразу после создания, пока на них не появилось много ссылок в других формах и модулях.

Менеджер проектов

Файлы, образующие приложение - формы и модули - собраны в проект. Менеджер проектов показывает списки файлов и модулей приложения и позволяет осуществ ять навигацию между ними. Можно вызвать менеджер проектов, выбрав пункт меню View/Project Manager. По умолчанию вновь созданный проект получает имя Project1.cpp.

Рис.5. Менеджер проектов

По умолчанию проект первоначально содержит файлы для одной формы и исходного кода одного модуля. Однако большинство проектов содержат несколько форм и модулей. Чтобы добавить модуль или форму к проекту, нужно щелкнуть правой кнопкой мыши и выбрать пункт New Form из контекстного меню. Можно также добавлять существующие формы и модули к проекту, используя кнопку Add контекстного меню менеджера проектов и выбирая модуль или форму, которую нужно добавить. Формы и модули можно удалить в любой момент в течение разработки проекта. Однако, из-за того, что форма связаны всегда с модулем, нельзя удалить одно без удаления другого, за исключением случая, когда модуль не имеет связи с формой. Удалить модуль из проекта можно, используя кнопку Remove менеджера проектов.

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

Рис. 6. Установка опций проекта

Важным элементом среды разработки C++ Builder является контекстное меню, появ яющееся при нажатии на правую клавишу мыши и предлагающее быстрый доступ к наиболее часто используемым командам.

Разумеется, C++ Builder обладает встроенной системой контекстно-зависимой помощи, доступной для любого элемента интерфейса и являющейся обширным источником справочной информации о C++ Builder.

Создание приложений в С++ Builder

Первым шагом в разработке приложения C++ Builder является создание проекта. Файлы проекта содержат сгенерированный автоматически исходный текст, который становится частью приложения, когда оно скомпилировано и подготовлено к выполнению. Чтобы создать новый проект, нужно выбрать пункт меню File/New Application.

C++ Builder создает файл проекта с именем по умолчанию Project1.cpp, а также make-файл с именем по умолчанию Project1.mak. При внесении изменений в проект, таких, как добавление новой формы, C++ Builder обновляет файл проекта.

Рис.7 Файл проекта

Проект или приложение обычно имеют несколько форм. Добавление формы к проекту создает следующие дополнительные файлы:

  • Файл формы с расширением.DFM, содержащий информацию о ресурсах окон для конструирования формы
  • Файл модуля с расширением.CPP, содержащий код на C++.
  • Заголовочный файл с расширением.H, содержащий описание класса формы.

Когда вы добавляете новую форму, файл проекта автоматически обновляется.

Для того чтобы добавить одну или более форм к проекту, выберите пункт меню File/New Form. Появится пустая форма, которая будет добавлена к проекту. Можно воспользоваться пунктом меню File/New, выбрать страницу Forms и выбрать подходящий шаблон из репозитория объектов.

Рис.8 Шаблоны форм

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

Если при выполнении приложения возникает ошибка времени выполнения, C++ Builder делает паузу в выполнении программы и показывает редактор кода с курсором, установленным на операторе, являющемся источником ошибки. Прежде чем делать необходимую коррекцию, следует перезапустить приложение, выбирая пункт меню Run из контекстного меню или из меню Run, закрыть приложение и лишь затем вносить изменения в проект. В этом случае уменьшится вероятность потери ресурсов Windows.

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

Теперь попробуем создать простейшее приложение, позволяющее вводить текст в редактируемое поле и добавлять этот текст к списку при нажатии мышью на кнопку. Выберем пункт меню File/New Application для создания проекта и сохраним его главную форму под именем samp1.cpp, а сам проект под именем samp.mak. Поместим на форму компоненты Button, Edit и ListBox со страницы Standard палитры компонент.

Рис. 9. Размещение компонентов на форме

После этого выберем на форме компонент Edit и удалим текущее значение свойства Text. Затем установим свойство Caption для Button1 равным "Добавить".

Чтобы добавить обработчик события OnClick для кнопки Добавить, нужно выбрать эту кнопку на форме, открыть страницу событий в инспекторе объектов и дважды щелкнуть мышью на колонке справа от события OnClick. В соответствующей строке ввода появится имя функции. C++ Builder сгенерирует прототип обработчика событий и покажет его в редакторе кода. После этого следует ввести следующий код в операторные скобки {... } тела функции:

void __fastcall TForm1::Button1Click(TObject *Sender) { if (!(Edit1->Text == "")) { ListBox1->Items->Add(Edit1->Text); Edit1->Text = ""; } }

Для компиляции приложения в меню Run выберем пункт Run. Теперь можно что-нибудь ввести в редактируемое поле, нажать мышью на кнопку Добавить и убедиться, что вводимые строки добавляются к списку.

Рис.10. Так выглядит готовое приложение.

Теперь модифицируем приложение, добавив кнопки Удалить и Выход. Для этого добавим еще две кнопки, изменим их свойство Caption и создадим обработчики событий, связанных с нажатием на эти кнопки:

Рис. 11. Модифицированное приложение

Для кнопки Удалить:

void __fastcall TForm1::Button2Click(TObject *Sender) { if (!(ListBox1->ItemIndex == -1)) ListBox1->Items->Delete(ListBox1->ItemIndex); }

Для кнопки Выход:

Close();

Сохраним и скомпилируем приложение, а затем протестируем его

 

Классы в среде Builder C++

Как и в «чистом» С++, в среде Builder класс это тип данных, определенных пользователем. Работа с ними ничем не отлисается от работы с классами рассмотренными ранее. Хотя определенные особенности все же имеются. Рассмотрим некоторые из них.

Класс должен быть объявлен до того, как будет объявлена хотя бы одна переменная этого класса.

Синтаксис объявления класса следующий:

class <имя класса>: <список классов - родителей>

{

public: // доступно всем

<данные, методы, свойства, события>

published // видны в Инспекторе Объекта и изменяемы

<данные, свойства>

protected: // доступно только потомкам

<данные, методы, свойства, события>

private: // доступно только в классе

<данные, методы, свойства, события>

} <список перемен-ных>;

//обратите внимание на раздел published

Например,

class MyClass: public Classl, Class2

{

public:

MyClass(int = 0)

void SetA(int);

int GetA(void);

private:

int FА;

double В,С;

protected:

int F(int);

};

Вообще говоря, имя класса может быть любым допустимым идентификатором, но в BuilderC++ классам наследникам библиотеки компонентов принято начинать с символа «Т».

Раздел public (открытый) предназначен для объявлений, которые доступны для внешнего использования.

Раздел published (публикуемый) содержит открытые свойства, которые появляются в процессе проектирования на странице свойств Инспектора Объектов и которые, пользователь может устанавливать, в процессе проектирования.

Раздел private (закрытый) содержит объявления полей и функций, используемых только внутри данного класса.

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

В приведенном выше примере через объект данного класса можно получить только к функциям MyClass, SetA и GetA. Поля F, A, В, С и функция F — закрытые элементы. Это вспомогательные данные и функция, которые используют в своей работе открытые функции. Открытая функция MyClass с именем, совпадающим с именем класса, это так называемый конструктор класса. При отсутствии конструктора программист должен сам позаботиться о задании начальных значений полям класса.

Пред именами классов-родителей в объявлении класса также может указыватьсяспецификатор доступа (в примере public). Смысл этого спецификатора тот же, что и для элементов класса: при наследовании public (открытом наследовании) можно обращаться через объект данного класса к методам и свойствам классов-предков, при наследовании private подобное обращение невозможно.

По умолчанию в классах (в отличие от структур) предполагается спецификатор private.

В объявлении класса поля запрещается инициализировать. Для инициализации данных служат конструкторы.

После того, как объявлен класс, можно создавать объекты этого Если созанный класс не наследует свойства ласса библиотеки компонентов то объект классасоздается как любая переменная другого типа простым объявлением, например, оператор

MyClass МС, МС10[10], *Рmс;

создает объект МС объявленного выше класса MyClass, массив МС10 объектов данного класса и указатель Рmс на объект этого классп,

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

MyClass МС(3);

не только создает объект МС, но и задает его полю FA значен по 3. Если этого не селать, то в момент создания объекта поле получит значение; по умолчанию, занное в прототипе конструктора.

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

class MyClass: public Classl, Class2

{

....

} MC, MC10[10], *Pmc;

 

 

Пример программирования в среде Builder C++6

В качестве примера рассмотрим задачу пересчета мощности заданной в лошадиных силах в киловатты. Напомним, что одна лошадиная сила это 735, 499 Вт. Задача представляет определенный интерес для людей интересующихся автомобильными двигателями. Конечно, соответствующие вычисления проще выполнить на калькуляторе, но наша задача сотоит в том, что бы создать программу с удобным интерфейсом.

В простейшем случае интерфейс должен выглядеть как виртуальный калькулятор, т.е. представлять собой панель на которой имеется окно в которое можно вводить мощность в лошадиных силах и получать резуьтат в киловаттах. Кроме того должна быть кнопка «Вычислить».



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: