extern PACKAGE TForm1 *Form1;

Поэтому для использования данной формы из других форм приложения в исходных файлах этих форм необходимо просто подключить заголовочный файл формы с помощью директивы препроцессора #include. Аналогичные действия производятся автоматически при выборе пункта главного меню File| Include Unit Hdr (комбинация клавиш Alt-F11). Ниже приведен пример исходного файла проекта.

Листинг 3.5. Заголовочный файл формы

#ifndef Unit1H

#define Unit1H

#include <Classes. hpp>

#include <Controls. hpp>

#include <StdCtrls. hpp>

#include <Forms. hpp>

#include <ExtCtrls. hpp>

#include <Graphics. hpp>

class TForm1 : public TForm

{__published: // IDE-managed Components

TButton *Button1;

TImage *Image1;

void __fastcall FormCreate(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);};

extern PACKAGE TForm1 *Form1;

#endif

Содержимое заголовочного файла может формироваться как автоматически при работе программиста с редактором форм и инспектором объектов, так и самим программистом с клавиатуры. В приведенном примере видно, что на форму были добавлены компоненты TButton и TImage, а в инспекторе объектов был создан обработчик события FormCreate.

Для сохранения файлов проекта можно использовать пункт главного меню File | Save Project As. Для сохранения файлов формы можно использовать пункт главного меню File | Save As. При этом можно задать новые имена для файлов проекта и файлов форм. Для сохранения изменений во всех файлах можно использовать пункт главного меню File | Save All (комбинация клавиш Shift-Ctrl-S). Для закрытия проекта можно использовать пункт меню File | Close All. Для открытия проекта можно использовать пункт меню File | Open Project (комбинация клавиш Ctrl-F11).

НЕ нашли? Не то? Что вы ищете?

При одновременной разработке нескольких связанных приложений (например, при разработке клиент/серверных систем) можно использовать группу проектов. Для добавления новых и существующих проектов в группу можно использовать пункты главного меню Project | Add New Project и Project | Add Existing Project соответственно. Выбор текущего проекта можно произвести в менеджере проектов, доступного через пункт главного меню View | Project Manager (комбинация клавиш Ctrl-Alt-F11). Файл группы проектов имеет расширение *.bpg и содержит информацию о проектах, входящих в группу.

В процессе компиляции создаются некоторые временные файлы. Файлы, расширение которых начинается с символа “~”, являются резервными копиями соответствующих файлов. Файлы с расширением *.obj объектные файлы приложения и форм. Файл с расширением *.tds содержит информацию для отладчика и инкрементного линковщика.

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

Вывод

Проект приложения в среде C++Builder состоит из нескольких файлов, основными из которых являются: главный файл проекта (с расширением. bpr), исходный файл проекта (по умолчанию называется project1.cpp), а также для каждой формы приложения файл формы (расширение. dfm), заголовочный файл (расширение. h) и модуль формы (расширение. cpp). Помимо этого в состав проекта могут входить файлы ресурсов, внешние библиотеки, пакеты. При работе с проектом система создает также некоторые дополнительные файлы, необходимые для сборки приложения.

4. Библиотека визуальных компонент С++Builder

4.1. Общие сведения о библиотеке VCL

Визуальная среда проектирования С++Builder, начиная с 6-ой версии, поддерживает две библиотеки программных компонент. Visual Component Library (VCL) и Component Library for Cross Platform (CLX). Библиотека VCL поддерживается во всех версиях Borland Builder и содержит большой набор компонент, предназначенных для разработки приложений, работающих под управлением операционных систем семейства Windows. Библиотека CLX является платформенно-независимой и позволяет разрабатывать приложения, работающие под управлением операционных систем семейства Windows и Unix. Например, графическое приложение, разработанное с помощью этой библиотеки, может быть откомпилировано в среде Builder для работы в операционной системе Windows и откомпилировано в среде Kylix для работы в графической системе X-Window операционной системы Linux. Следует отметить, что система Kylix поддерживает лишь ограниченный набор систем семейства Unix. Для систем Unix существуют другие платформенно-независимые системы, которые поддерживают практически все операционные системы данного семейства. Одной из таких систем является система визуального проектирования QT. Кроме того, библиотека CLX не поддерживает некоторых возможностей, специфичных для приложений Windows, например, технологии ADO, OLE, COM+. Все эти и некоторые другие технологии поддерживаются библиотекой VCL. Поэтому при разработке приложений, работающих под управлением операционных систем семейства Windows, более целесообразно использовать библиотеку VCL. В дальнейшем будем рассматривать компоненты библиотеки VCL.

Имена большинства компонентов VCL начинаются с буквы T, имена классов исключительных ситуаций начинаются с буквы E. Компоненты являются дальнейшим развитием классов и объектно-ориентированного программирования. В отличие от объектов класса компоненты существуют не только на этапе выполнения приложения, но и на этапе проектирования приложения. Поведение компонент может различаться на этих двух этапах, например, форма на этапе проектирования отображается с точечной сеткой и двойной щелчок левой кнопкой мыши на свободной области формы приводит к переходу в редактор кода. Кроме того, в дополнение к компонентным данным и компонентным функциям класса в компонентах появляются свойства и события. Свойства являются дополнительным интерфейсом для доступа к компонентным данным класса. Они позволяют устанавливать различные характеристики компонент, такие как название, вид, размер и т. д. Изменение значений свойств приводит к изменению каких-либо внутренних данных компонента. Значения свойств могут устанавливаться как на этапе выполнения, так и на этапе проектирования приложения с помощью инспектора объектов на закладке Properties. Для того, чтобы свойства были доступны в инспекторе объектов они должны быть опубликованы. Для этого их определение в классе должно быть размещено в секции __published. Данная секция относится к атрибутам видимости полей класса (private, protected, public). На этапе выполнения работа со свойствами практически ничем не отличается от работы с компонентными данными класса. Например:

TestButton->Caption=”New Text”;

if (TestButton->Color==clButton) TestLabel->Color=clBlack;

Необходимо помнить, что свойство - это интерфейс для доступа к полям данных, а не само поле данных, поэтому некоторые действия, доступные для переменных, для свойств недоступны. Например, код Form1->Caption+=”*” некорректен, а код Form1->Caption= Form1->Caption+”*” корректен.

События вызываются компонентом для сигнализации о каких-либо изменениях, связанных с состоянием этого компонента. События могут быть вызваны действиями пользователя, операционной системой или самим компонентом. Например, щелчок кнопкой мыши на области компонента, уничтожение компонента, срабатывание таймера и т. д. С каждым событием прикладной программист, использующий компонент, может ассоциировать функцию-обработчик события. Функция-обработчик должна быть методом какого-либо компонента, обычно формы. При возникновении события будет вызвана соответствующая функция-обработчик. Разработчик компонента определяет, какие события будут поддерживаться компонентом и условия их возникновения. Большинство сообщений операционной системы Windows оформлены в библиотеке VCL в виде соответствующих событий. Например, сообщения от клавиатуры, мыши, сообщения Drag-&-Drop, сообщения органов управления Windows и т. д. Более подробно внутренняя реализация свойств и событий будет рассмотрена в главе 8. Здесь лишь отметим, что событие на самом деле содержит в себе указатель на функцию обработчик. В С++Builder определен специальный тип события с помощью ключевого слова __closure. При этом определяется указатель на метод класса, дополнительно содержащий указатель на конкретный экземпляр класса. Например, событие TNotifyEvent описывается следующим образом:

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);

Параметр Sender присутствует для каждого события и содержит указатель на экземпляр компонента, для которого произошло событие. Кроме этого параметра события могут содержать и другие специфичные для себя параметры, отвечающие, например, за код нажатой клавиши. Для назначения обработчиков событиям на этапе проектирования можно воспользоваться инспектором объектов (закладка Events). Каждый компонент имеет так называемое событие по умолчанию (чаще всего OnClick). При двойном щелчке левой кнопкой мыши на компоненте на этапе проектирования происходит переход в редактор кода для определения кода обработки этого события. На этапе выполнения событие по умолчанию никак не отличается от остальных событий компонента. Обработчик события может быть назначен или убран также и на этапе выполнения. Например, в unit1.h:

__published:

void __fastcall StartClick(TObject *Sender);

void __fastcall StopClick(TObject *Sender);

в unit1.cpp

void __fastcall TForm1::StartClick(TObject *Sender)

{// выполнение какого-либо кода

ButtonStartStop->Caption="stop";

ButtonStartStop->OnClick=StopClick;

}

void __fastcall TForm1::StopClick(TObject *Sender)

{// выполнение какого-либо кода

ButtonStartStop->Caption="start";

ButtonStartStop->OnClick=StartClick;

}

В данном примере для кнопки ButtonStartStop попеременно назначаются различные обработчики для события OnClick, позволяя тем самым этой кнопке выполнять при нажатии на нее различный код. Один и тот же обработчик может быть назначен нескольким событиям различных компонентов. Например, при разработке графической клавиатурной панели, у нас есть 10 кнопок с соответствующими цифрами. При нажатии на кнопки соответствующая цифра должна быть добавлена в поле ввода. Поскольку все обработчики события OnCliсk в этом случае выполняют аналогичный код, целесообразно назначить один обработчик всем кнопкам. Внутри обработчика определить, для какой именно кнопки было сгенерировано событие, позволяет параметр Sender. Следует отметить, что Sender имеет тип указателя на базовый класс библиотеки VCL TObject и может содержать указатель на объект любого производного класса. В нашем случае указатель на экземпляр класса TButton. Для корректного использования методов и свойств компонента необходимо выполнить преобразование типов. Для приведения типов можно использовать статическое или динамическое преобразование типов. Статическое приведение типов выглядит как обычное приведение типов языка С++ и происходит на этапе компиляции.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14