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




m_pMainWnd->ShowWindow(SW_SHOW);// Показать окноm_pMainWnd->UpdateWindow(); // Обновить окно

Закончить выполнение функции, убедив MFC, что все нормально:

return TRUE;

Откомпилировать, собрать и запустить программу, насладившись пустым окном и именем Step1.

 

Программирование в среде Borland C++ Builder

Если вы уже попробовали создавать консольные приложения, то вероятно обращали внимание на то, что Builder предлагает создавать еще несколько типов программ. Остановимся на этом вопросе подробнее.

Прежде всего заметим, что Builder кроме файла с исходной программой создает дополнительный файл, который называется файлом проекта. Этот файл генерируется как только выбираются пункты меню File|New. Первоначально Builder присваивает файлу проекта имя Project1.cpp. Если в процессе разработки программы добавляются внешние файлы или библиотеки, то среда обновляет файл проекта. Для просмотра файла проекта следует выбирать пункт меню Project|View Source.

 

Программирование с помощью C++Builder 6.

 

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

Интерфейс создается в виде окна (панели), которая называется формой. На форме располагаются элементы, которые обычно присутствуют обычно в такого рода программах такого рода – меню, кнопки, окна редактирования, полосы прокрутки, и т.п., словом то, что можно увидеть, например, в MS Word.

(a) Структуры файлов в C++ Builder

Наталия Елманова, Центр Информационных Технологий

Структура файла проекта

Для каждого приложения C++ Builder создается один файл проекта, один make-файл и один файл ресурсов. Файл проекта генерируется при выборе пункта меню File/New Application. Первоначально файлу проекта присваивается по умолчанию имя Project1.cpp. Если в процессе разработки приложения добавляются формы и модули, C++ Builder обновляет файл проекта.

Для просмотра файла проекта следует выбрать пункт меню View/Project Source. Эта операция выполнит загрузку исходного текста файла проекта в редактор кода (рис. 1).

Рис. 1. Просмотр файла проекта в редакторе кода

Файл проекта имеет такую же структуру, как и файл модуля. Подобно файлу модуля, это файл исходного кода на языке C++, который компилируется с другими файлами при создании исполняемого файла.

В файле проекта имеется определенный набор ключевых элементов:

  • Директива препроцессора #include <vcl\vcl.h> предназначена для включения в текст проекта заголовочного файла, ссылающегося на описания классов библиотеки компонентов.
  • Директива препроцессора #pragma hrdstop предназначена для ограничения списка заголовочных файлов, доступных для предварительной компиляции.
  • Директива USEFORM сообщает, какие модули и формы используются в проекте.
  • директива USERES компилятора присоединяет файлы ресурсов к выполняемому файлу. При создании проекта автоматически создается файл ресурсов с расширением *.res для хранения курсоров, пиктограммы приложения и др.
  • Application->Initialize() Это утверждение критично только в случае, если приложение является OLE automation-сервером. В остальных случаях оно фактически ничего не делает.
  • Application->CreateForm() Это утверждение создает форму приложения. По умолчанию, каждая форма в приложении имеет свое утверждение CreateForm.
  • Application->Run() Это утверждение запускает приложение (точнее, переводит его в состояние ожидания наступления одного из событий, на которое оно должно реагировать).
  • Конструкция try...catch используется для корректного завершения приложения в случае возникновения ошибки при инициализации, создании форм, запуске приложения.

Структура make-файла

Make-файл - это текстовый файл, содержащий макросы, директивы и инструкции по компиляции и сборке проекта для утилиты make.exe. Отметим, что make-файл по существу ничем не отличается от обычного знакомого пользователям С и С++ make-файла. Он генерируется автоматически при создании проекта, и его содержимое зависит от установок, указанных программистом в опциях проекта. Чтобы увидеть содержание make-файла, следует выбрать пункт меню View/Project Makefile (рис. 2).

Рис. 2. Пример структуры make-файла

Структура модуля

Модули являются основой создания библиотек и приложений в C++ Builder. Модуль содержит исходный текст на языке C++ и первоначально представляет собой файл с расширением *.CPP. В дальнейшем каждый такой файл компилируется в объектный файл с расширением *.OBJ. Объектные файлы, в свою очередь, собираются компоновщиком в выполняемый файл с расширением *.EXE.

При добавлении к проекту новой формы генерируется новый модуль. При добавлении модуля к проекту при помощи выбора пункта меню File/New Unit создается пустая структура модуля, в которой включены директивы: #include <vcl\vcl.h>; #pragma hdrstop; #include "Unit2.h"

Директива #include "Unit2.h" указывает на то, что в текст модуля должен быть включен соответствующий заголовочный файл.

При создании модуля используются следующие правила:

  • Имя должно быть уникальным. Два модуля с одним и тем же именем не могут использоваться одновременно в одном и том же проекте.
  • Если модуль связан с формой, то имя исходного файла модуля и файла формы (с расширением *.dfm) должны быть одинаковыми. При создании обработчика событий в инспекторе объектов в тексте файла модуля генерируется шаблон функции, в который разработчик должен вводить код, выполняемый при наступлении обрабатываемого события.

Структура h-файла

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

Рис. 3. Пример структуры h-файла

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

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

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

Внутри модуля функции могут быть определены и ссылаться друг на друга в произвольном порядке. Если данный модуль ссылается на другие формы и модули, следует с помощью директивы препроцессора #include включить в него соответствующий h-файл с помощью пункта меню File/Include Unit Hdr.... После этого интерфейсные элементы другого модуля будут доступны в данном модуле.

Файл формы

Форма является одним из важнейших элементов приложения C++ Builder. Процесс редактирования формы происходит при добавлении к форме компонентов, изменении их свойств, создании обработчиков событий.

Рис. 4. Структура файла формы

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

Файл модуля (.cpp) - cодержит исходный код, связанный с формой.

h-файл(.h) - cодержит описание класса формы, то есть описания содержащихся на форме компонентов и обработчиков событий.

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

Хотя в C++ Builder файл.dfm сохраняется в двоичном формате, его содержание можно просмотреть с помощью редактора кода. Для этого нужно нажать правую клавишу мыши над формой и из контекстного меню формы выбрать пункт View as Text.

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

C++ Builder создан на основе визуальной библиотеки компонентов Borland Delphi, ставшей за последние два года весьма популярной среди разработчиков. По этой причине этот продукт имеет общую с Delphi библиотеку классов, часть из которых осталась написанной на Object Pascal. Из этого следует, что в приложениях можно использовать компоненты, созданные для Delphi 2.0.

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

Рис. 5. Типы файлов, используемые в проектах С++ Builder

В соответствии с этим в качестве частей проекта могут быть использованы модули, написанные на Object Pascal. В этом можно убедиться, взяв формы какого-нибудь из примеров, созданных в Delphi 2.0 и включив их в проект С++ Builder. Возьмем в качестве такого примера приложение Graphex из набора примеров Delphi 2.0. Создадим новый проект, удалим из него созданную по умолчанию форму и добавим два модуля из приложения Graphex - Graphwin.pas и Bmpdlg.pas.

Рис. 6. Добавление модулей Delphi к проекту.

Скомпилируем проект. Можно убедиться в работоспособности полученного приложения, запустив и протестировав его.

В случае использования форм Delphi к проекту добавляются два файла - файл формы с расширением *.dfm и файл модуля с расширением *.pas. Описание класса формы содержится в самом модуле, следовательно, для этого не требуется отдельный файл заголовка.

Рассмотрим более подробно структуру модуля Delphi. В качестве простейшего примера приведем структуру модуля, связанного с формой, содержащей единственный интерфейсный элемент - кнопку закрытия окна: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin close; end; end.

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

  • Заголовок модуля - предназначен для идентификации модуля и должен быть уникальным для данного проекта. Совпадает с именем файла с расширением *.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 сгенерировать прототип обработчика событий и показать его в редакторе кода. При этом автоматически генерируется текст пустой функции, и редактор открывается в том месте, где следует вводить код. Курсор позиционируется внутри операторных скобок {... }. Далее нужно ввести код, который должен выполняться при наступлении события. Обработчик событий может иметь параметры, которые указываются после имени функции в круглых скобках.



Поделиться:




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

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


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