Эта глава содержит описание
основных инструментов визуальной разработки
программных приложений. Именно благодаря этим
средствам, в сочетании с мощностью новейшего
компилятора с языка 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).
4.6.5.6 TDBImage
Создает, по аналогии с компонентой
TImage, контейнер для
представления графического изображения, которое
хранится в текущей записи набора данных в виде
Большого Бинарного Объекта (BLOB). Установка значения
false свойства Readonly разрешает модификацию
изображения.
Вы должны связать контейнер изображения с
набором данных посредством компоненты
источника, который определяется значением
свойства DataSource. Свойство DataField содержит поле в наборе данных,
к которому вы хотите обратиться.
Свойство AutoDisplay управляет автоматическим масштабированием
контейнера. Чтобы исходное изображение меньшего
размера растянулось на весь контейнер,
установите значение true свойства Stretch. Если вы передумали и хотите
вернуть изображение в исходное состояние,
нажмите клавишу Esc - конечно, до того, как перейти к
другой записи. Во время выполнения программы вы
можете вырезать, копировать и восстанавливать
изображение из базы данных, нажимая типовые
комбинации клавиш (Ctrl+X, Ctrl+C и Ctrl+V).
4.6.5.7 TDBListBox
Создает, по аналогии с компонентой
TListBox, список, выбранный
элемент которого становится новым значением
поля текущей записи в наборе данных.
Вы должны связать список с набором данных
посредством компоненты источника, который
идентифицируется значением свойства
DataSource. Свойство DataField содержит поле
в наборе данных, к которому вы хотите обратиться.
Элементы списка, которые может выбирать
пользователь, содержатся в свойстве
Items, а номер выбранного
элемента - в свойстве Itemlndex. Вы можете динамически
добавлять, вычеркивать и вставлять элементы
списка с помощью методов Add, Append, Delete и Insert объекта Items, например:
DBListBoxl->Items.Delete(3);
4.6.5.8 TDBComboBox
Создает, по аналогии с компонентой
TComboBox, комбинацию
области редактирования и выпадающего списка
текстовых вариантов для выбора. Текст, введенный
в область редактирования или выбранный из
списка, становится новым значением поля текущей
записи в наборе данных, при условии, что свойство Readonly имеет значение false.
Вы должны связать комбинированный список с
набором данных посредством компоненты
источника, который идентифицируется значением
свойства DataSource. Свойство DataField содержит поле в наборе данных,
к которому вы хотите обратиться.
Элементы списка, которые может выбирать
пользователь, содержатся в свойстве
Items, номер выбранного
элемента - в свойстве Itemlndex, а сам выбранный текст - в
свойстве SelText. Свойства SelStart и SelLength позволяют установить выборку
части текста или обнаружить, какая часть текста
выбрана. Вы можете динамически добавлять,
вычеркивать и вставлять элементы списка с
помощью методов Add, Append, Delete и Insert объекта Items, например:
DBComboBoxl->Items->Insert(4,
"Пятый элемент списка");
Правила сортировки списка задаются свойством Sorted. Вид и
поведение компоненты TDBComboBox можно выбрать в свойстве Style.
4.6.5.9 TDBCheckBox
Предоставляет по аналогии с компонентой TCheckBox чек-бокс
выбора состояния, связанного с конкретной
записью в наборе данных.
Вы должны связать чек-бокс с набором данных
посредством компоненты источника, который
определяется значением свойства
DataSource. Свойство DataField содержит поле
в наборе данных, к которому вы хотите обратиться.
Если содержимое поля текущей записи совпадает
со значением свойства ValueChecked, бокс переходит в начальное
состояние "checked". Если содержимое поля текущей
записи совпадает со значением свойства ValueUnchecked, бокс
переходит в начальное состояние
"unchecked". В
зависимости от установленного пользователем
состояния бокса, текущая запись приобретает
значение свойства ValueChecked или ValueUnchecked, при условии, что свойство Readonly имеет
значение false и набор данных находится в режиме
редактирования. Если вы хотите запретить
пользователю изменять поля записей, установите
значение true
свойства ReadOnly.
4.6.5.10 TDBRadioGroup
Предоставляет по аналогии с компонентой TRadioGroup контейнер
для группы логически взаимоисключающих
радио-кнопок, связанных с конкретными полями
записей в наборе данных.
Радио-кнопки "группируются" при помещении
их в один и тот же контейнер. Только одна кнопка
из данной группы может быть выбрана. Когда
пользователь выбирает кнопку, ее "значение"
становится содержимым поля текущей записи в
наборе данных. Значения кнопок можно
редактировать в свойстве Values: первой строке Values соответствует первая строка
свойства Items
и т.д.
Группу радио-кнопок можно использовать для
обеспечения единственного выбора из
альтернатив, представленных полями записей, а
также - для отображения данных поля, имеющего
несколько возможных значений.
Вы должны связать группу радио-кнопок с набором
данных посредством компоненты источника,
который идентифицируется значением свойства DataSource. Свойство DataField содержит поле
в наборе данных, к которому вы хотите обратиться.
Добавление кнопок к компоненте
TDBRadioGroup выполняется
редактированием свойства Items. Присвоение названия очередной
строке свойства Items приводит к появлению этой
кнопки в группирующей рамке. Значение свойства Itemlndex определяет,
какая радио-кнопка выбрана в настоящий момент. Вы
можете группировать радио-кнопки в несколько
столбцов, устанавливая соответствующее значение
свойства Columns.
4.6.5.11 TDBLookupListBox
Создает таблицу ссылок для заполнения полей
информацией из другого набора данных.
Небольшая по объему таблица ссылок (lookup table) содержит
коды разрешенных значений, которые может
принимать некоторое поле. Например, в базе данных
электронной записной книжки обязательно имеются
записи почтовых адресов. Название города и улицы
из конкретного адреса можно закодировать в
таблицах ссылок "Города" и "Улицы".
Компоненты будут эффективно обращаться с
короткими кодами полей (например, "МК"
вместо "Москва" или "ЛНП" вместо
"Ленинградский проспект"), структура базы
данных станет равномерной, а пользователь
по-прежнему будет оперировать с полями полных
названий.
Вы должны связать компоненту TDBLookupListBox с
набором данных посредством компоненты источника TDataSource, который
идентифицируется значением свойства
DataSource. Свойство DataField указывает
либо на поле в наборе данных, либо на поле в
таблице ссылок, к которому вы хотите обратиться.
В последнем случае вам не надо определять прочие
свойства - компонента сделает это самостоятельно.
Не забудьте поместить на форму еще пару
компонент TTable и TDataSource, чтобы получать информацию из таблицы
ссылок. Свойство ListSource идентифицирует источник
таблицы ссылок. Свойство ListField представляет поле в таблице
ссылок, содержащее код ссылки как таковой.
Свойство KeyField определяет индекс поля ссылки, которое вы
хотите скопировать в DataField.
4.6.5.12 TDBLookupComboBox
Создает комбинацию области редактирования и
выпадающей таблицы ссылок для заполнения полей
информацией из другого набора. Смысловое
содержание свойств компонент TDBLookupComboBox и TDBLookupListBox полностью
совпадает.
4.6.6 Компоненты Win 3.1
Компоненты вкладки Win 3.1 палитры компонент

представляют 7 интерфейсных элементов Windows 3.1 для
включения в вашу программу.
4.6.6.1 TDBLookupList
Эта компонента поддерживает совместимость с
системой Windows
3.1; ее аналогом является компонента TDBLookupListBox из
вкладки Data Controls.
4.6.6.2 TDBLookupCombo
Эта компонента поддерживает совместимость с
системой Windows
3.1; ее аналогом является компонента TDBLookupComboBox из
вкладки Data Controls.
4.6.6.3 [TTabSet
Отображает ряд горизонтальных вкладок, нажатие
на которые инициирует некоторые действия в вашей
программе. Эта компонента поддерживает
совместимость с Windows 3.1; ее аналогом является
компонента TTabControl из вкладки Win95.
Названиявкладок вводятся в список свойства Tabs кнопкой в графе
значений этого свойства. TTabSet обычно используется совместно
с компонентой TNotebook для представления ряда страниц
блокнота в одном диалоговом окне. В этом случае
обработчик события OnClick сначала соединяет все страницы
блокнота с вкладками, а затем меняет текущую
страницу блокнота при нажатии на новую вкладку:
TabSetl->Tabs = Notebookl->Pages;
Notebookl->PageIndex = TabSetl->TabIndex;
Номер выбранной вкладки содержится в свойстве Tablndex. Чтобы
определить, какая вкладка является (или сделать
вкладку) первой видимой в наборе, воспользуйтесь
свойством Firstlndex.
Несколько свойств управляют видом компоненты.
Значение alBottom свойства Align требует разместить вкладки внизу формы.
Цветовое различие выбранной и невыбранных
вкладок задают свойства SelectedColor и UnselectedColor. Свойства BackgroundColor и DitherBackground меняют цвет и яркость фона под
набором вкладок. Расстояние вкладок от краев
компоненты определяют свойства StartMargin и EndMargin. Чтобы появлялись кнопки
прокрутки, когда не хватает места для
отображения всех вкладок, установите значение true свойства AutoScroll. Выбор между
надписями и графическими изображениями на
вкладках осуществляет свойство Style.
4.6.6.4 TOutline
Представляет механизм построения
многоуровневой древовидной структуры для
определенной иерархии данных.
Отрезки линий обводки (ветви дерева)
пронумерованы, начиная с 1, и содержатся в массиве
свойства Items.
Одна и та же, например, первая (верхняя) ветвь
некоторого дерева Outlinel может адресоваться прямо, как Outlinel[l], или
косвенно, как Outlinel. Items[l]. Дерево имеет смысл строить во
время выполнения программы. Добавляйте новые
родительские ветви к дереву с помощью методов Add и
AddObject. Добавляйте новые
ветви потомков с помощью методов AddChild и AddChildObject. Для замены существующей ветви
используйте методы Insert и InserObject. Метод Delete вычеркивает указанную ветвь.
Для ускорения выполнения перечисленных
действий заключите их между методами
BeginUpdate и
EndUpdate, что избавит от
избыточной перенумерации ветвей в процессе
создания дерева. Значение свойства
Selectedltem отражает номер
текущей выбранной ветви.
Узлы дерева могут сопровождаться
идентифицирующими картинками. Свойство OutlineStyle определяет
очертание дерева и тип узловых картинок, а их вид
конкретизируют свойства PictureLeaf,
PictureMinus, PicturePlus, PictureOpen и PictureClosed.
4.6.6.5 THeader
Отображает секционированный заголовок и
позволяет менять размеры его секций, манипулируя
кнопками мыши. Эта компонента поддерживает
совместимость с Windows 3.1; ее аналогом является
компонента THeaderControl из вкладки Win95.
Секции заголовка содержатся в свойстве Sections. Можно
изменять размер выбранной секции и
перетаскивать ее границы в новое положение,
удерживая нажатой кнопку мыши: на стадии
проектирования - правую кнопку, а во время
выполнения программы - левую. Размеры других
секций остаются без изменения.
Если свойство AllowResize разрешает изменение размера,
то в начале изменения происходит событие OnSizing, а по
окончании изменения - событие OnSized. Обработчики этих событий могут,
например, выровнять текст под заголовком в
соответствии с новой шириной секции.
4.6.6.6 TTabbedNotebook
Представляет ряд страниц блокнота, каждая из
которых содержит собственный набор элементов
управления. Нажимая на закладку, которая
выступает из верхней части страницы,
пользователь выбирает ее. Эта компонента
поддерживает совместимость с Windows 3.1; ее аналогом является
компонента TPageControl из вкладки Win95.
Доступные страницы блокнота с закладками
представляют собой символьные
последовательности, перечисленные как значения
свойства Pages.
Окно редактора блокнота (Рис. 4.20) открывается
кнопкой в
графе значений этого свойства. Вы можете
активизировать конкретную страницу одним из
следующих способов: выбрав ее из выпадающего
списка свойства ActivePage, a также перелистывая закладки с
помощью опций Next Page и Previous Page контекстного меню.

Рис. 4.20. Конструирование заготовки блокнота.
Если вы хотите переопределить значение
указателя Pagelndex для конкретной страницы, обратитесь к
методу GetIndexForPage. Свойство TabsPerRow определяет число закладок в
одном ряду. Если в блокноте имеется больше
страниц, чем закладок, умещающихся в ряду,
автоматически достраивается следующий ряд
закладок. Шрифт надписей на закладках задается
свойством TabFont.
4.6.6.7 TNotebook
Представляет ряд страниц блокнота.
Пользователь выбирает нужную страницу, щелкая по
ней мышью. Эта компонента обычно используется
совместно с компонентой TTabSet, чтобы нажатием на
соответствующие вкладки выбирать страницы.
Совместное использование компонент описано в
п.4.6.6.3.
Доступные страницы блокнота представляют
собой символьные последовательности,
перечисленные как значения свойства
Pages. Обратиться к
конкретной странице блокнота можно посредством
свойств Pagelndex
или ActivePage.
4.6.7 Диалоговые компоненты
Компоненты вкладки Dialogs палитры компонент

осуществляют включение в вашу программу 8
диалоговых элементов Windows, являющихся прямыми
производными от абстрактного класса
TCommonDialog.
4.6.7.1 TOpenDialog
Открывает в вашей программе доступ к диалогу
открытия файлов. Метод Execute активизирует окно диалога во
время выполнения программы.
После того, как пользователь выбрал файл
нужного типа и нажал кнопку ОК, имя файла
заносится в свойство FileName. С помощью свойства
Filter пользователь
определяет, какие файлы сделать видимыми в
списке файлов. Свойство Filterlndex определяет фильтр по
умолчанию.
Манипулируя свойством Options, вы можете изменить вид и
поведение компоненты, например, разрешить
выборку нескольких файлов одновременно; имена
этих файлов сохранятся в списке свойства Files. Если вы хотите,
чтобы расширения автоматически приписывались к
именам файлов, печатаемых в области
редактируемого ввода, используйте свойство DefaultExt.
4.6.7.2 TSaveDialog
Открывает в вашей программе доступ к диалогу
сохранения файлов. Метод Execute активизирует окно диалога во
время выполнения программы.
После того, как пользователь выбрал файл
нужного типа и нажал кнопку ОК, имя файла
заносится в свойство FileName. С помощью свойства
Filter пользователь
определяет, какие файлы сделать видимыми в
списке файлов. Свойство Filterlndex определяет фильтр по
умолчанию.
Манипулируя свойством Options, вы можете изменить вид и
поведение компоненты. например, разрешить
выборку нескольких файлов одновременно; имена
этих файлов сохранятся в списке свойства Files. Если вы хотите,
чтобы расширения автоматически приписывались к
именам файлов, печатаемых в области
редактируемого ввода, используйте свойство DefaultExt.
4.6.7.3 TFontDialog
Открывает в вашей программе доступ к диалогу
выбора шрифтов и их атрибутов. Execute активизирует окно диалога во
время выполнения программы.
После того, как пользователь выбрал нужный
шрифт и нажал кнопку ОК, выбранный шрифт
заносится в свойство Font. Свойство Device позволяет выбрать устройство,
на которое повлияет сделанное изменение шрифта.
Манипулируя свойством Options, вы можете изменить вид и
поведение компоненты, например, включить кнопку Help в окно
диалога или разрешить появление в списке только
шрифтовых файлов с расширением .ttf(True
Type Fonts).
4.6.7.4 TColorDialog
Открывает в вашей программе доступ к диалогу
выбора цветов. Метод Execute активизирует окно диалога во
время выполнения программы.
После того, как пользователь выбрал нужный цвет
и нажал кнопку ОК, диалог закрывается, и
выбранный цвет заносится в свойство
Color.
4.6.7.5 TPrintDialog
Открывает в вашей программе доступ к диалогу
печати. Метод Execute активизирует окно диалога во время
выполнения программы.
С помощью этого диалога можно выбрать принтер,
задать диапазон печатаемых страниц, число копий
с подбором (collate) страниц в копиях, а также - требование
печати в файл. Указанные параметры отражаются
значениями соответствующих свойств данной
компоненты.
При нажатии на кнопку Setup происходит вызов диалога
установок принтера (TPrinterSetupDialog). Манипулируя свойством Options, вы можете
изменить вид и поведение компоненты, например,
отменить появление опции печати в файл.
4.6.7.6 TPrinterSetupDialog
Открывает в вашей программе доступ к диалогу
предварительных установок принтера перед
печатью. Метод Execute активизирует окно диалога во
время выполнения программы.
4.6.7.7 TFindDialog
Открывает в вашей программе доступ к диалогу
поиска текста. Метод Execute активизирует окно диалога во
время выполнения программы.
Значением свойства FindText является искомый текст.
Манипулируя свойством Options, вы можете изменить вид и
поведение компоненты, например, отменить
появление встроенных компонент TCheckBox под названиями Match
Case, Whole Word и др.
Когда пользователь вводит искомый текст и
нажимает кнопку Find Next, обработчик возникающего
события OnFind производит поиск текста, являющегося
значением свойства FindText.
4.6.7.8 TReplaceDialog
Открывает в вашей программе доступ к диалогу
поиска текста с заменой. Метод Execute активизирует окно диалога во
время выполнения программы. Эта компонента
обладает всей функциональностью предыдущей,
кроме того, позволяя заменять найденный текст
новым.
4.6.7.9 Использование диалоговых компонент
текстовым редактором. Приемы отладки
C++Builder поставляется
вместе с примером текстового редактора файлов
формата RTF.
который демонстрирует работу диалоговых
компонент TOpenDialog, TSaveDialog, TFontDialog и TPrintDialog. Приложение также использует
ранее описанные компоненты TMainMenu,
TRichEdit, TPanel, TEdit, TSpeedButton. TComboBox, TUpDown, TLabel, TBevel и способно предоставлять
контекстно-зависимую помощь из файла
RICHEDIT.HLP.
=> По команде главного меню File |
Open Project откройте
диалог выбора проектов.
=> Войдите в каталог
\...\CBuilder\Examples\Apps\RichEdit.
=> Выберите проектный файл с именем
RichEdit и нажмите кнопку Open.

Рис. 4.21. Форма текстового редактора.
Рис. 4.21 показывает главную форму текстового
редактора с перечнем имен основных обработчиков
событий, коды которых, как правило, и составляют
содержание файлов программных модулей
приложений для C++Builder.
Компонента TRichEdit занимает всю свободную область формы
редактора, причем вложенные свойства
RichEditl->Paragraph содержат
атрибуты форматирования параграфов документа.
Объект FontName
представляет название шрифта, выбранное
пользователем из выпадающего списка
TComboBox. Для установки
размера шрифта служит объект FontSize области редактируемого ввода
TEdit, сопряженный с кнопками TUpDown. Под панелью
инструментов рас-
положена измерительная линейка с тремя
регуляторами форматирования (объекты типа TLabel): левого
отступа параграфа Leftind, ширины красной строки Firstind и правого
отступа параграфа Rightind (последний регулятор появится
после запуска программы). Внизу формы
расположена панель строки состояния
StatusBar, предназначенная
для вывода пояснений к командам меню.
Меню редактора включает типовые команды
управления, некоторым из которых поставлены в
соответствие быстрые кнопки на панели
инструментов.
File |
Edit |
Help |
New Open Save Save
As |
|
Undo |
|
Contents Search for
Help On How to Use Help |
Cut Copy Paste |
About |
Print |
Font |
|
Exit |
|
Вы можете отредактировать (например, с помощью
того же Microsoft Word) исходный справочный файл
RICHEDIT.RTF из каталога \...\CBuilder\Examples\Apps\RichEdit\Help, а затем собрать новую версию RICHEDIT.HLP с помощью утилиты
BUILDHLP.BAT. Наличие
действующей команды меню Help придает программе
профессиональный облик и облегчает работу
пользователя.
После того, как вы запустите редактор и
испытаете что он умеет, придет черед
разобраться в том как он это делает. Листинг
4.1 содержит полный текст файла кодового модуля Romain.cpp с
необходимыми комментариями. Несмотря на большой
размер, целесообразно привести текст целиком,
поскольку им вполне можно руководствоваться при
создании собственных стилизованных приложений
профессионального уровня с меню, быстрыми
кнопками, диалогами и контекстной помощью.
ttinclude <vcl.h> ttinclude <windows.hpp> ftpragma hdrstop
#include "Romain.h"
^include "RichAbt.h"
const float RulerAdj = 4.0/3.0; //
цена деления линейки
const int GutterWid = 6; //
ширина поля подшивки
//-----_-------________--________--________--_____-__--_____
#pragma resource "*.dfm" TMainForm *MainForm;
// Конструктор
главной формы приложения _fastcall
TMainForm::TMainForm(TComponent *0wner)
: TFormfOwner) { SetFileName((AnsiString)"Untitled") ;
)
// Установка текущих
атрибутов Форматирования текста void
_fastcall TMainForm::SelectionChange(TObject*) { char sizebuf[6];
try { FUpdating = true;
FirstInd->Left = // левая
граница красной строки int(RichEditl->Paragraph->FirstIndent*RulerAdj)-
4+GutterWid;
LeftInd->Left = // левый
отступ параграфа int((RichEditl->Paragraph->LeftIndent+
RichEditl->Paragraph->FirstIndent)*RulerAdj)-
4+GutterWid;
RightInd->Le?t = II правый
отступ параграфа •" Ruler->ClientWidth-6-
int((RichEditl->Paragraph->RightIndent+GutterWid)*
RulerAdj) ;
BoldButton->Down = //
состояние кнопки "жирный" RichEditl->SelAttributes->Style.Contains(fsBold)
;
ItalicButton->Down = //состояние
кнопки "курсив" RichEditl->SelAttributes->Style.Contains(fsltalic)
;
UnderlineButton->Down = //
состояние кнопки "подчерк." RichEditl->SelAttributes->Style.Contains(fsUnderline)
;
BulletsButton->Down = //
состояние кнопки "нумерация" bool(RichEditl->Paragraph->Numbering)
;
FontSize->Text = // размер
шрифта itoa(RichEditl->SelAttributes->Size, sizebuf,
10);
FontName->Text = // название
шрифта RichEditl->SelAttributes->Name;
// Состояние кнопок
выравнивания параграфа switch((int)RichEditl->Paragraph->Alignment)
{ case 0: LeftAlign->Down = true; break;
case 1: RightAlign->Down = true; break;
case 2: CenterAlign->Down = true; break;
} }
catch (...)
{ FUpdating = false; } //
ошибка (поймано исключение) FUpdating =
false;
}
// функция возвращает
установленные атрибуты текущего текста TTextAttributes *_fastcall TMainForm::CurrText(void) { return
RichEditl->SelAttributes;
}
// функция добавляет
указанный шрифт к списку имеющихся int
EnumFontsProc(TLogFontA &LogFont, TTextMetricA &, int,
Pointer Data) { ((TStrings *)Data)->Add((AnsiString)LogFont.IfFaceName);
return 1;
}
// функция выбирает
имена имеющихся шрифтов void _fastcall
TMainForm::GetFontNames(void) { HDC hDC = GetDC(O) ;
void * cTmp = (void *)FontName->Items;
EnumFonts(hDC, NULL, (FONTENUMPROC) EnumFontsProc, (long) cTmp ) ;
ReleaseDC(0,hDC) ;
FontName->Sorted = true;
}
// Включение имени
Файла в строку заголовка приложения void _fastcall TMainForm::SetFileName(const AnsiString
FileName) ( LPSTR IpBuf = new char[MAX_pATH];
sprintf(IpBuf, "%s-%s", ExtractFileName(FileName).c_str(),
Application->Title.c_str()) ;
Caption = (AnsiString)IpBuf;
FFileName = FileName;
delete IpBuf;
}
// Реакция в диалоге
"Сохранить изменения?" void
_fastcall TMainForm::CheckFileSave(void) { if (RichEditl->Modified) {
switch(M&ssageBox(Handle, "Save Changes?", "Confimation",
MB_YESNOCANCEL I MB_ICONQUESTION)) { case ID_YES : FileSaveClick(this) ;
case ID_CANCEL : Abort() ;
};
) }
// Запись рисок
измерительной линейки ширины параграфов void _fastcall TMainPorm::SetupRuler(void) { int iCtr = 1;
char sTmp[201] ;
while (iCtr < 200) (
sTmp[iCtr++] = 9; // табулятор sTmp[iCtr++] = 'I'; // риска } Ruler->Caption = (AnsiString)sTmp;
}
// Информирует Windows о текущем
размере окна редактирования void
_fastcall TMainForm::SetEditRect(void) ( TRect Ret = Rect(GutterWid, 0,
RichEditl->ClientWidth-GutterWid, ClientHeight) ;
SendMessage(RichEditl->Handle, EM_SETRECT, 0, long(&Rct));
}
// Инициализирует
компонентные объекты формы приложения void _fastcall TMainForm::FormCreate(TObject* /*Sender*/) {
Application->OnHint = &ShowHint;
OpenDialog->InitialDir = ExtractFilePath(ParamStr(0)) ;
SaveDialog->InitialDir = OpenDialog->InitialDir;
GetFontNames() ;
SetupRuler() ;
SelectionChange(this); // атрибуты
форматирования
}
// Выдает пояснения к
командам меню в строку состояния void_fastcall
TMainForm::ShowHint(TObject* /*Sender*/) { StatusBar->SimpleText =
Application->Hint;
}
// Создание пустого
безымянного Файла по команде File I New void_fastcall
TMainForm::FileNewClick(TObject* /*Sender*/) { CheckFileSavef); // сохранить изменения? SetFileName((AnsiString)"Untitled") ;
RichEditl->Lines->Clear() ;
RichEditl->Modified = false;
}
// Загрузка
выбранного Файла командой File I Open или кнопкой void
_fastcall TMainForm::FileOpenClick(TObject*) { CheckFileSave(); // сохранить изменения? if (OpenDialog->Execute()) {
RichEditl->Lines->LoadFromFile(OpenDialog->FileName) ;
SetFileName(OpenDialog->FileName) ;
RichEditl->SetFocus() ;
RichEditl->Modified = false;
RichEditl->ReadOnly =
OpenDialog->Options.Contains(ofReadOnly) ;
} }
// Запись Файла
командой File I Save или кнопкой void?*_fastcall
TMainForm::FileSaveClick(TObject* Sender) { if (!strcmp(FFileName.c_str(),
"Untitled"))
FileSaveAsClick(Sender); // нет
имени else
{ RichEditl->Lines->SaveToFile(FFileName); // то же имя RichEditl->Modified = false;
} )
// Запись Файла под
выбранным именем командой FilelSaveAs void
_fastcall TMainForm::FileSaveAsClick(TObject*) { if (SaveDialog->Execute()) {
RichEditl->Lines->SaveToFile(SaveDialog->FileName) ;
SetFileName(SaveDialog->FileName) ;
RichEditl->Modified = false;
} }
// Диалог печати Файла
по команде File I Print или кнопкой void
_fastcall TMainForm::FilePrintClick(TObject*) { if (PrintDialog->Execute())
RichEditl->Print( FFileName );
}
// Выход из программы
по команде File I Exit void _fastcall
TMainForm::FileExitClick(TObject*) { Close() ;
}
// Отмена
редактирования командой Edit I Undo или кнопкой void
_fastcall TMainForm::EditUndoClick(TObject*) ( if (RichEditl->HandleAllocated())
SendMessage(RichEditl->Handle, EM_UNDO, 0, 0) ;
}
// Вырезка выбранного
текста командой Edit I Cut или кнопкой void
_fastcall TMainForm::EditCutClick(TObject*) { RichEditl->CutToClipboard();
}
// Копирование текста
командой Edit I Copy или кнопкой void
_fastcall TMainForm::EditCopyClick(TObject*) { RichEditl->CopyToClipboard();
}
// Вставка текста
командой Edit I Paste или кнопкой void
_fastcall TMainForm::EditPasteClick(TObject*) { RichEditl->PasteFromClipboard() ;
}
// Вывод указателя
Файла помощи по команде Help I Contents void
_fastcall TMainForm::HelpContentsClick(TObject*) {
Application->HelpCommand(HELP_CONTENTS, 0) ;
}
// Поиск заданной
справки по команде Help I Search...
void _fastcall TMainForm::HelpSearchClick(TObject*)
{ Application->HelpCommand(HELP_PARTIALKEY, (long) "");
)
// Вывод оглавления
Файла помощи по команде Help I Нои to... void _fastcall
TMainForm::HelpHowToClick(TObject*) { Application->HelpCommand(HELP_HELPONHELP, 0) ;
}
// Диалог с логотипом
редактора по команде Help I About
void_fastcall TMainForm::HelpAboutClick(TObject*)
{ Porm2 = new TPorm2(Application); // создать объект формы
Form2->ShowModal(); //
активировать диалог
delete Porm2; // уничтожить
объект }
// Диалог выбора
шрифта и его атрибутов по команде
Edit I font void _fastcall TMainPorm::SelectFont(TObject*) {
FontDialogl->Font->Assign(RichEditl->SelAttributes);
if (FontDialogl->Execute())
CurrText()->Assign(FontDialogl->Font) ;
RichEditl->SetFocus() ;
}
// Адаптация длины
линейки к текущему окну редактирования void _fastcall TMainForm::RulerResize(TObject*) { RulerLine->Width =
(int)Ruler->ClientWidth-(RulerLine->Left*2) ;
}
// Реакция на
изменение пользователем размеров формы
void _fastcall TMainForm::FormResize(TObject* Sender)
{ SetEditRect(); // послать
сообщение Windows
SelectionChange(Sender); //
атрибуты форматирования
)
// Перерисовка формы
void _fastcall TMainForm::FormPaint(TObject* Sender) { SetEditRect(); // послать сообщение
Windows
}
// Реакция на нажатие
кнопки "Стиль шрифта жирный" void
_fastcall TMainForm::BoldButtonClick(TObject*) { if (iFUpdating)
{ if (BoldButton->Down) //
изменить данный стиль CurrText()->Style =
CurrText()->Style “ fsBold;
else // сбросить данный
стиль CurrText()->Style = CurrText()->Style ” fsBold;
} }
// Реакция на нажатие
кнопки "Стиль шрифта курсив" void
_fastcall TMainForm::ItalicButtonClick(TObject*) { if (iFUpdating)
{ if (ItalicButton->Down) //
изменить данный стиль CurrText()->Style =
CurrText()->Style “ fsltalic;
else // сбросить данный
стиль CurrText()->Style = CurrText()->Style ” fsltalic;
} }
// Реакция на нажатие
кнопки "Стиль шрифта подчеркнутый" void _fastcall TMainForm::UnderlineButtonClick(TObject*) { if (iFUpdating)
{ if (UnderlineButton->Down) //
изменить данный стиль
CurrText()->Style = CurrText()->Style “ fsUnderline;
else // сбросить данный
стиль CurrText()->Style = CurrText()->Style ”
fsUnderline;
) }
// Изменение размера
шрифта в допустимом интервале значений void _fastcall TMainForm::FontSizeChange(TObject*) {
int fontsize = atoi(FontSize->Text.c_str());
if ((iFUpdating) && (fontsize)) { if (fontsize < 1)
{ ShowMessage("Number must be between 1 and 1638.");
FontSize->Text =1; } else if (fontsize > 1638)
{ ShowMessage("Number must be between 1 and 1638");
FontSize->Text = 1638; } CurrText()->Size =
atoi(FontSize->Text.c_str()) ;
} }
// Реакция на нажатие
одной из кнопок выравнивания текста void _fastcall TMainForm::AlignClick(TObject* Sender) { if (IFUpdating)
{ TControl *oAliBtn = (TControl*)(Sender);
RichEditl->Paragraph->Alignment = (TAlignment)oAliBtn->Tag;
} }
// Реакция на выбор
нового названия шрифта из списка void
_fastcall TMainForm::FontNameChange(TObject*) { if (iFUpdating)
{ CurrText()->Name =
FontName->Items->Strings[FontName->ItemIndex] ;
} }
// Реакция на нажатие
кнопки "Нумерованный список" void
_fastcall TMainForm::BulletsButtonClick(TObject*) { if (iFUpdating)
RichEditl->Paragraph->Numbering =
(TNumberingStyle)BulletsButton->Down;
}
// Типовая проверка
возможности выхода из приложения void
_fastcall TMainForm::FormCloseQuery(TObject*, bool & CanClose)
{ try
{ CheckFileSaveO; } // сохранить
изменения? catch (...)
{ CanClose = false; } //
ошибка (поймано исключение) }
// Определение
позиции регулятора линейки, выбранного мышью void_fastcall TMainForm::RulerItemMouseDown(TObject* Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) { TLabel *
oTmpLabel = (TLabel *)Sender;
FDragOfs = oTmpLabel->Width / 2;
oTmpLabel->Left = oTmpLabel->Left+X-FDragOfs;
FDragging = true;
}
// Перемещение мышью
выбранного регулятора линейки void
_fastcall TMainForm:':RulerItemMouseMove(TObject* Sender,
TShiftState Shift, int X, int /*Y*/) ( if (FDragging)
{ TLabel * oTmpLabel = (TLabel *)Sender;
oTmpLabel->Left = oTmpLabel->Left+X-FDragOfs;
) }
// Определение
позиции регулятора ширины красной строки void_fastcall TMainForm::FirstIndMouseUp(TObject* Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) { FDragging = false;
RichEditl->Paragraph->FirstIndent =
int((FirstInd->Left+FDragOfs-GutterWid) / RulerAdj);
LeftIndMouseUp(Sender, Button, Shift, X, Y) ;
}
// Определение
позиции регулятора левого отступа параграфа void _fastcall TMainForm::LeftIndMouseUp(TObject* Sender,
TMouseButton, TShiftState, int, int) { FDragging = false;
RichEditl->Paragraph->LeftIndent =
int((LeftInd->Left+FDragOfs-GutterWid) /
RulerAdj)-RichEditl->Paragraph->FirstIndent;
SelectionChange(Sender); //
атрибуты форматирования
}
// Определение
позиции регулятора правого отступа параграфа
void_fastcall TMainForm::RightIndMouseUp(TObject* Sender,
TMouseButton, TShiftState, int, int) { FDragging = false;
RichEditl->Paragraph->RightIndent =
int((Ruler->ClientWidth-Rightlnd->Left+FDragOfs-2) / RulerAdj)-2*GutterWid;
SelectionChange(Sender); //
атрибуты форматирования }
// Активизация Файла
помощи на Форме void _fastcall
TMainForm::FormActivate(TObject* /*Sender*/) { Application->HelpFile =
"RICHEDIT.HLP";
RichEditl->SetFocus() ;
Листинг 4.1. Кодовый файл Romain.cpp модуля редактора.
Рис. 4.22 демонстрирует работу со встроенным
отладчиком на примере приложения редактора.
Предположим, вы хотите узнать, правильно ли
занеслось имя открытого файла в переменную FFileName. В процессе
отладки вы будете пользоваться опциями
контекстного меню Редактора кода,
активизируемого нажатием правой кнопки мыши:
=> Найдите инструкцию, за работой которой вы
хотите проследить, и нажмите клавишу
F5 (или щелкните мышью
слева от выбранной инструкции). Красный цвет
отмечает строку останова программы. Повторное
нажатие клавиши или повторный щелчок мышью
снимет точку останова. => Командами меню Run [ Run (клавиша F9), Run | Run to Cursor (клавиша
F4) или одноименной
опцией запустите приложение.
=> Если программа дошла до точки останова (а
это должно случиться при работе отлаженных
приложений), строка окрасится синим цветом, а
перед ней появится символ " ^ ".
; => Командой Run | Step Over (клавиша F8) выполните выбранную инструк-;
цию в пошаговом режиме.
=> Двойным щелчком мышью выберите переменную
FFileName в тексте ин-|§ струкции и опцией
Inspect (клавиши Alt+F5)
проинспектируйте начальное ti4' значение -
"Untitled".

Рис. 4.22. Некоторые приемы отладки.
=> Продолжите отладку (клавиша F9) и откройте любой файл в диалоге
команды File | Open меню редактора.
=> Снова выполните выбранную инструкцию в
пошаговом режиме. => Проинспектируйте новое
значение выбранной переменной - она должна
содержать имя открытого файла и полный путь к
нему. => Продолжите работу в режиме отладки или
завершите ее командой
Run | Program Reset.
4.6.8 Системные компоненты
Компоненты вкладки System палитры компонент

осуществляют включение в вашу программу 12
специализированных системных элементов
управления.
4.6.8.1 TTimer
Эта компонента инкапсулирует таймерные
функции Windows API: SetTimer и KillTimer и сама обрабатывает сообщения WM_TIMER.
Свойство Interval задает частоту возникновения события OnTimer. По
умолчанию Interval=1000 (одна секунда). Временной интервал
передается функции SetTimer в качестве параметра.
Для каждого таймера вашей программы заведите
отдельную компоненту.
4.6.8.2 TPaintBox
Предоставляет вашей программе возможность
рисования на форме только внутри заданной
прямоугольной области, предотвращая выход за
границы поля рисования.
Если компонента TPaintBox перенесена на форму, ваша
программа может рисовать на поверхности поля
рисования (канве) с помощью обработчика события OnPciinl. Цвет и
шрифт, используемые при инициализации объектов
канвы (TCanvas),
определяются свойствами Color и Font. Если вы хотите рисовать на всей
форме, воспользуйтесь обработчиком события OnPaint самой
формы.
Чтобы сохранить относительное положение поля
рисования неизменным, даже если пользователь
изменит размеры формы, установите значение true свойства Align.
4.6.8.3 TFileListBox
Отображает список файлов в текущем каталоге,
доступных программе во время ее работы. Смена
текущего каталога отражается значением свойства Directory.
Свойство Mask
задает типы, а свойство FileType - атрибуты файлов, которые
появятся в списке файлов. Имя и расширение
выбранного файла можно будет вводить в область
редактируемого ввода, если свойство
FileEdit указывает на
соответствующий объект класса TEdit. Чтобы снабдить имена файлов
пиктограммами. установите значение
true свойства
ShowGlyphs.
TFileListBox является
производной от класса TCustomListBox, причем ее функционирование
определяется, в основном, компонентой
TListBox.
4.6.8.4 TDirectoryListBox
Отображает древовидную структуру каталогов
текущего диска, доступных программе во время ее
работы. Смена текущего каталога отражается
значением свойства Directory, а смена текущего дисковода -
значением свойства Drive.
TDirectoryListBox является
производной от класса TCustomListBox, причем ее функционирование
определяется, в основном, компонентой
TListBox.
4.6.8.5 TDriveComboBox
Отображает комбинированный редактируемый
список дисков, доступных программе во время ее
работы. Смена текущего дисковода отражается
значением свойства Drive.
Синхронизировать работу трех компонент
TDriveComboBox, TDirectoryListBox и TFileListBox можно обработчиками событий OnChange первой и
второй компоненты:
TForml->DriveComboBoxl->Change(Sender: TObject);
TForml->DirectoryListBoxl->Change(Sender: TObject);
Теперь, когда пользователь меняет дисковод в
списке дисков, содержимое списков каталогов и
файлов также обновится. Другой способ решения
проблемы синхронизации связан с установкой
значения DirectoryListBoxl свойства DirList в списке дисков, а также
значения TFileListBox 1 свойства FileList в списке файлов".
4.6.8.6 TFilterComboBox
Представляет комбинированный редактируемый
список фильтров для выбора имен файлов с
расширениями.
Свойство Filter задает фильтры, которые появятся в списке
фильтров, а свойство Mask - конкретный фильтр, выбранный
пользователем в поле редактируемого ввода.
Обычно, список фильтров сопровождается списком
файлов. Синхронизировать работу этих компонент
можно обработчиком события OnChange первой компоненты:
TForml->FilterComboBoxl->Change(Sender: TObject) ;
Теперь, когда пользователь меняет фильтр,
содержимое списка файлов обновится
соответственно. Другой способ решения той же
проблемы связан с установкой значения FileListBoxl свойства FileList списка
фильтров.
4.6.8.7 TMediaPlayer
Элемент управления устройствами мультимедиа,
которые поддерживаются MCI-драйверами
(Media Control Interface)
операционной системы Windows. Данная компонента отображает
стандартную панель (Рис. 4.23) с кнопками (Play, Stop, Eject и
др.), позволяющими управлять такими устройствами
как звуковая плата, компакт диск, видеокамера, AVI плеер, MIDI секвенсор.

Рис. 4.23. Петель управления устройствами
мультимедиа.
Конкретное устройство задается свойством DeviceType (например, dtWaveAudio или dtVideodisc). Значение dtAutoSelect свойства DeviceType вызовет
попытку автоматически выбрать тип устройства, а
значение true
свойства AutoOpen - открыть его вызовом метода Open. Если устройство сохраняет свои
данные в файле, задайте имя этого файла в
свойстве FileName.
4.6.8.8 TOleContainer
Организует связь с OLE объектами (Object Linking
and Embedding) или
непосредственно включает их в вашу программу.
Механизм OLE,
являющийся расширением операционных систем Windows, реализует
передачу данных от программы-сервера к другой
программе-контейнеру. Например, ячейки
электронной таблицы можно переносить в документ
текстового процессора. Передача данных
осуществляется через динамически отводимую
память. В отличие от механизма обмена данными
через доску объявлений (Clipboard), контейнеру OLE не требуются знания формата
принимаемых данных. Любой сервер может выдавать
свои данные любому контейнеру, который принимает
их, без какой бы то ни было интерпретации формата.
Чтобы дать возможность пользователю создать OLE объект в режиме
диалога, достаточно обратиться к методу InsertObjectDialog. Методы CreateObject и CreateObjectFromFile
отвечают за создание включенного объекта, а
метод CreateLinkToFile - за создание связанного с файлом объекта.
TOleContainer автоматически
обслуживает процесс слияния меню, т.е.
объединения контейнера элемента меню вашей
формы с объектом замещения, который
активизируется OLE сервером.
4.6.8.9 TDdeClientConv
Устанавливает режим динамического обмена
данными (Dynamic Data Exchange) для программы DDE клиента. Используйте эту
компоненту совместно с TDdeClientIlem, чтобы сделать ваше приложение DDE клиентом.
Механизм DDE,
являющийся расширением операционных систем Windows, реализует
асинхронный обмен элементами данных между
программой сервера (которая должна быть запущена
первой) и программой клиента. Элементом обмена
может быть любая выбранная порция текста,
например, ячейка таблицы базы данных. Клиент
инициирует соединение с сервером и выдает
запросы на обмены элементами данных между двумя
участниками "разговора".
Для соединения с сервером и превращения вашего
приложения в DDE клиента на этапе проектирования, установите
имя программы сервера в свойстве
DdeService, а тему разговора
(имя формы или имя текстового файла) - в свойстве DdeTopic. В окне
диалога установок режима DDE Info нажмите кнопку Paste
Link.
Во время работы программы эти действия
реализует метод Setlink. Чтобы послать текстовую строку
связанному элементу сервера, воспользуйтесь
методом PokeData,
а для посылки макрокоманды на исполнения
сервером обратитесь к методу ExecuteMacro.
Если значением свойства ConnectMode задан автоматический режим
разговора ddeAutomatic, клиент попытается установить связь при
создании компоненты в момент исполнения
программы. Если значением свойства
ConnectMode задан режим
разговора ddeManual, то для установки связи вы должны написать
обработчик события ОпОреп, который вызывает
метод OpenLink.
4.6.8.10 TDdeClientltem
Определяет элемент динамического обмена
данными DDE
клиента. Укажите имя объекта компоненты TDdeClientConv в свойстве DdeConv, a элемент
обмена - в свойстве Ddeltem. Если компонента TDdeClientConv
установила связь с DDE сервером, он будет
автоматически и последовательно обновлять
данные клиента, пока разговор не завершится.
Каждый раз, когда сервер производит обновление
данных клиента, новая текстовая строка
автоматически заносится в свойство
Text, и возникает событие OnChange. При
обмене строками длиннее 255 символов они будут
передаваться через список свойства
Lines, причем первая строка
Lines
переносится в Text.
4.6.8.11 TDdeServerConv
Устанавливает режим динамического обмена
данными для программы DDE сервера. Используйте эту
компоненту совместно с TDdeServerItem, чтобы сделать ваше приложение DDE сервером. Тема
разговора является значением свойства Name.
Если клиент посылает макрокоманды серверу, вы
должны написать обработчик события OnExecuteMacro, которое возникает при приеме
запроса на ее исполнение.
Использование компоненты TDdeServerConv не
обязательно: если вы не поместили ее на форме,
клиент будет по-прежнему посылать запросы на
обновление своих данных непосредственно из
компоненты TDdeServerItem. В этом случае темой
разговора является имя формы, на которой
находится компонента TDdeServerItem.
4.6.8.12 TDdeServerltem
Определяет элемент динамического обмена
данными DDE
сервера. При использовании этой компоненты
вместе с TDdeServerConv имя сервера указывается значением свойства ServerConv.
Каждый раз. когда клиент посылает запрос на
обновление своих данных. сервер посылает ему
содержимое свойства Text, и возникает событие OnCliange. При
обмене строками длиннее 255 символов они будут
передаваться через список свойства
Lines, причем первая строка Lines переносится в Text.
Чтобы протестировать связь с DDE клиентом, воспользуйтесь
методом CopyToClipboard, который будет копировать содержимое
свойства Text (или Lines) и информацию о
связи на доску объявлений. При активизации
клиента вы сможете забрать DDE данные с доски объявлений в
программу клиента.
4.6.9 Компоненты отчетов
Вкладка QReport палитры компонент

содержит 11 компонент для создания и
манипуляций с предварительно определенными
отчетами.
Эти компоненты позволяют визуально
конструировать стилизованные отчеты по данным,
поставляемым любым источником, включая таблицы и
запросы компонент доступа к базам данных TTable и
TQuery. Отчеты могут
содержать поля заголовков, колонтитулов, сносок
и итогов. QReport
предоставляет мощные средства отображения
отчетов в разных видах, автоматического
подведения итогов и подсчета полей - на любом
уровне группировки данных отчета.
4.6.9.1 TQuickReport
Представляет и распечатывает данные в виде
стилизованных отчетов QuickReport. Это основная компонента
используется совместно с TDataSource и одной или несколькими TQRBand. Дважды
щелкнув мышью по компоненте или выбрав опцию Preview Report из
контекстного меню, вы откроете окно просмотра
отчета. Укажите источник данных в свойстве DataSource. Чтобы
заполнить окно просмотра отчета или напечатать
его, обратитесь к методам Preview или Print.
4.6.9.2 TQRBand
Каждый образец этой компоненты отвечает за
представление и печать своего поля (полосы)
отчета. Свойство BandType содержит выпадающий список
вариантов полос отчета (заголовки, колонтитулы,
сноски, вложенные поля деталировок, итоги и т.д.), из
которого вы выбираете ту полосу, которую будет
обсуживать данная компонента. Распечатка одних
полос отчета будет происходить автоматически, а
распечатка других потребует связи с
компонентами TQRGroup или TQRDetailLink.
4.6.9.3 TQRGroup
Поддерживает работу с групповой полосой
отчета.
4.6.9.4 TQRDetailLink
Поддерживает работу с перекрестными ссылками
на вложенные полосы деталировки, осуществляя
связь по принципу master-detail.
4.6.9.5 TQRLabel
Отображает текст в виде заголовков столбцов
отчета. Вы можете менять статический текст
заголовка в свойстве Caption в любой момент во время
подготовки отчета. Если вам требуется выводить
текст поля записи некоторого набора базы данных,
следует воспользоваться компонентой QRDBText.
4.6.9.6 TQRMeino
Отображает, по аналогии с компонентой TDBMemo, многострочный
текст поля текущей записи в наборе данных
источника.
4.6.9.7 MTQRDBText
Отображает, по аналогии с компонентой TDBText, однострочный
текст поля текущей записи в наборе данных
источника.
4.6.9.8 TQRDBCalc
Автоматизирует процесс суммирования и
подсчета полей в наборе данных источника.
4.6.9.9 TQRSysData
Включает в отчет системную информацию
определенного вида, выбираемого из выпадающего
списка свойства Data.
4.6.9.10TQRShape
Отображает в отчете прямые линии, рамки и
простые геометрические фигуры (прямоугольник,
эллипс), выбираемые из выпадающего списка
свойства Shape.
4.6.9.11 TQRPreview
Облегчает процесс создания различных видов
просмотра отчета, включая операции прокрутки и
масштабирования. Несколько компонентных методов
позволяют управлять поведением отчета во время
просмотра. Например, вызов метода
ZoomToFit в обработчике
события OnClick по нажатию некоторой кнопки будет
масштабировать страницу в установленное поле
просмотра.
4.6.9.12 Пример использования компонент отчетов
C++Builder поставляется
вместе с примером, который демонстрирует
следующие разновидности работы с компонентами
отчетов:
• создание этикеток для почтовых отправлений;
• создание простого отчета;
• модификация оригинальных предварительных
видов печати;
• разработка отчетов по принципу
master-detail;
• сохранение выборочных текстовых файлов
детализации.

Рис. 4.24. Форма приложения для работы с отчетами.
Удостоверьтесь предварительно, что локальный псевдоним (alias)
демонстрационной базы данных BCDEMOS установлен с помощью утилиты
конфигурации
BDE Configutation. Чтобы
вызвать проект приложения, выполните следующие
действия:
=? По команде главного меню File | Open
Project откройте диалог
выбора проектов.
=> Войдите в каталог \..
.\CBuilder\Examples\Dbtasks\Quickrpt.
=> Выберите проектный файл с именем
Qrdemo и нажмите кнопку Open. Рис. 4.24
показывает форму демонстрационного приложения Quick Report.
=> Командой главного меню Run | Run запустите процесс компиляции и
сборки приложения.
=> После вызова программы поэкспериментируйте
с разными опциями.
4.6.10 Компонента ActiveX
Входящие в варианты поставки C++Builder
Professional и
C++Builder Client/Server Suite
компоненты обеспечивают поддержку
промышленного стандарта ActiveX/OCX. Созданные вами или третьими
лицами компоненты Delphi ActiveX можно интегрировать в среду
так, чтобы они вошли в Палитру компонент для
немедленного использования. В частности, вы
можете расширить стандартный вариант Палитры
новыми компонентами ActiveX, включив пакет NetManage для обучения и разработки
приложений в сети Internet. В конце главы 6 вы найдете
подробную инструкцию того, как это делается. В
типовом варианте поставки C++Builder Standard вкладка ActiveX палитры компонент

содержит единственную компоненту
ChartFX для построения на
вашей форме разнообразных диаграмм, графиков,
таблиц и проверки правописания на многих языках.
4.6.10.1 ChartFX
Дважды щелкнув мышью по компоненте или выбрав
опцию Properties из ее контекстного меню. вы откроете
диалоговое окно установок вида и множества
других характеристик диаграммы. Свойства, методы
и события компоненты ChartFX обеспечивают выполнение
следующих основных операций над диаграммами:
• Создание простых диаграмм.
• Передача исходных данных в новую диаграмму.
• Редактирование данных в существующей
диаграмме.
• Изменение легенд, заголовков и других
визуальных атрибутов диаграммы (видов, цветов,
орнаментов заливки, шрифтов, координатных сеток
и т.д.).
• Создание инструментов и других визуальных
элементов управления диаграммой.
Подробное руководство по использованию
компоненты ChartFX можно вызвать из справочной службы при
нажатии клавиши CtrI+Fl.
4.7 Дизайнер меню
Дизайнер меню (Menu Designer) облегчает процесс создания
меню для вашей формы. Вы можете легко добавлять,
вычеркивать и переупорядочивать команды меню
непосредственно в окне дизайнера.
Чтобы начать процесс создания меню: __
1. Поместите значок компоненты MainMenu или PopUpMenu из вкладки стандартных
компонент на вашу форму.
2. Откройте окно дизайнера меню. Оставив значок
компоненты выбранным, дважды щелкните на нем
левой кнопкой мыши или выберите опцию
Menu Designer из
контекстного меню компоненты. (Открыть
контекстное меню дизайнера можно щелчком правой
кнопкой мыши в любом месте его окна или нажатием
клавиш Alt+FlO).
3. Введите имя меню и нажмите клавишу
Enter, если желаете
изменить имя, установленное по умолчанию (MainMenul).
Чтобы добавить команды в меню:
1. Выберите позицию, в которую вы хотите
поместить новую команду.
2. Введите название команды (или символ "-",
если вы хотите добавить разделительную черту в
выпадающий список команд) и нажмите клавишу Enter. Указанному
названию (Caption) C++Builder автоматически поставит в
соответствие некоторый идентификатор (Name) и занесет в
Инспектор объектов. Так команде меню
File ставится в
соответствие идентификатор Filel, а русскоязычному названию Файл
- порядковый номер идентификатора с префиксом N.
Если названию предшествует символ "&", то
обращение к соответствующей команде меню можно
выполнять совместным нажатием клавиш Alt+первая
(подчеркнутая) буква названия. Можно задать любую
комбинацию "горячих" клавиш или выбрать ее
из списка ShortCut Инспектора объектов.
3. Нажмите клавишу Enter, чтобы перейти к добавлению
следующей команды выпадающего списка или
клавишу Esc, чтобы вернуться в главное меню. С помощью
левой кнопки мыши или клавиш позиционирования
<-, ->, Г, ^ можно перемещаться по списку и
переходить в главное меню. Повторное нажатие
клавиши Enter завершает процесс.
Чтобы вставить поле для новой команды в меню:
1. Выберите элемент меню, рядом с которым вы
собираетесь сделать вставку.
2. Нажмите клавишу Ins или выберите опцию
Insert из контекстного
меню. Поле новой команды вставляется над
выбранным элементом в выпадающем списке или
слева от выбранного элемента в главном меню.
Чтобы удалить команду из меню:
1. Выберите команду, которую вы собираетесь
удалить.
2. Нажмите клавишу Del или выберите опцию
Delete из контекстного
меню.
Чтобы создать поле для вложенного подменю:
1. Выберите элемент, для которого вы хотите
создать подменю.
2. Нажмите клавиши Ctrl+-> или выберите опцию
SubMenu из контекстного
меню.
Чтобы переместить элемент:
1. Выберите элемент меню и, удерживая левую
кнопку мыши, перенесите его на новое место. Вид
курсора поможет вам выбрать разрешенную позицию.
2. Отпустите кнопку мыши.
Вы можете конструировать меню, включая в него
те элементы, которые вам требуются, или начать
конструирование с шаблонов, содержащих часто
употребляемые команды.
Чтобы добавить шаблон к вашему меню:
1. Выберите опцию Insert From Template из контекстного меню.
2. Выберите нужный шаблон из предложенного
списка и нажмите кнопку ОК или клавишу Enter. Элементы
шаблона образуют подменю элемента, на который
указывал курсор в выпадающем списке команд, или
создадут новый элемент в главном меню.
Чтобы сохранить ваше меню в виде шаблона:
1. Выберите опцию Save As Template из контекстного меню.
2. Введите имя шаблона и нажмите кнопку ОК или
клавишу Enter.
Чтобы удалить шаблон:
1. Выберите опцию Delete Templates из контекстного меню.
2. Выберите нужный шаблон из списка и нажмите
кнопку ОК или клавишу Enter. Внимание: Данный шаблон
будет удален не только из списка, но и из файла
шаблонов BCB.DMT
на жестком диске.
В процессе работы программы можно динамически
добавлять в меню новые исполняемые или
информационные команды. Операции с
множественными меню позволяют динамически
менять порядок расположения элементов активного
(главного) меню, вводя или замещая альтернативные
элементы.
Чтобы организовать слияние меню во время
выполнения:
1. Выберите меню, которое вы хотите
активизировать из выпадающего списка свойства Menu вашей формы.
Операции слияния применимы только к активному
меню. Если форма содержит несколько компонент
меню, вы можете переключать активное меню во
время выполнения программы, устанавливая новые
значения свойства Menu, например: Forml->Menu = ВтороеМеню;
2. Определите порядок, в котором команды меню из
разных форм будут выстраиваться
на разделяемой панели главного меню: чем меньше
номер свойства Grouplndex, тем
левее располагается соответствующая команда.
Пусть главное (активное) меню содержит только две
команды: "Файл" (Grouplndex=0) и "Справка" (5). Тогда между
ними разрешается вставить до четырех команд из
меню другой формы-потомка с номерами 1,2,3, и 4,
например, "Редактор" (1) и "Формат" (3).
Далее можно заместить команду "Формат" (3) на
команду "Работа" (3) из меню другой
формы-потомка.
Рис. 4.25 иллюстрирует процесс проектирования
меню на форме прототипа тестового приложения,
предназначенного для обработки файлов. Открыв
контекстное меню дизайнера, обратите внимание на
опцию Insert From Resource. Судя по названию, она должна
давать возможность создавать меню на базе
ресурсных файлов с расширением .гс. К сожалению,
автору не удалось заставить дизайнер
использовать ресурсы приложений, ранее
написанных на Borland C++ версии 4.5. Будем надеяться, что в широко
рекламируемой версии 5.02 эта недоработка будет
исправлена.
 |
Имя меню |
Главное меню |
Выпадающий список команд |
Контекстное меню дизайнера |
|
Рис. 4.25. Проектирование меню с помощью
дизсшчера.
Сконструированное вами меню всегда
отображается на вашей форме в том виде, в котором
оно появится при запуске программы, поэтому нет
необходимости компилировать и запускать
программу, чтобы увидеть результат
проектирования. Вы можете продолжить
редактирование меню в окне Инспектора объектов,
активизировав его щелчком левой кнопки мыши.
4.8 Итоги
Мы научились пользоваться основными
инструментами интегрированной среды визуальной
разработки C++Builder, уделив основное внимание назначению
элементов Палитры компонент - "кирпичей",
составляющих основу вашего приложения. |