# 4. ИНСТРУМЕНТЫ ВИЗУАЛЬНОЙ РАЗРАБОТКИ ПРИЛОЖЕНИЙ

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

Интегрированная среда разработки C++Builder IDE (Integrated Development Environment), предназначенная для эффективной разработки приложений, поможет вам воспользоваться ее новшествами и в полной мере ощутить преимущества нового стиля программирования. Вы сможете быстро переводить приложение из стадии начального прототипа в рабочую программу. В главе 2 читатель уже составил общее представление о работе с базовыми инструментальными средствами C++Builder - Палитрой компонент. Редакторами форм и кода. Инспектором и Хранилищем объектов. В данной главе мы продолжим знакомство с этими и другими инструментами среды C++Builder, уделяя особое внимание описанию визуальных компонент, представленных на Палитре.

4.1 Администратор проекта

Администратор проекта предназначен для манипуляций с текущим проектным файлом с расширением .срр. Чтобы открыть окно администратора (Рис. 4.1), выполните команду View [ Project Manager. Окно содержит список всех составляющих файлов, ассоциированных с текущим проектом. С помощью кнопок панели быстрого вызова или опций контекстного меню вы сможете добавлять, вычеркивать, сохранять и копировать выбранный файл в текущем проекте.

Запись изменений проекта
Установка проектных опций
Включение редактора форм
Включение редактора кода
Вычеркивание файла из списка
Добавление файла к проекту
Список ассоциированных файлов проекта
Контекстное меню администратора проекта

Рис. 4.1. Окно администратора проекта.

Открыть контекстное меню администратора проекта можно щелчком правой кнопкой мыши в любом месте окна администратора или нажатием клавиш Alt+FlO. Контекстное меню содержит следующие опции:

• Save Project сохраняет изменения всех составляющих проектного файла, используя текущие имена файлов. Такое же действие вызывает команда

File | Save Project As

• Add To Repository открывает диалог Save Project Template для добавления проектного шаблона к хранилищу объектов.

• New Unit создает новый модуль в окне Редактора кода и добавляет его к проектному файлу. Новым модулям присваиваются имена Uniti, Unit2, ... Такое же действие вызывает команда File | New Unit.

• New Form создает пустую форму и новый модуль в окне Редактора кода и добавляет их к проектному файлу. Новым формам присваиваются имена Form1,

Form2, Такое же действие вызывает команда File | New Form

• Add File открывает диалог Add To Project для добавления текущего модуля и связанной с ним формы к проектному файлу.

• Remove File вычеркивает модуль из списка ассоциированных файлов текущего проекта. Такое же действие вызывает команда Project | Remove from Project. Внимание: Не вычеркивайте файлы модулей напрямую или посредством других программ.

• View Unit активизирует выбранный модуль в окне Редактора кода. Такое же

действие вызывает команда View | Units.

• View Form активизирует форму, связанную с выбранным модулем, в окне Редактора форм. Такое же действие вызывает команда View | Forms.

• View Project Source активизирует текст текущего проектного файла в окне Редактора кода.

• Options открывает диалог Options | Project для установки проектных опций. Такое же действие вызывает команда Options | Project.

• Update записывает изменения текста проекта в проектный файл. Внимание: Не редактируйте проект вручную - C++Builder делает это автоматически!

4.2 Редактор форм

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

Открыть окно Редактора форм можно одним из способов:

1. Командой File | New Application создайте новое приложение.

2. Командой File | New Form (кнопка быстрого вызова) создайте новую форму.

3. Командой File | Open Project (кнопка быстрого вызова) откройте существующий проект.

Добавить компоненту к форме можно одним из способов:

1. Найдите нужную компоненту на вкладках Палитры компонент и щелкните на ней левой кнопкой мыши. Переведите курсор в окно Редактора и вновь щелкните мышью.

2. Дважды щелкните левой кнопкой мыши на нужной компоненте.

Закрыть активное окно Редактора форм можно одним из способов:

1. Кнопкой в правом верхнем углу окна или клавишами Alt+F4.

2. Командой File | Close.

Закрыть все окна, кроме окна Инспектора объектов, можно командой File | Close All.

Если вы модифицировали текущую форму и не сохранили изменения, C++Builder выдаст предупреждение и откроет диалог команды File | Save As, чтобы вы могли ввести новое имя модуля (по умолчанию, Unit1). Если вы модифицировали текущий проект и не сохранили изменения, C++Builder выдаст предупреждение и откроет диалог команды File | Save As, чтобы вы могли ввести новое имя файла проекта (по умолчанию. Project 1).

Чтобы получить контекстно-зависимую справку при работе с Редактором форм, выберите компоненту, о которой вы хотите получить справочные сведения, и нажмите клавиши Ctrl+Fl. Если искомые сведения не обнаружены, справочная служба Help выдаст сообщение "Help Topic Does Not Exist".

4.3 Инспектор объектов

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

Свойства (Properties) и События (Events).

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

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

В верхней части Инспектора (Рис. 4.2) расположено поле селектора объектов. которое отображает объектный тип выбранной компоненты (или формы) и позволяет раскрыть список всех компонент, помещенных на активную 4юрму. С помощью селектора легко выбирать рабочие компоненты текущей формы. Ширину столбцов Инспектора можно менять, перетаскивая мышью разделительные линии.

Значение fsNormal свойства FormStyle самой формы означает, что вы создаете SDI приложение с однодокументным интерфейсом, а значение fsMDIForm - MDI приложение с многодокументным интерфейсом. Обратите внимание, что свойству Sorted компоненты TListBox присвоено значение true, поэтому элементы списка будут упорядочены в алфавитном порядке.

Рис. 4.2. Свойства компоненты TListBox в окне Инспектора объектов.

Открыть контекстное меню Инспектора объектов можно щелчком правой кнопкой мыши в любом месте окна Инспектора или нажатием клавиш Alt+FlO. Контекстное меню содержит следующие опции управления и установок:

• Revert to Inherited восстанавливает исходное унаследованное поведение объекта. Применяйте эту операцию, когда вы забыли внесенные изменения свойств.

• Expand показывает вложенные свойства объекта. Такое же действие вызывает двойной щелчок мышью по выбранному базовому свойству.

• Collapse прячет отображение вложенных свойств объекта. Такое же действие вызывает двойной щелчок мышью по выбранному базовому свойству.

• Stay On Top располагает окно Инспектора поверх остальных окон и диалогов среды C++Builder.

• Hide прячет активное окно Инспектора, которое открывается вновь клавишей F11 или по команде View | Object Inspector.

• Help вызывает соответствующую страницу справочной службы.

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

4.4 Хранилище объектов

Хранилище объектов обеспечивает возможность разделения (sharing) или повторного использования (reuse) содержащихся в нем объектов. В качестве объектов хранения могут выступать либо подготовленные C++Builder, или созданные вами формы, проекты, модули данных и эксперты. Кроме самих объектов, вы можете адресовать в хранилище их шаблоны, в которых зафиксированы только неизменяемые в процессе разработки компоненты.

Хранилище в сущности является индексным текстовым файлом, содержащим ссылки на страницы, объединяющие указанные объекты.

4.4.1 Разделение объектов

При разделении объектов разработчик приложения может преследовать разные цели:

Разделение объектов между проектами.

Добавляя формы, диалоги и модули данных к хранилищу, вы делаете их доступными другим проектам.

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

Разделение объектов внутри проекта.

Вы можете наследовать формы, уже включенные в проект. Открывая командой File | New диалог New Items, вы увидите вкладку с именем вашего проекта. Если щелчком мыши выбрать эту вкладку, откроются списки всех форм, диалогов и модулей данных этого проекта. Затем можно произвести новый объект - форму из существующей и приспособить ее по назначению.

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

Разделение проектов.

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

Использование экспертов.

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

4.4.2 Включение объектов в проект

Существует три способа включения в проект объектов из хранилища с целью их разделения:

Копирование объектов хранилища.

Простейший вариант разделения заключается в копировании точного дубликата объекта в ваш проект. Будущие изменения этого объекта в хранилище никак не отразятся на вашей копии, и наоборот, модификации копии не коснутся оригинала объекта в хранилище.

Замечание. Копирование представляет единственную возможность использования проектных шаблонов.

Наследование объектов хранилища.

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

Прямое использование объектов хранилища.

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

Замечание. Разрешено прямое использование форм, диалогов, модулей данных и экспертов. Использование экспертов фактически не создает разделяемые процедуры, а представляет собой запуск некоторого процесса, который генерирует свой собственный код.

Разработка нового проекта может начинаться не с пустого проекта (с именем Project 1 по умолчанию), а с некоторого шаблона из хранилища объектов.

Чтобы открыть новый проект на базе шаблона:

1. Выполните команду File | New, которая откроет диалог New Items.

2. Выберите вкладку Projects.

3. Укажите нужный шаблон и нажмите кнопку ОК.

4. В открывшемся диалоге Select Directory укажите каталог, в котором хранятся

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

4.4.3 Добавление объектов к хранилищу

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

Чтобы добавить новый объект к хранилищу:

1. Выполните команду Project | Add To Repository, которая откроет диалог, показанный на Рис. 4.3.

2. В область редактирования Title введите название объекта.

3. В область Description введите описание объекта.

4. Из выпадающего списка Page выберите имя страницы, в которой вы хотите завести новый объект.

5. В область Author введите фамилию автора.

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

7. Нажмите кнопку ОК, чтобы сохранить текущий объект.

Имя объекта Кнопка выбора пиктограммы
Описание объекта
Автор объекта
Страница объектов указанного типа

Рис. 4.3. Добавление формы к хранилищу объектов.

Чтобы добавить к хранилищу проект или форму в виде шаблона:

1. Если необходимо, откройте проект или форму, шаблоны которых вы хотите добавить к хранилищу.

2. Выполните команду Tools | Repository.

3. На вкладке Project Templates (или Form Templates) выберите команду Add, которая отроет диалог Save Project Template (или Save Form Template).

4. В область редактирования Title введите название проекта или формы.

5. В область Description введите описание проекта или формы.

6. Из выпадающего списка Page выберите имя страницы Projects (или Forms), в которой вы хотите завести соответствующий шаблон.

7. В область Author введите фамилию автора.

8. Нажмите кнопку Browse, чтобы выбрать пиктограмму, которая будет представлять данный шаблон в хранилище.

9. Нажмите кнопку ОК, чтобы сохранить текущий проект или форму в виде шаблона.

Замечание. Если позже вы внесете изменения в шаблон, эти изменения автоматически отразятся в новых проектах или формах, произведенных от этого шаблона, но никак не скажутся на уже созданных производных.

Чтобы увидеть описание выбранного объекта:

1. Выполните команду File | New, которая откроет диалог New Items.

2. Выберите вкладку объектов нужного типа.

3. Щелкните правой кнопкой мыши по выбранному объекту.

4. Из появившегося контекстного меню выберите опцию View Details. Описание объекта появится в столбце Description.

4.4.4 Проект и формы, создаваемые по умолчанию

Проект по умолчанию для нового приложения открывается с помощью команды File | New Application. Если вы не меняли соответствующих установок хранилища объектов, C++Builder создаст пустой проект с пустой формой. Вы можете сменить шаблон проекта по умолчанию, а также назначить запуск некоторого эксперта проектов, который проведет вас через ряд диалогов, руководящих созданием нового проекта.

Чтобы сменить проект по умолчанию:

1. Выполните команду Tools | Repository, чтобы открыть диалог хранилища Object Repository.

2. Выберите страницу с именем Projects из списка Pages.

3. Укажите проект, который вы хотите создавать по умолчанию, в списке Objects.

4. Выберите опцию New Project.

5. Нажмите кнопку OK для регистрации новой установки по умолчанию.

Новая форма по умолчанию для существующего проекта открывается с помощью

команд File | New Form (кнопка быстрого вызова). Если вы не меняли соответствующих установок хранилища объектов, C++Builder создаст пустую форму. Вы можете сменить шаблон формы по умолчанию, а также назначить запуск некоторого эксперта форм, который проведет вас через ряд диалогов, руководящих добавлением новой формы к проекту.

Чтобы сменить форму по умолчанию для существующего проекта:

1. Выполните команду Tools | Repository, чтобы открыть диалог хранилища Object Repository.

2. Выберите страницу с именем Forms из списка Pages.

3. Укажите форму, которую вы хотите создавать по умолчанию, в списке Objects.

4. Выберите опцию New Form.

5. Нажмите кнопку OK для регистрации новой установки по умолчанию.

Основная форма (или эксперт форм) по умолчанию для нового проекта устанавливается в хранилище объектов точно так же, как и форма для существующего проекта.

Чтобы сменить основную форму по умолчанию для нового проекта:

1. Выполните команду Tools | Repository, чтобы открыть диалог хранилища Object Repository.

2. Выберите страницу с именем Forms из списка Pages.

3. Укажите форму, которую вы хотите создавать по умолчанию, в списке Objects.

4. Выберите опцию Main Form.

5. Нажмите кнопку OK для регистрации новой установки по умолчанию.

4.5 Редактор кода

Редактор кода программ предоставляет удобное и надежное средство для просмотра и редактирования текста программного модуля (Unit), независимо компилируемого в объектный файл. Модуль состоит из двух частей: файла объявлений с расширением .h и кодового файла с расширением .срр.

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

C++Builder автоматически отрывает в окне Редактора новую вкладку с текстом модуля в следующих ситуациях:

1. Командой File | New Application создается новое приложение.

2. Командой File | New Form (кнопка IS1 быстрого вызова) создается новая фор ма.

3. Командой File | New Unit создается новый модуль.

4. Командой File | Open Project (кнопка 1в 1 быстрого вызова) открывается существующий проект.

5. Командой File | Open (кнопка 1^1 быстрого вызова) открывается существующий файл текста модуля. По умолчанию вам будут предложены кодовые файлы с расширением .срр. Вы можете сменить установки умолчания для текущего каталога и расширений файлов на вкладке Directories/Conditionals диалога команды Options | Project.

6. Командой Project | Add to Project (кнопка Ц.а| быстрого вызова) к проекту добавляется текущая форма или модуль.

Чтобы редактировать текст модуля:

1. Выберите вкладку окна Редактора с именем нужного модуля или укажите его

в списке, предлагаемом командой View | Units (кнопка IQH быстрого вызова). Если вы хотите создать новое окно Редактора, воспользуйтесь командой View | New Edit Window.

2. Поместите курсор в то место текста, которое вы хотите редактировать.

3. Редактируйте текст с помощью операций, принятых стандартными редакторами Microsoft Windows. Вводимые строки программы разделяются нажатием

клавиши Enter.

Если вы модифицировали текст текущего модуля и не сохранили изменения, C++Builder выдаст предупреждение и откроет диалог Save As, чтобы вы могли ввести новое имя файла модуля (по умолчанию, Uniti). Если вы модифицировали текущий проект и не сохранили изменения, C++Builder выдаст предупреждение и откроет диалог Save As, чтобы вы могли ввести новое имя файла проекта (по умолчанию, Project1).

Закрыть модуль в окне Редактора кода можно одним из способов:

1. Кнопкой в правом верхнем углу окна или клавишами Alt+F4.

2. Командой File | Close.

3. Окно Редактора закрывается только тогда, когда все находящиеся в нем файлы были закрыты.

Важнейшей особенностью C++Builder является автоматическая генерация строк программы. Когда вы добавляете компоненту к форме, в тексте файла Unit1.h появляется объявление переменной экземпляра класса данной компоненты. Например, перенос на пустую форму компоненты кнопки TButton сгенерирует объявление объекта Button 1, а определение события OnClick - объявление метода ButtonlClick обработчика этого события (Рис. 4.4).

Рис. 4.4. C++Biiilder генерирует объявления в файле модуля Unit1.h.

Открыть контекстное меню Редактора кода можно щелчком правой кнопкой мыши в любом месте окна Редактора или нажатием клавиш AIt+FlO. Контекстное меню содержит следующие опции для просмотра исходного текста вашей программы и ее отладки:

• Swap Cpp/Hdr Files переключает файлы составляющих редактируемого модуля Unit.cpp/Unit.h.

• Close Page закрывает текущую вкладку с текстом редактируемого файла модуля.

• Open File At Cursor открывает текстовый файл модуля, начиная с текущей позиции курсора.

• New Edit Window открывает новое окно Редактора кода.

• Topic Search выдает контекстно-зависимую справку о слове в тексте модуля, на которое наведен курсор. Если искомые сведения не обнаружены, справочная служба выдаст сообщение "Help Topic Does Not Exist".

• Toggle Breakpoint включает и выключает останов программы в точке текста, указанной курсором. Чтобы модифицировать свойства точки останова, выполните команду View | Breakpoints и в списке Breakpoint list щелкните правой кнопкой мыши на выбранной точке.

• Run to Cursor запускает загруженную программу до точки текста, указанной курсором. Такое же действие вызывает команда Run | Run To Cursor. После того, как программа остановится перед тем местом, где вы подозреваете ошибку, перейдите к пошаговому исполнению программы по командам

Run | Step Over или Run | Trace Into

• Go to Address переходит к заданному адресу в ассемблерной программе (см. опцию View CPU).

• Inspect открывает окно инспекции выделенного символа. Символ может быть обнаружен не только в текущем, но и в любом исходном файле, скомпилированном и собранном как часть одного проекта. Чтобы поиск символа производился, необходимо разрешить опции компиляции Local symbols и Symbol info на вкладке Pascal диалога команды Options | Project.

• Evaluate/Modify открывает диалог, который дает возможность вычислить значение некоторого выражения или изменить его значение. Такое же действие вызывает команда Run | Evaluate/Modify.

• Add Watch at Cursor открывает диалог, который позволяет следить за изменением значения выражения, на которое указывает курсор. Все отслеживаемые выражения заносятся в список Watch List. Подобное действие вызывает команда Run | Add Watch .

• Read Only устанавливает атрибут "только чтение", запрещающий делать какие-либо изменения текущего файла. Это состояние файла отображается в нижней строке состояния Редактора кода.

• Message View открывает окно сообщений и ошибок, полученных на фазах компиляции и сборки программы.

• View CPU открывает окно отладчика нижнего уровня - ассемблерных команд.

• Properties позволяют просматривать и изменять текущие установки Редактора кода.

4.6 Палитра компонент

C++Builder поставляется вместе с усовершенствованной 32-разрядной Библиотекой Визуальных Компонент VCL (Visual Component Library), содержащей более 100 повторно используемых компонент для построения прототипов сложнейших приложений. Основные компоненты Библиотеки представлены на инструментальной панели Палитры компонент, значки которых перетаскиваются на форму вашей программы.

Библиотека включает полную инкапсуляцию стандартных интерфейсных объектов Графического Интерфейса Пользователя операционных систем Windows и Windows 95 (области редактируемого ввода, простые и комбинированные списки и многие другие), наряду со специализированными компонентами, среди которых особое место занимают компоненты для управления реляционными базами данных. Читателям, заинтересованным общей методикой и особенностями разработки приложений для баз данных, адресована отдельная глава 5.

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

Ключевая характеристика C++Builder заключается в его способности не только пользоваться готовыми компонентами в процессе визуальной разработки программ, но и создавать новые компоненты. Новые компоненты могут быть такими же простыми, как исходные, со слегка расширенными функциональными возможностями, или отличаться совершенно оригинальным видом, поведением и кодовым содержанием. Эти проблемы рассматриваются подробно в главе 6. Создание компонент базируется на механизме наследования ООП, практически не имеет ограничений и проходит через следующие стадии:

• наследование от существующего компонентного типа;

• определение новых свойств, методов и событий;

• регистрация созданной компоненты.

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

4.6.1 Стандартные компоненты

Компоненты вкладки Standard палитры компонент

осуществляют включение в вашу программу 14 стандартных интерфейсных элементов Windows.

4.6.1.1 TMainlVlenu

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

Идентификаторы всех команд меню определяются свойством Items, которое имеет доступ к любой конкретной команде меню. Свойство AutoMerge вместе с методами Merge и Unmerge управляют процессом слияния меню разных форм.

4.6.1.2 TPopUpMenu

Создает специальное меню для формы или для другой компоненты. Заметьте, что именно для этой цели любая прочая компонента имеет свойство PopUpMenu, в котором вы можете задать ссылку на связанное с ней меню. Подробная инструкция по конструированию меню приведена в разделе "Дизайнер меню".

Если вы хотите, чтобы специальное меню появлялось при нажатии правой кнопки мыши на форму или другой элемент, которому приписана данная компонента, установите значение true свойства AutoPopup. Работающее таким образом специальное меню называется контекстным. С помощью обработчика события ОпРорир можно определить процедуру, которая будет выполняться непосредственно перед появлением специального меню.

4.6.1.3 TLabel

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

Текст названия является значением свойства Caption. Свойство Alignment определяет способ выравнивания текста. Чтобы размер шрифта автоматически соответствовал максимальному заполнению области, установите значение true свойства AutoSize. Чтобы весь текст можно было увидеть внутри короткой области, задайте значение true свойства WordWrap. Установкой значения true свойства Transparent вы можете оставить видимой часть другой компоненты сквозь название, расположенное прямо на ней.

4.6.1.4 TEdit

Отображает прямоугольную область редактируемого ввода одиночной строки информации на форме. Начальное содержимое области редактирования определяет строка, являющаяся значением свойства Text.

TEdit является прямой производной от класса TCustomEdit, полностью наследуя его свойства, методы и события.

4.6.1.5 ТМето

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

TMemo является прямой производной от класса TCustomMemo, полностью наследуя его свойства, методы и события.

4.6.1.6 TButton

Создает прямоугольную кнопку с надписью. Нажатие на кнопку инициирует некоторое действие в программе.

Кнопки чаще всего используются в диалоговых окнах. Кнопка по умолчанию, выбранная значением true свойства Default, запускает обработчик события OnClick всякий раз, когда нажимается клавиша Enter в окне диалога. Кнопка прерывания, выбранная значением true свойства Cancel, запускает обработчик события OnClick всякий раз, когда нажимается клавиша Escape в окне диалога.

TButton является производной от класса TButtonControl.

4.6.1.7 TCheckBox

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

Состояние бокса "check" соответствует выбору некоторого варианта (отмечается перечеркиванием бокса), а состояние "uncheck" соответствует снятию выбору - при этом свойство компоненты Checked меняется соответственно и возникает событие OnClick. Описательный текст хранится в свойстве Caption. Затемнить бокс (подкрасить серым цветом) можно установкой значения true свойства AllowGrayed. Свойство State отражает текущее состояние и цвет бокса.

TCheckBox является производной от класса TButtonControl.

4.6.1.8 ЕЙ TRadioButton

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

Радио-кнопки представляют набор взаимоисключающих вариантов выбора:

только одна кнопка может быть выбрана в данный момент времени (отмечается внутренним черным кружком), а с ранее выбранной кнопки выбор автоматически снимается. При нажатии радио-кнопки свойство компоненты Checked меняется соответственно и возникает событие OnClick.

Обычно радио-кнопки размещаются внутри предварительно установленного на форме группового контейнера. Если выбрана одна кнопка, выбор всех прочих кнопок той же группе автоматически снимается. Например, две радио-кнопки на форме могут быть выбраны одновременно только в том случае, когда они размещены в разных контейнерах. Если группировка радио-кнопок явно не задана, то по умолчанию, все они группируются в одном из оконных контейнеров (TForm, TGroupBox или TPanel).

TRadioButton является производной от класса TButtonControl.

4.6.1.9 TListBox

Отображает прямоугольную область списка текстовых вариантов для выбора, добавления или вычеркивания.

Если все элементы списка не умещаются в отведенную область, то список можно просматривать с помощью линейки прокрутки. Элементы списка содержатся в свойстве Items, а номер элемента, который будет выбран во время выполнения программы, - в свойстве Itemlndex. Окно текстового редактора элементов

списка открывается кнопкой в графе значений свойства Items. Можно динамически добавлять, вычеркивать, вставлять и перемещать элементы списка с помощью методов Add, Append, Delete и Insert объекта Items, например:

ListBoxl->Items->Add("Последний элемент списка");

Значение true свойства Sorted устанавливает сортировку элементов списка по алфавиту.

TListBox является производной от класса TCustomListBox, полностью наследуя его свойства, методы и события.

4.6.1.10 TComboBox

Создает комбинацию области редактирования и выпадающего списка текстовых вариантов для выбора.

Значение свойства Text заносится непосредственно в область редактирования. Элементы списка, которые может выбирать пользователь, содержатся в свойстве Items, номер элемента, который будет выбран во время выполнения программы, -в свойстве Itemlndex, а сам выбранный текст - в свойстве SelText. Свойства SelStart и SelLength позволяют установить выборку части текста или обнаружить, какая часть текста выбрана.

Можно динамически добавлять, вычеркивать, вставлять и перемещать элементы списка с помощью методов Add, Append, Delete и Insert объекта Items, например:

ComboBoxl->Items->Insert(0, "Первый элемент списка");

Значение true свойства Sorted задает сортировку элементов списка по алфавиту. Вид компоненты TComboBox можно выбрать в свойстве Style.

TComboBox является производной от класса TCustomComboBox, полностью наследуя его свойства, методы и события.

4.6.1.11 TScrollBar

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

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

Значения свойств Min и Мах устанавливают интервал допустимых перемещений бегунка. Ваша программа может установить бегунок в нужную позицию, определяемую значением свойства Position. Метод SetPcirums определяет значения всех свойств Min, Мах и Position одновременно.

4.6.1.12 TGroupВох

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

4.6.1.13 TRadioGroup

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

Радио-кнопки "группируются" при помещении их в один и тот же контейнер. Только одна кнопка из данной группы может быть выбрана. Добавление кнопок к компоненте TRadioGroup выполняется редактированием свойства Items. Присвоение названия очередной строке свойства Items приводит к появлению этой кнопки в группирующей рамке. Значение свойства Itemlndex определяет, какая радио-кнопка выбрана в настоящий момент. Вы можете группировать радиокнопки в несколько столбцов, устанавливая соответствующее значение свойства Columns.

4.6.1.14 TPanel

Создает пустую панель, которая может содержать другие компоненты. Вы можете использовать TPanel для создания на вашей форме панелей инструментов или строк состояния.

TPanel является производной от класса TCustomPanel, полностью наследуя его свойства, методы и события.

4.6.2 Компоненты Win95

Компоненты вкладки Win95 палитры компонент

осуществляют включение в вашу программу 12 интерфейсных элементов Windows 95.

4.6.2.1 TTabControl

Отображает набор частично перекрывающих друг друга картотечных вкла-док. Названия вкладок вводятся в список свойства Tabs кнопкой

в графе значений этого свойства. Рис. 4.5 показывает заготовку формы приложения для работы с алфавитным библиотечным указателем. Если все поля не умещаются на форме в один ряд, то можно установить значение true свойства MultiLine, или прокручивать вкладки с помощью кнопок со стрелками.

Рис. 4.5. Картотечные вкладки с названиями.

Установка значения false свойства Enabled запретит выборку отдельных вкладок.

4.6.2.2 TPageControl

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

Чтобы создать новую страницу диалога с соответствующей вкладкой, выберите опцию New Page из контекстного меню данной компоненты. Вы можете активизировать конкретную страницу одним из следующих способов: с помощью мыши, выбрав ее из выпадающего списка свойства ActivePage, а также перелистывая вкладки с помощью опций Next Page и Previous Page контекстного меню. Свойство Pagelndex содержит номер активной страницы. Установкой значения false свойства Tab Visible можно сделать эту страницу невидимой.

Рис. 4.6. Многостраничный диалог.

Рис. 4.6 показывает заготовку формы приложения с многостраничным диалогом для второй активизированной страницы. Работу с вкладками реализует встроенная компонента управления TTabSheet. Если все вкладки не умещаются в один ряд, компонента выводит кнопки прокрутки. Задайте значение true свойства MultiLine, чтобы отобразить вкладки в несколько рядов.

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

Свойство Items ссылается на объект TTreeNodes, которое содержит редактируемый список элементов дерева. Окно редактора элементов дерева (Рис. 4.7) открывается кнопкой в графе значений этого свойства. Каждый элемент дерева состоит из метки, списка ассоциируемых с ним субэлементов и ряда битовых образов (если таковые имеются). Щелкая мышью на элементе, пользователь может раскрывать или закрывать соответствующий список суб-элементов. Двойной щелчок мышью раскрывает один уровень родительского узла дерева, показывая только его прямых потомков. Свойство ShowButtons отвечает за отображение кнопки (со знаком "+", если данный узел не раскрыт и содержит суб-элементы, или со знаком "-" в противном случае) слева от родительского узла: нажатие этой кнопки является альтернативой двойного щелчка мышью по родительскому элементу.

Рис. 4.7. Конструирование дерева компоненты TTreeView.

Число раскрываемых потомков задается значением свойства Indent. Чтобы упорядочить списки потомков в алфавитном порядке, установите значение stText

для свойства SortType. Значение true свойства Visible вызывает отображение линий - ветвей дерева, связывающих родителей с их потомками.

Элементы можно добавлять и вставлять в список динамически с помощью следующих методов для объекта Items ->TTreeNode: AddChildFirst, AddChild, AddChildObjectFirst, AddChildObject, AddFirst, Add, AddObjectFirst,AddObject.Insert,InsertObject.

4.6.2.4 TListView

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

Свойство Items позволяет добавлять, вычеркивать и модифицировать подписи, а также подбирать пиктограммы для элементов списка. Редактор списка вызывается кнопкой в графе значений этого свойства.

Свойство Columns содержит редактируемый список названий заголовков столбцов в списке. Окно редактора столбцов открывается кнопкой

графе значений этого свойства. Чтобы увидеть заголовки, задайте значение vsReport для свойства ViewStyle, а значение true для свойства ShowColumnHeaders. Установка значения true свойства ColumnClick определяет поведение заголовка аналогичное кнопке: когда пользователь щелкает мышью по подписи, возникает событие OnColumnClick. События OnEdiling и OnEcUtecl возникают, когда пользователь начинает и завершает редактирование подписи.

Для выбора источника пиктограмм из выпадающего списка свойств Largelmages (Smalllmages) задайте значения vslcon (vsSmallIcon) для свойства ViewStyle. В режиме AutoArrange свойства IconOptions пиктограммы выравниваются в соответствии с выбранным значением свойства Arrangement, а свойство WrapText указывает необходимость переноса текста подписи, когда она не умещается на пиктограмме по ширине. Рис. 4.8 показывает процесс конструирования древовидного списка, причем источником больших пиктограмм является компонента TImageList, на объект которой указывает свойство Largelmages.

Рис. 4.8. Конструирование древовидного списка и его отображение на форме.

4.6.2.5 TImageList

Создает контейнер для коллекции из графических изображений одинакового размера K *k, каждое из которых можно выбирать по его индексу в интервале значении от 0 до п-1. Графические коллекции используются для эффективного обслуживания больших наборов битовых образов или пиктограмм, которые хранятся как единый битовый образ шириной k*n. Монохромные изображения с масками отображаются как прозрачные трафареты. TImageList имеет методы, облегчающие процессы записи, выборки и вывода хранимых изображений.

Рис. 4.9. Конструирование коллекции пиктограмм.

Окно редактора коллекции изображений (Рис. 4.9) открывается двойным щелчком мышью по компоненте или опцией ImageList Editor из ее контекстного меню.

TImageList является производной от класса TCustomImageList, полностью наследуя его свойства, методы и события.

4.6.2.6 THeaderControl

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

Рис. 4.10. Конструирование секций заголовков.

Поскольку секции заголовков можно подогнать буквально к любым другим компонентам (Рис. 4.11). манипуляция с их шириной автоматически не вызовет адекватного изменения ширины ассоциированных компонент. Если же вы хотите, чтобы ширина столбца изменялась согласно изменениям ширины секции, вам придется написать обработчик события OnSectionResize, ответственный за эти действия.

Рис. 4.11. Конструирование библиографического справочника.

4.6.2.7 TRichEdit

Отображает область редактируемого ввода множественных строк информации в формате RTF (Rich Text Format), который включает различные вариации атрибутов шрифта и форматирования параграфов. Данный формат принимают многие профессиональные текстовые процессоры, например, Microsoft Word.

Рис. 4.12. Проектирование и исполнение приложения для чтения RTF файла.

В окне Редактора кода (средняя часть Рис. 4.12) выделена единственная инструкция обработчика события OnАctivate, возникающего при активизации формы и вызывающего чтение файла OVER VIEW.RTF в объект RichEditI компоненты редактируемого ввода. Нижняя часть рисунка демонстрирует работу скомпилированного и собранного приложения.

TRichEdit является прямой производной от класса TCustomRichEdit, полностью наследуя его свойства, методы и события.

4.6.2.8 TStatusBar

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

Каждая панель представлена в списке свойства Panels. Панели нумеруются слева-направо, начиная с индекса 0. Окно редактора панелей (Рис. 4.13) открывается кнопкой в графе значений этого свойства. Свойство SimplePanel используется для переключения вида отображения строки состояния (одно- или много- панельная).

Рис. 4.13. Конструирование строки панелий состояния.

В окне Редактора кода (средняя часть Рис. 4.14) выделена единственная инструкция обработчика события OnMoiiseMovc', возникающего при перемещении мыши по форме и вызывающего вывод координатор курсора в панель Panels->Item[l] объекта StatusBarl компоненты строки состояния. Нижняя часть рисунка демонстрирует работу скомпилированного и собранного приложения.

Рис. 4.14. Вывод информации па петель строки состояния.

Эта компонента представляет собой инкапсуляцию одноименного объекта Windows.

4.6.2.9 TTrackBar

Создает шкалу с метками и регулятором текущего положения (вариант линейки прокрутки).

Свойства Min и Мах устанавливают интервал значений шкалы, причем свойство Position отражает текущую позицию регулятора внутри заданного интервала. Число изображаемых меток специфицирует свойство Frequency. На сколько меток должен продвинуться регулятор, когда пользователь щелкает мышью на самой шкале (по обеим сторонам от регулятора) или нажимает клавиши PageUp и PageDown, определяет значение свойства PageSize. На сколько меток должен продвинуться регулятор, когда пользователь нажимает клавиши позиционирования курсора, определяет значение свойства LineSize.

Чтобы изменить вид шкалы, используйте свойства TickStyle и TickMarks. Значения свойств SelStart и SelEnd устанавливают границы разрешенных перемещений регулятора.

4.6.2.10 TProgressBar

Создает индикатор, который отслеживает процесс выполнения некоторой процедуры в вашей программе. По мере выполнения процедуры, прямоугольный индикатор постепенно окрашивается слева направо заданным цветом.

Свойства Min и Мах устанавливают интервал значений индикатора. Свойство Step задает шаг изменения значения свойства Position всякий раз, когда позиция индикатора меняется.

C++Builder поставляется вместе с шуточным примером, который демонстрирует работу прогресс-индикатора в тесте для измерения "скорострельности" работы машинисток

=> По команде главного меню File | Open Project

откройте диалог выбора проектов. => Войдите в каталог \...\CBuilder\Examples\Apps\Wpm. => Выберите проектный файл Wpm и нажмите кнопку Open.

=> Командой главного меню Run | Run запустите процесс компиляции и сборки приложения.

Код программного модуля WPMMAIN.CPP чрезвычайно лаконичен и не нуждается в дополнительных комментариях. Вы легко сможете адаптировать поведение приложения в соответствии со своим вкусом, в частности, переведя его на родной язык. Результат самотестирования автора книги (Рис. 4.15) показывает его совершенную непригодность к машинописи.

Рис. 4.15. Работа приложения для тестирования машинисток.

4.6.2.11 TUpDown

Создает спаренные кнопки со стрелками л. (вверх) и •”• (вниз). Нажатие этих кнопок вызывает, соответственно, увеличение или уменьшение численного значения свойства Position.

Эта компонента обычно используется вместе с сопровождающим элементом управления, задаваемым свойством Associate. Когда сопровождающим элементом служит область редактируемого ввода, значение свойства Position определяет форматирование вводимого текста. Если свойство Associate не специфицировано, значение свойства Position содержит числовую величину.

4.6.2.12 И THotKey

Используется для установки клавиш быстрого вызова (shortcut) во время выполнения программы. Пользователь может ввести комбинацию "горячих" клавиш, обычно состоящую из модификатора (Ctrl, Alt или Shift) и любого символа, включая функциональные клавиши F1,..F12.

Введенную комбинацию, записанную в свойстве HotKey, можно присвоить свойству Shortcut другой компоненты. Чтобы выбрать горячие клавиши на стадии проектирования, используйте свойства HotKey и Modifiers, а чтобы отменить их - свойство InvalidKeys. Чтобы изменить комбинацию во время выполнения программы, удерживайте нажатой клавишу модификатора и одновременно введите новый символ.

4.6.3 Дополнительные компоненты

Компоненты вкладки Additional палитры компонент

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

4.6.3.1 TBitBtn

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

Графические кнопки имеют свойства для спецификации битовых образов, их вида и размещения на кнопке. Вы можете пользоваться готовыми стилями графических кнопок из отдельного каталога изображений, входящего в поставку C++Buider или собственными картинками, созданными одной из систем редактирования изображений. Различным состояниям кнопки (например, "нажата", "отпущена", "запрещена" и т.п.) могут соответствовать разные битовые образы.

Окно редактора файлов изображений с расширением bmp (Рис. 4.16) открывается кнопкой

значений свойства Glyph. Свойство Kind поможет вам создать стандартизованные кнопки, снабженные надписями и соответствующей графикой: ОК, Cancel. Helo и другие.

Рис. 4.16. Редактор изображений файлов битовых образов с расширением bmp.

4.6.3.2 TSpeed Button

Создает графическую кнопку, обычно располагаемую на панели (TPanel) быстрого вызова определенных команд меню или установки режимов.

Различным состояниям быстрой кнопки (например, "нажата", "отпущена", "запрещена" и т.п.) могут соответствовать разные графические образы. Имеются свойства для выбора заменяющих друг друга изображений и текста надписи. Окно редактора файлов изображений с расширением (Рис. 4.16) открывается кнопкой графе значений свойства Glyph. Другие свойства быстрых кнопок организуют их работу в некоторой группе.

Создает контролируемую прямоугольную область редактируемого ввода данных специфического формата. Корректность вводимого текста проверяется посредством маски, кодирующей разрешенные форматы, в которых текст может быть введен и представлен пользователю (дата, время, телефонный номер и т.п.). Свойство EditMask хранит код текущей маски. Окно редактора масок (Рис. 4.17)

открывается кнопкой в графе значений этого свойства.

Рис. 4.17. Создание маски для ввода телефонных номеров.

TMaskEdit является прямой производной класса TCustomMaskEdit.

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

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

Все объекты, связанные с символьными последовательностями, заключены в свойстве Objects, которое позволяет обращаться к нужному объекту. Во время выполнения программы символьные последовательности и связанные с ними объекты некоторого столбца сетки адресуются свойством Cols. Свойство Rows позволяет подобным образом оперировать со строками сетки. Все символьные последовательности сетки содержатся в свойстве Cells, которое адресует нужную ячейку сетки.

4.6.3.5 TDrawGrid

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

Значение свойства Options позволяет изменить вид сетки (например, с разделительными линиями между столбцами) и ее поведение (например, с переходом от столбца к столбцу по клавише Tab). Ширина разделительных линий сетки задается свойством GridLineWidth, а линейки прокрутки добавляются свойством ScrollBars. Свойства FixedCols и FixedRows позволяют запретить прокрутку столбцов и строк, а свойство FixedColor присваивает определенный цвет всем столбцам и строкам.

Значение true свойства DefauItDrawing вызывает автоматическую прорисовку содержимого ячеек сетки, причем ее фон, канва и цвет выбираются по умолчанию. Установка значения false свойства DefauItDrawing требует написания обработчика события OnDrawCell для заполнения ячеек сетки "вручную". С помощью свойств DefaultColWidths и DefaultRowHeights можно установить ширину всех столбцов и высоту всех строк, выбираемых по умолчанию. Свойства ColWidth и RowHeight специфицируют ширину конкретного столбца и высоту конкретной строки.

Во время работы программы вы можете получить в свое распоряжение область для рисования некоторой ячейки с помощью метода CellRect. Метод MouseToCell возвращает координаты номера столбца и строки ячейки, на которую установлен курсор мыши. Выбранная ячейка сетки становится значением свойства Selection.

Можно определить, какая строка является в момент выполнения верхней строкой сетки или поставить указанную строку в верхнее положение с помощью свойства TopRow. Чтобы определить, какой столбец будет первым видимым столбцом сетки, воспользуйтесь свойством LeftCol. Значения свойств VisibleColCount и VisibleRowCount специфицируют общее число видимых столбцов и строк сетки.

4.6.3.6 HTImage

Создает на форме контейнер графического изображения (битового образа, пиктограммы или метафайла).

Окно редактора файлов изображений (Рис. 4.16) открывается кнопкой

в графе значений свойства Picture. Чтобы контейнер изменил свои размеры так, чтобы вместить изображение целиком, установите значение

true свойства AutoSize. Чтобы исходное изображение меньшего размера растянулось на весь контейнер, задайте значение true свойства Stretch.

Используйте методы LoadFromFile и SaveToFile объектного свойства Picture для динамической загрузки и сохранения файлов изображений с помощью инструкций типа:

Image->Picture->LoadFromFile("<имя файла>") ;

Image->Picture->SaveToFile("<имя файла>");

4.6.3.7 TShape

Рисует простые геометрические фигуры - окружность и эллипс, квадрат и прямоугольник (можно с закругленными углами).

Вид выбранной геометрической фигуры определяется свойством Shape, а цвет и способ ее окраски - двумя вложенными в Brush свойствами Color и Style. Размеры фигур определяются соответствующими свойствами.

4.6.3.8 TBevel

Создает линии, боксы или рамки, которые выглядят объемными, как бы вырезанными стамеской.

Рисуемый компонентой объект определяется свойством Shape, а значение свойства Style меняет вид объекта, делая его выпуклым или вдавленным. Чтобы сохранить относительное положение объекта неизменным, даже если пользователь изменит размеры формы, установите значение true свойства Align.

4.6.3.9 TScrollBox

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

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

Другое использование боксов прокрутки заключается в возможности создания множественных прокручиваемых областей (видов) в некотором окне. Виды часто присутствуют в коммерческих текстовых процессорах, бухгалтерских программах и в программах планирования проектов. Бокс прокрутки может содержать другие компоненты, например, TButton и TCheckBox.

4.6.4 Компоненты доступа к базам данных

Невидимые компоненты вкладки Data Access палитры компонент обеспечивают соединения с базами данных, что позволяет разработчику сфокусировать

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

Компоненты осуществляют включение в вашу программу 8 интерфейсных элементов доступа к наборам данных (datasets) - таблицам, запросам, хранимым процедурам, сессиям и другим основным сущностям баз данных.

Доступ к базам данных поддерживает его основа - 32-разрядный механизм BDE (Borland Database Engine).

4.6.4.1 TDataSource

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

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

Компоненты TDataSource также способны организовать парные связи таблиц между собой по принципу master-detail и поддерживать синхронизацию обмена.

Установка значения false свойства AutoEdit запрещает режим редактирования набора данных. Свойство DataSet указывает, с каким набором данных (таблицей, запросом) связан их источник.

4.6.4.2 ТТаble

Представляет собой интерфейс между механизмом BDE и компонентой TDataSource, которая, в свою очередь, образует соединение с такими компонентами управления, как TDBGrid.

Именно посредством ТТаЫе, обеспечивается доступ на этапе проектирования к живым данным (live data) из таблицы локальной базы данных: все записи или столбцы адресуемой таблицы сразу же становятся доступными для приложения.

Свойство Active устанавливает активное состояние связи с таблицей, чтобы можно было увидеть на форме живые данные. Свойство DatabaseName содержит псевдоним адресуемой базы данных или полный путь к ее каталогу, а свойство TableName - имя таблицы.

Установите значение true свойства ReadOnly, если хотите запретить изменения содержимого таблицы. Установите значение true свойства Exclusive, если хотите запретить другому приложению обращаться к таблице, пока вы ее используете сами.

4.6.4.3 TQuery

Подобно TTable, компонента TQuery представляет собой интерфейс между сервером локальной (или удаленной) базы данных и компонентой TDataSource, обеспечивая доступ на этапе проектирования к живым данным из одной или нескольких таблиц.

Благодаря командам на языке структурированных запросов SQL (Structured Query Language), компонента TQuery получает групповой доступ к таблице. В дальнейшем мы будем ссылаться только на четыре базовые команды, которые поддерживаются всеми версиями стандарта SQL: SELECT - для выбора данных;

INSERT - для добавления новых данных; UPDATE - для модификации таблиц;

DELETE -для удаления данных. Синтаксис построения и параметры этих команд поясняются на конкретных примерах, приведенных в главе 5.

C++Builder передает запросы BDE серверу (или SQL серверу), который интерпретирует их и возвращает вашему приложению результирующий набор (result set) - запрошенную группу записей или столбцов.

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

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

кнопку в графе значений свойства SQL.

4.6.4.4 TStoredProc

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

Свойство DatabaseName содержит псевдоним базы данных сервера, на котором находится хранимая процедура, а свойство StoredProcName - имя процедуры.

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

Хранимую процедуру необходимо подготовить к запуску: на стадии проектирования - с помошью редактора параметров. а во время выполнения программы - с помощью метода Prepare

Исполнение хранимой процедуры реализует метод ЕхесРгос (если процедура возвращает одиночный результат в виде единственной записи) или метод Open (если процедура возвращает результирующий набор в виде множественных записей).

4.6.4.5 TDatabase

Эта компонента не участвует в организации доступа на уровне наборов данных, хотя предоставляет возможность соединения клиент/сервер с одиночной базой данных в одной сессии. Компонента TDatabase используется для выдачи специфических команд управления базой данных или создания временного локального псевдонима некоторой удаленной базы данных, но особенно целесообразна для организации управления обработкой транзакций на удаленном SQL сервере.

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

4.6.4.6 TSession

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

Компонента TSession организует стандартные сессии, множественные сетевые сессии с файлами базы данных Paradox и сессии приложений с повторными вхождениями.

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

Вы можете управлять поведением сессии во время работы приложения, обращаясь к ее свойствам, событиям и методам.

4.6.4.7 TBatchMove

Разрешает вашему приложению выполнять пакетные операции над группами записей или целыми таблицами. Эта компонента обычно используется в приложениях, ориентированных на администратора базы данных, чтобы предоставить ему возможности пересылки больших объемов данных, вплоть до всего содержимого базы данных. К пакетным операциям относятся:

• добавление группы записей в некотором наборе данных к таблице назначения базы данных:

• вычеркивание группы записей в некотором наборе данных из таблицы назначения базы данных;

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

Выпадающие списки свойств Source и Destination позволяют выбрать имя таблицы источника и таблицы назначения, соответственно. Установите нужную пакетную операцию (batAppend, batUpdate, batAppendUpdate, batCopy или batDelete) в свойстве Mode и обратитесь к методу Execute, чтобы выполнить ее. Свойство ProblemTableName инструктирует BDE, в какую таблицу заносить те записи источника, обращение с которыми вызвало проблемы в ходе пакетной операции.

Реализовать пакетные операции, хотя и с некоторыми ограничениями, можно также при помощи компоненты TTable.

4.6.4.8 TUpdateSQL

Позволяет использовать механизм котируемых обновлений (cached updates) в стиле Delphi для обслуживания результирующих наборов с атрибутом "только чтение", возвращаемых некоторыми запросами. Кэшируемые обновления заметно ускоряют отклик SQL сервера за счет уменьшения общего числа сетевых обменов с клиентом. Будучи упакованными, множественные коммуникации проявляют себя как одиночные транзакции, тем самым снижая загруженность сервера и улучшая производительность вашего приложения.

Установка свойства UpdateObject обеспечивает связь данной компоненты с набором данных.

Свойство ModifySQL представляет собой SQL команду UPDATE, которая выполняется, когда кэшируемое обновление является модификацией существующей записи. Свойство InsertSQL представляет собой команду INSERT, которая выполняется, когда кэшируемое обновление содержит вставку новой записи. Свойство DeleteSQL представляет собой команду DELETE, которая выполняется, когда кэшируемое обновление состоит в вычеркивании некоторой записи. Перечисленные свойства обеспечивают нормальную передачу параметров для кэ-шируемых обновлений. Используйте префикс "OLD_" с именем поля, чтобы получить его значение перед тем, как кэшируемое обновление было разрешено. Доступ к старому значению поля обычно требуется при создании конструкции WHERE перечисленных команд SQL.

Метод Apply используется для принудительного исполнения команд SQL, например, из обработчика события OnUpdateRecord. Этот метод сочетает обращение к SetParams (установка связки параметров) и к ExecSQL (фактическое выполнение команды SQL).

4.6.5 Компоненты управления данными

Видимые компоненты вкладки Data Controls палитры компонент обеспечивают взаимодействие пользователя с источниками данных вашего приложения.

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

4.6.5.1 TDBGrid

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

Вы должны связать TDBGrid с набором данных посредством компоненты источника TDataSource, который идентифицируется значением свойства DataSource. Свойство Columns содержит редактируемый список названий заго-ловков столбцов в сетке. Окно редактора столбцов (Рис. 4.18) открывается кнопкой в графе значений этого свойства или опцией Columns Editor из контекстного меню компоненты.

Рис. 4.18. Редактор столбцов компоненты сетки.

Значение свойства Options позволяет изменить вид сетки (например, с разделительными линиями между столбцами) и ее поведение (например, с переходом от столбца к столбцу по клавише Tab). Значение свойства TitleFont определяет шрифт, используемый при написании заголовков столбцов сетки. Свойство Fields содержит массив всех полей набора данных, изображаемых в сетке во время работы программы, свойство FieldCount - их число, а свойство SelectedField - поле, выбранное в данный момент.

Значение true свойства ReadOnly запрещает, а значение false разрешает редактирование данных при условии, что набор данных находится в режиме редактирования. Прервать редактирование можно нажатием клавиши Esc или аналогичной кнопки на панели навигатора. Фактическое изменение данных в полях происходит только после того, как выбрана новая запись, или при выходе из программы.

4.6.5.2 TDBNavigator

Навигатор базы данных TDBNavigator используется для перемещений по записям набора данных и выполнения операций по их просмотру и редактированию.

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

Когда пользователь нажимает одну из кнопок на панели навигатора (Рис. 4.19), выполняется надлежащее действие над записью в наборе данных, с которым связан навигатор. Например, при нажатии кнопки "+" пустая запись вставляется в таблицу перед текущей записью.

Перейти к первой записи Перейти к предыдущей записи Перейти к следующей записи Перейти к последней записи Вставить новую запись Вычеркнуть текущую запись Включить режим редактирова-Записать изменения записи Прервать редактирование Обновить набор данных

Рис. 4.19. Форма с панелью навигатора и компонентой TDBGrid.

Вы должны связать TDBNavigator с набором данных посредством компоненты источника TDataSource, который определяется значением свойства DataSource.

4.6.5.3 TDBText

Отображает, по аналогии с компонентой TLabel, поле текущей записи в наборе данных в виде названия - статического текста, который нельзя редактировать

Вы должны связать TDBText с набором данных посредством компоненты источника, который определяется значением свойства DataSource. Свойство DataField содержит поле в наборе данных, к которому вы хотите обратиться.

Свойство Alignment определяет способ выравнивания текста. Чтобы автоматическая установка размера шрифта позволяла бы отображать текст названия целиком, установите значения true свойства AutoSize. Чтобы можно было просмотреть длинный текст названия по частям, установите значения true свойства Wordwrap. Задавая значение true свойства Transparent, вы можете оставить видимой часть графики сквозь название.

4.6.5.4 TDBEdit

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

Свойство Text содержит поле в наборе данных, рассчитанное на одиночную строку. TDBEdit использует маску контроля корректности ввода в поле базы данных.

4.6.5.5 TDBMemo

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

Свойство Text адресует указанное поле в наборе данных, содержащее многострочную алфавитно-цифровую последовательность или Большой Бинарный Объект (BLOB).