main.gif (47332 bytes)

InterReklama
InterReklama Advertising

РЕКЛАМА

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

RLE Banner Network

TBN 100x100
TBN.ru
Эта глава содержит описание основных инструментов визуальной разработки программных приложений. Именно благодаря этим средствам, в сочетании с мощностью новейшего компилятора с языка 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, уделив основное внимание назначению элементов Палитры компонент - "кирпичей", составляющих основу вашего приложения.

back.gif (1087 bytes)ind.gif (1892 bytes)next.gif (1100 bytes)
Hosted by uCoz