Компонент Быстрая кнопка (TSpeedButton)
Используется при формировании
панелей управления с «быстрыми» командными кнопками.
После размещения объекта на форме
изображение, помещаемое на кнопку, задается в свойстве Glyph (Значок). При этом
вызывается редактор, с помощью которого выбирается нужная картинка (в формате
.BMP). Большой набор готовых картинок для кнопок можно найти в каталоге Borland
Shared (подкаталог Images/Buttons),который автоматически создается вместе с
основным программным каталогом системы Delphi 7 (рис.
4.2).
Как правило, «быстрые» командные
кнопки используются группами. Чтобы объединить несколько таких кнопок, надо
задать ненулевое значение для свойства Grouplndex. Кнопки с одинаковым
значением этого свойства считаются принадлежащими к одной группе.
Если в группе нажимается одна
командная кнопка, кнопка, которая уже была нажата,как правило, автоматически
отпускается. Для поддержки подобного режима работы надо для всех кнопок группы
установить значение True для свойства AllowAUUp.
Перевести кнопку в нажатое
состояние на этапе проектирования можно с помощью свойства Down, присвоив ему
значение True.
Картинка для быстрой командной
кнопки задается в свойстве Glyph. Верхний левый бит изображения считается
цветом, который будет «прозрачным». Все точки изображения, имеющие такой цвет,
на кнопке не отрисовываются. Так же устроена работа компонента TBitBtn, однако
командная кнопка позволяет дополнительно указать, надо ли делать картинку
прозрачной (свойство Transparent имеет значение True) или нет.
Свойство Flat принимает значение
True, когда требуется сформировать «плоский» вид кнопки. В этом случае ее
границы не видны и появляются только при наведении указателя.
Чтобы более гибко обрабатывать
действия пользователя, в классе TSpeedButton имеется свойство MouselnControl,
которое принимает значение True, когда указатель мыши расположен над кнопкой.
Компонент Кнопка с картинкой (TBitBtn)
Этот компонент предназначен для
создания кнопки с картинкой. В системе имеется набор готовых шаблонов.
Картинка загружается в объект тем
же способом, что и в случае компонента TSpeedButton. Каждая такая картинка
может состоять из 1-4 частей, равных по ширине. Первая часть — изображение
кнопки в обычном состоянии, вторая — изображение «отключенной» недоступной
кнопки (свойство Enabled имеет значение False), третья — изображение на кнопке
после щелчка мыши, четвертая — изображение на «нажатой» кнопке. Число составных частей изображения
задается в свойстве NumGlyphs (от 1 до 4), Расстояние от картинки до границ
кнопки (в пикселах) можно указать в свойстве Margin.
В свойстве Kind задается реакция
кнопки на щелчок. Некоторые стандартные действия можно реализовать без
дополнительного программирования. Соответствующие значения свойства Kind
приведены ниже.
Таблица 4.34. Значения свойства
Kind
Значение Действие
bkCustom Реакция кнопки определена программистом
bkOK Закрытие формы стандартным
действием. В свойство ModalResult записывается значение mrOK
bkCancel Закрытие формы с отказом от изменений. В свойство
ModalResult записывается
значение mrCancel
bkYes Подтверждение изменений. В свойство
ModalResult записывается значение mrYes
bkNo Отказ от изменений. В свойство
ModalResult записывается значение mrNo
bkHelp Вызов раздела справочной системы в
соответствии со значением, записанным
в свойство HelpContext
bkClose Закрытие формы
bkAbort Прерывание. Форма не закрывается
bkRetry Повтор попытки
bklgnore Игнорирование возникшей ситуации
bkAll Подтверждение всех изменений
Для каждого из видов кнопки, за
исключением bkCustom, в системе Delphi 7 имеет-
ся особая картинка.
ЗАМЕЧАНИЕ Способ закрытия формы, на которой
расположено кнопка, определяется значением свойства ModalResuLt. Это свойство
имеется и у обычной кнопки TButton.
С помощью свойство Layout можно
указать расположение картинки по отношению
к тексту (заголовку) кнопки.
Возможные значения указаны ниже.
Таблица 4.35. Значения свойства Layout
Значение Расположение
blGlyphLeft Слева
blGlyph Right Справа
blGlyphTop Вверху
MGlyphBottom Внизу
Расстояние между картинкой и
текстом (в пикселах) задается в свойстве Spacing.
У класса TBitBtn имеется новый
метод Click, который моделирует щелчок на кнопке.
Он используется, когда надо закрыть
форму одним из стандартных способов.
Компонент Шаблон ввода (TMaskEdit)
Этот компонент позволяет вводить
данные в текстовое поле по заданному шаблону. Он полезен для приложений,
где надо контролировать вводимую пользователями
информацию.
После размещения компонента на
форме для него надо задать структуру маски (шаблона, по которому будет
осуществляться ввод) и начальное значение поля.
Структура маски может быть
сформирована двумя способами; с помощью редактора, вызываемого из контекстного
меню объекта — пункт Input Mask Editor (Редактор маски ввода), — или
программно, заданием нужного значения для свойства EditMask, которое хранит
структуру маски в текстовом виде. Рассмотрим второй способ.
Маска состоит из трех частей,
разделенных точками с запятой. Первая часть — собственно маска, описывающая
допустимые значения символов в конкретных позициях поля. В процессе ввода в
поле могут присутствовать дополнительные символы, предназначенные для более
наглядного представления информации, а также для автоматического включения в
итоговый текст (табл. 4.36).
Таблица 4.36. Назначение символов первой части
маски
Символ Значение
! Если этот символ присутствует в маске, то
необязательные символы вставляются перед
маской. Если отсутствует —
необязательные символы вставляются после маски
Ø
Все
последующие символы автоматически приводятся к верхнему регистру
< Все последующие символы автоматически
приводятся к нижнему регистру
<> Прекращение преобразования регистра
\ Последующий символ вставляется в маску.
Данная возможность необходима для добавления символов, используемых в качестве
элементов шаблона
L В данную позицию разрешен только ввод буквы
I В данную позицию разрешен только ввод
буквы, но ее можно оставить пустой
А В данную позицию разрешен только ввод буквы
или цифры
а В данную позицию разрешен только ввод буквы
или цифры, но ее можно оставить пустой
С В данную позицию разрешен ввод произвольного
символа
с В данную позицию разрешен ввод произвольного
символа, но ее можно и оставить пустой
О В данную позицию разрешен только ввод цифры
9 В данную позицию разрешен только ввод цифры,
но ее можно оставить пустой
# В данную позицию разрешен только ввод цифры
или символов +/-• Позицию можно
оставить пустой
: В данную позицию вставляется символ, который
в текущей версии Windows
используется для разделения
часов, минут и секунд при записи времени
_ В данную позицию автоматически вставляется
пробел
Вторая часть маски определяет,
будут ли эти дополнительные символы включены в итоговый текст. Символ 0
указывает, что они не должны включаться в результат, любой другой символ
разрешает их включение. Третья часть маски —символ, заполняющий позиции
шаблона, которые пользователь оставил пустыми (по умолчанию используется
пробел).
Символы, не включенные в табл.
4.36, вставляются в результирующий текст без изменений. В процессе ввода курсор
автоматически перескакивает через них. Рассмотрим пример, в котором требуется
сформировать поле для ввода московских телефонных номеров. Маска может
выглядеть так:
MaskEditl.EditMask : = 'Тел. +7 ( \0\95)000-00-00
;*;*'.
В процессе ввода человеку
достаточно указать только 7 цифр, не нажимая дополнительных клавиш. В
результате в свойстве EditText объекта MaskEditl может оказаться, например,
такой текст: «Тел. +7(095)123-45-67». Это свойство отличается от свойства Text
тем, что поля маски, не указанные пользователем, предварительно заполняются
пробелами.
Отключить использование маски
можно, записав в свойство IsMasked значение False. В такой ситуации можно
задать значение свойства MaxLength, определяющего максимально допустимую длину
вводимого текста. Для получения текущей длины содержимого текстового поля во
время работы программы (которое реально отличается от содержимого свойства
EditText, форматируемого автоматически), надо обратиться к методу GetTextLen.
Метод VatidateEdit выполняет
проверку корректности введенной пользователем
и информации и генерирует исключительную
ситуацию EDBEditError в случае несоответствия введенного текста указанной
маске.
Компонент Рамка (TBevel)
Используется для создания рамок и
отдельных линий оформления. Напоминает панель, но не предназначен для
группировки элементов.
Свойство Shape (Образ) может
принимать одно из следующих значений.
Таблица 4.37. Значения свойства Shape
Значение Форма рамки
bsBox Прямоугольник. Область внутри него
отображается в соответствии со значением свойства Style
bsFrame Прямоугольник. Внутренняя область не
изменяется
bsTopLine Для выделенной области показывается
только верхняя граница
bsBottomLine Для выделенной области показывается только
нижняя граница
bsL.eftL.ine Для выделенной области показывается только
левая граница
bsRightLine Для выделенной области показывается только
правая граница
bsSpacer Рамка не отображается. Значение
используется разработчиками на этапе
проектирования для выделения
областей под собственные нужды
Дополнительно в свойстве Style указывается форма окаймляющих линий
панели:
bsLowered (вдавленные линии) или
bsRaised (выпуклые линии).
Компонент Постоянный текст
(TStaticText)
Основное отличие этого компонента
от ранее рассмотренного компонента TLabel только в том, что он позволяет взять
выводимый текст в рамку.
Форма рамки определяется свойством
BorderStyle, которое может принимать одно из трех значений: sbsNone (кайма
отсутствует), sbsSingle (кайма представляет собой обычную линию), sbsSunken
(кайма имеет вид вдавленной области).
Компонент Фигура (TShape)
Этот компонент предназначен для
отображения на форме различных геометрических фигур.
Конкретная форма геометрического
объекта задается в свойстве Shape. Возможны следующие значения.
Таблица 4,38. Значения свойства Shape
Значение Форма фигуры
stCircle Круг
st Ellipse Эллипс
stRectangle Прямоугольник
stRoundRect Прямоугольник со скругленными углами
stRoundSquare Квадрат со скругленными углами
stSquare Квадрат
Цвет фигуры (рис. 4.3) определяется
кистью объекта (свойство Brush), границы фигуры — карандашом (свойство Реn).
Компонент Разделитель
(TSplitter)
С помощью этого компонента клиентская
область формы может быть разделена на несколько панелей, размеры которых
допускается изменять, просто перетаскивая границы этих панелей. Активное
применение разделителя в первых 32-разрядных программах для Windows 95 в свое время послужило хорошим
стимулом развития технологии стыковки.
Создание разделителя выполняется в
системе Delphi 7 довольно оригинально. Рассмотрим
пример, когда область формы надо разделить на три части, как в некоторых
программах, предназначенных для приема электронной почты. В левой части располагается
список почтовых папок, справа — список всех писем выбранной папки, а в верхней
части —текущее письмо. Каждую часть представим в виде панели.
Порядок применения разделителя
достаточно строгий. В первую очередь на форме помешаются объекты, которые
выравниваются по границам формы, вслед за каждым объектом сразу устанавливается
разделитель, а последний объект выравнивается по всей оставшейся клиентской
области.
На пустой форме размешаем компонент
TPanel, его свойству Align (Выравнивание) задаем значение alLeft (по левой
границе формы). Затем на форму устанавливается компонент TSplitter, который
сразу автоматически выровняется по правой границе объекта Panell. Следующим
снова размещаем компонент TPanel, который выравниваем уже по верхней границе
формы — в свойство Align записываем значение аГГор.
Опять добавляем компонент
TSplitter, который теперь автоматически выравнивается по нижней границе объекта
Panel2. В заключение, на свободную часть формы помещаем третий компонент
TPanel, который выравнивается по всей оставшейся клиентской части — свойство
Align принимает значение alClient (рис. 4.4), Если теперь откомпилировать и
запустить программу, то, переместив курсор на область одного из разделителей и
нажав левую кнопку мыши, можно произвольно
менять размеры каждой из областей
(панелей). Насколько близко к границам окна (в пикселах) можно приближать
разделители, определяется в свойстве MinSize каждого объекта Spliter.
Свойство Beveled определяет, будет
ли разделитель выглядеть объемным (для этого свойство должно иметь значение
True).
Свойство ResizeStyle задает способ
отображения на экране процесса перетаскивания разделителя. Оно может принимать
одно из следующих значений.
Таблица 4.39. Значения свойства ResizeStyle
Значение Способ отображения
rsNone Предполагаемое новое
положение разделителя не отображается, а размеры
областей меняются, когда
пользователь отпускает кнопку мыши
rsLine Предполагаемое новое
положение разделителя отображается в виде сплошной
черной линии
Таблица 4.39. Значения свойства
ResizeStyle (продолжение)
Значение Способ отображения
rsPattern Предполагаемое новое
положение разделителя отображается в виде толстой пунктирной линии
rsUpdate При перемещении указателя
мыши происходит немедленное изменение размеров соответствующих областей
Работать с данным полезным
компонентом можно прямо из программы. В следующем примере форма делится на две
части с помощью разделителя, динамически создаваемого в процессе работы. На
форме предварительно размещены две панели:
одна выровнена по левой границе
формы, а вторая помещена в правой части формы и никак не выровнена.
В момент создания формы к ней
добавится новый объект (делитель).
procedure
TForml .FormCreate (Sender: TObject] ,-
var
Split: TSplitter;
begin
//
создаем новый объект:
// в качестве его родителя
// задаем текущую форму:
Split.Parent := Forml;
// помещаем делитель на форму -
// он не должен накладываться на
левую панель:
Split.Left := Panell.Width + 5;
// выравниваем его так, чтобы он
// автоматически присоединился к
этой панели:
Split.Align := alLeft,-
// задаем минимальный допуск:
Split.MinSize := 20;
// для второй панели указываем
способ выравнивания
// по всей оставшейся клиентской
области:
Panel2.Align i= alclient,-
// теперь делитель готов к работе
end;
Этот пример чисто демонстрационный.
Б реальной работе переменную Split надо делать не локальной, а глобальной,
чтобы всегда иметь возможность освободить временно отведенную ей память. Это
возможно, так как переменные типа class, как уже говорилось, на самом деле
представляют собой указатели.
Компонент События приложения
(TApplicationEvents)
Данный компонент может
использоваться совместно с компонентом TActionList. Он позволяет принимать и
обрабатывать все сообщения, адресованные приложению (объект Application), в
одном месте. Этот компонент удобно применять, в частности, когда требуется
обрабатывать сообщения Windows,
Объекты класса
TApplicationEvents
могут быть размещены на любых формах проекта.
Все они будут получать копии
сообщений, предназначенных для программы. Эти объекты способны также
обрабатывать события (табл. 4.40), которые не обслуживаются компонентом
TActionList, если он тоже имеется на форме.
Таблица 4.40. События, обрабатываемые
компонентам TApplicationEvents
Событие Действие
OnActionExecute Действие, не обслуживаемое компонентом
TActionList
On ActionUpdate Состояние ожидания (Ontlpdate), не
обслуживаемое компонентом TActionList
OnActivate Активизация приложения
OnDeactivate Пользователь переключился на другую
программу Windows
OnException Возникновение исключительной
ситуации, не обрабатываемой никаким блоком try
OnHelp Запрос справочной системы
OnHint Указатель находится над
объектом, способным отображать всплывающую подсказку
Onldle Состояние ожидания
(например, когда приложение ждет действия
пользователя и процессорное время
не тратится)
OnMessage Получение программой сообщения от
Windows
OnMinimize Приложение должно быть свернуто
OnRestore Приложение должно быть
восстановлено из свернутого состояния к
нормальному размеру
OnShortCut Пользователь нажал клавишу.
Приложение получает это сообщение до
посылки сообщения о нажатии клавиши
элементу управления
OnShowHint Происходит вывод подсказки
После того как компонент
TApplicationEvents размещен на форме, надо задать обработчик конкретных
событий. Допустим, мы хотим показывать координаты щелчков мыши в пределах окна
с помощью надписи Labell. Этот объект надо заранее установить на форму. Для
формы можно создать обработчик события OnMouseUp, но это не позволит
отслеживать щелчки на различных элементах управления внутри формы, так как
переадресация соответствующих сообщений скрыта внутри ком-
понентов Da/phi 7. Для этой цели удобно применить
компонент TApplicationEvents, определив реакцию на событие OnMessage. Заголовок
обработчика будет выглядеть так:
procedure
TForml.ApplicationEventslMessage(
var Msg: tagMSG;
var Handled: Boolean);
Здесь самый важный параметр — это
Msg (его тип на самом доле называется TMsg).
Он описывает сообщение, полученное
от Windows, перед тем как оно уйдет дальше в программу.
Важнейшее поле типа TMsg называется message и содержит стандартный код
сообщения, полученного от Windows
(коды всех
сообщений Windows
хранятся в
модуле Messages).__
В нашем случае надо –«поймать»
сообщение WMJ-BUTTONUP (отпускание левой кнопки
мыши). Экранные координаты щелчка
хранятся в структуре типа TMsg, имеющей имя pt (тип TPoint). Их можно
предварительно пересчитать в координаты окна с помощью стандартной функции
ScreenToCLient, получающей в качестве аргумента запись типа TPoint и
возвращающей запись такого же типа, только с пересчитанными координатами.
Целиком обработчик запишется так:
procedure TForml.ApplicationEventslMessagef
var Msg: tagMSG;
var
Handled: Boolean);
var
P: TPoint;
begin
if
Msg.message = WM_LBUTTONUP then
begin
P
:= ScreenToClient(Msg.pt);
Label1.Caption
:= IntToStr(P.x) + ',' + IntToStr(P.y);
end;
end;
Теперь если даже на форме
разместить кнопку, то при щелчке на ней надпись Labell будет отображать
координаты точки щелчка.
Компонент Таблица строк (TStringGrid)
Использование многими
пользователями электронных таблиц типа Excel стало практически неотъемлемой
частью применения компьютеров. В системе Delphi 7 имеются
два компонента, которые позволяют до некоторой степени сымитировать работу
электронной таблицы, оставляя при этом, конечно, основную работу по реализации
конкретных функций такой таблицы программистам.
Первый компонент — это таблица
строк, позволяющая работать с текстовой информацией в двумерной таблице,
имеющей столбцы и строки (их размеры можно менять с помощью мыши).
Дополнительно, к каждой ячейке таблицы можно «привязать» свой объект,
характеристики которого программист представит в виде строки, расположенной в
этой ячейке.
Основное свойство таблицы строк —
это двумерный массив Cells, позволяющий обращаться к содержимому ячеек и
изменять их содержимое. Первое измерение - это номер строки, второе — номер столбца.
ЗАМЕЧАНИЕ Нумерация элементов в таблице строк начинается с нуля.
Число столбцов задается в свойстве
ColCount, число строк — в свойстве RowCount. Следующий код программы изменяет
размер таблицы, помещенной на форму в режиме проектирования (по умолчанию
принят размер 5x5 элементов), на размер 10x10 ячеек и заполняет ячейки
строками, содержащими их координаты (рис, 4.5),
procedure
TForml.FormCreatefSender: TObject);
var
с,г; integer;
begin
StringGridl.ColCount
:= 10;
StringGridl.RowCount
:= 10;
for
с
:= 0 to StringGridl.ColCount-1 do
for
r := 0 to StringGridl.RowCount-1 do
StringGridl.Cells[c,r]
:=
'{'
+ IntToStr(c) • * - ' , ' + IntToStr(r) •*•')';
end;
Обратите внимание, что левый
столбец и верхняя строка, хотя и содержат текстовую информацию, фактически
являются заголовочными областями. Использовать их наравне с другими ячейками не
совсем правильно.
ЗАМЕЧАНИЕ Число строк и столбцов, имеющих
характер заголовка, задается свойствами FixedCols и FixedRows. Если таблица не
содержит заголовочной информации, эти свойство должны принимать значение 0.
Можно получить доступ ко всем
элементам одного столбца или одной строки. Соответствующие свойства Col и Row
имеют тип TStrings, позволяющий обращаться к нужному элементу по номеру.
Чтобы привязать к ячейке объект (наследник
класса TObject), надо использовать свойство Objects, представляющее собой такой
же массив, как Cells, но содержащий не строки, а объекты. Эти объекты должны
создаваться, а также уничтожаться программистом вручную, иными словами, весь
контроль над состоянием этого массива полностью возлагается на разработчика.
Свойство Objects предоставляет только доступ к нужному объекту. Остальные
свойства, предназначенные для оформления таблицы строк, приведены в табл. 4.41.
Компонент Список с флажками
(TCheckListBox)
Данный список ничем не отличается от
обычного списка за исключением дополнительных флажков в начале каждой строки.
При создании такою списка
дополнительно настраиваются свойства, указанные ниже.
Таблица 4.42. Свойства класса TCheckListBox
Свойство Назначение
AllowGrayed Имеет значение True,
если флажки списка могут находиться в промежуточном
(«сером») состоянии
Checked Массив состояний
флажков. Отслеживаются только два состояния: включен (True)
и выключен («серое» состояние
считается выключенным)
Flat Имеет значение True, если
форма флажков плоская
ItemEnabled Массив допустимых
состояний флажков. Если для конкретного флажка задано
значение True, то его состояние
можно менять, в противном случае флажок недоступен для изменения
State Массив состояний флажков,
элементы которого принимают одно из трех значений:
cbLlnchecked (выключен),
cbChecked (включен), cbGrayed («серый»)
При работе со списком флажков можно
обрабатывать событие OnClickCheck, которое возникает, когда пользователь меняет
состояние одного из флажков.
Компонент Редактор списка строк
(TVaLueListEditor)
Компонент TValueLIstEditor
предназначен для создания списков строк, состоящих из пар «имя — значение».
TVaLueListEditor напоминает компонент Таблица строк (TStringGrid), но он более
простой.
Расположенный на форме объект
TValueListEditor представляет собой таблицу из двух столбцов. В первом
указывается имя, во втором — соответствующее ему значение. Название каждого
столбца можно изменить в свойстве TitleCaptions.
На этапе проектирования исходная
информация вводится в таблицу с помощью свойства Strings (для этого вызывается
визуальный редактор пар значений). Строки, записываемые в это свойство во время
работы программы, должны иметь формат «имя = значение» (например, 'XI = 50').
С помощью свойства KeyOptions можно
ограничить возможности данного компонента, например разрешить или запретить
редактирование, добавление или удаление строк. Свойство Options дает
возможность подробно настроить внешний вид объекта па форме.
Когда пользователь будет менять
значение в строке данного объекта в работающей программе, ему можно предложить
на выбор раскрывающийся список готовых значений. Для этого необходимо
сформировать собственный обработчик события OnGetLookup. В качестве параметра
KeyName перелается очередное значение ключевого (первого) столбца. Программист
может записать в параметр Values (тип TStrings) список соответствующих этому
значению строк, которые отображаются в меню.
Например:
procedure TForml.ValueListEditorlGetLookup(
const KeyName: String; Values; TStrings);
begin
if KeyName = 'X1' then
begin
Values.Add('V1');
end;
end;
Ячейка такого поля в правом столбце
дополнительно сопровождается небольшой кнопкой-стрелкой меню. Для добавления новой строки служит метод:
function
InsertRow (const KeyName, Value: string; Append:Boolean): Integer;
для удаления — метод:
procedure
DeleteRowfARow: Integer) ;
а для поиска
— метод:
function
FindRowfconst KeyName: string,- var Row: Integer):
Boolean,-
Компонент Текстовое поле с
подписью (TLabeledEdit)
Весьма полезный компонент. В
большинстве случаев ввода сопровождаются подписями. В предыдущих
версия,бовалось создавать по отдельности поле ввода TEdit и надпись TLabel,
которую надо было достаточно точно и аккуратно расположить вблизи поля ввода.
Теперь, с появлением данного компонента, эта проблема решена.
По своим свойствам Текстовое поле с
подписью практически полностью совпадает с компонентом TEdit, но в нем
появилось новое свойство EditLabel, представляющее собой вложенный компонент
TLabel, который автоматически привязан к местоположению поля ввода.
Название (подпись) редактируется
именно в атом вложенном объекте — в свойстве Caption.
Компонент Диаграмма (TChart)
Это очень мощный и богатый
возможностями компонент, разработанный Дэвидом Бернеда (версия, включенная в
систему Delphi 7, имеет номер 4.02).
Он позволяет строить красивые двух-
и трехмерные диаграммы на основе различных данных, является наследником класса
TPanel и наследует все свойства панели. Создать диаграмму можно двумя
способами: визуально с помощью Мастера (без программирования) и непосредственно
средствами Паскаля.
Начало работы. Мастер запускается
командой File >
New > Business
> TeeChart Wizard
(Файл >• Создать >• Деловые
>• Мастер диаграмм), после чего разработчику надо выполнить ряд уточнений.
Сначала выбирается источник данных. Пусть он не расположен в файле, а
генерируется программой — переключатель Non Database Chart (He на основе базы
данных). Затем выбирается внешний вид диаграммы. Она может быть двумерной или
трехмерной что определяется переключателем 2D/3D (рис. 4.9).
На следующем этапе работы Мастера
флажок Show Legend (Отображать легенду) определяет наличие легенды — дополнительной панели, на которой
указывается соответствие цветов частей диаграммы указанным значениям. Флажок
Show Marks включает небольшие желтые подсказки у каждой из частей диаграммы.
На этом создание диаграммы
заканчивается. После щелчка на кнопке Finish (Готово) в Проектировщике форм
появится новая форма, на которой будет расположен объект Chartl. Он заполнен
неким набором случайно сгенерированных значений (рис. 4.10),
Настройка диаграммы выполняется с
помощью редактора, который вызывается двойным щелчком на объекте Chartl (рис.
4.11).
Параметры отойражения диаграммы в
окне определяются на вкладке Chart (Диаграмма), состоящей в свою очередь из
набора дополнительных панелей.
О Панель Series (Ряд данных) очень
важна. Она позволяет объединять несколько диаграмм на одном графике с помощью
кнопки Add (Добавить). При этом над значениями рядов данных можно выполнять
различные операции, задаваемые на вкладке Functions (Функции): сложение (Add),
вычитание (Subtract),умножение (Multiply), деление (Divide), взятие наибольшего
(High), наименьшего (Low) или среднего (Average) значения (рис. 4.12).
О Панель General (Общие) содержит
элементы управления для:
• экспорта изображения в файл —
кнопка Export (Экспортировать);
• установки (в процентах) сдвига
границ изображения по отношению к границам объекта — поля Margins (Поля);
• масштабирования — панель Zoom
(Масштаб);
• прокрутки — панель Allow Scroll
(Разрешить прокрутку).
О Средства панели Axis (Оси)
отвечают за все, что касается определения координатных осей, их масштаба,
заголовков, шага пунктирной сетки и так далее.
О Панель Titles (Заголовки)
содержит средства для оформления заголовка.
О Панель Legend (Легенда)
используется при оформлении внешнего вида и содержимого легенды.
О Средства панели Panel (П анель)
описывают форму и визуальное представление панели-основы, на которой
расположена диаграмма.
О Панель Pages (Страницы) служит
для разделения диаграммы на страницы. Увеличивая число точек на странице с
помощью поля Points per Page (Точки на страницу), можно подобрать оптимальное
соотношение между наглядностью диаграмм и разумным числом страниц.
О Панель Walts (Границы) позволяет
задать цвет и размеры границ диаграммы.
О Панель 3D описывает
пространственное представление трехмерных диаграмм, С помощью нескольких
движков проектируемую диаграмму можно вращать и масштабировать.
На вкладке Series (Ряды данных) в
редакторе задаются конкретные параметры оформления каждого ряда данных (каждого
графика, добавленного при помощи вкладки Chart). Выбор текущего ряда данных
производится с помощью раскрывающегося списка Area (Область) (рис. 4.13).
задать для ряда случайные значения
(Random Values), отказаться от генерации значений (No Data) или сформировать
значения текущего ряда данных как результат применения некоторой функции
(раскрывающийся список Function) к значениям выбранных рядов данных. Выбор
рядов данных — занесение в список Selected Series
(Выбранные ряды) осуществляется с
помощью кнопки >.
Программная работа с диаграммами.
Рассмотрим пример создания трехмерной диаграммы и заполнения ее значениями
непосредственно из программы.
На форме Forml разместим компонент
TChart и вызовем редактор. Это можно сделать также из контекстного меню объекта
выбором пункга Edit Chart (Изменить диаграмму).
На панели Series (Ряд данных)
вкладки Chart (Диаграмма) щелкните на кнопке Add (Добавить) и выберите
подходящее трехмерное представление, например Point (Точечное). На форме
появится диаграмма, заполненная случайными данными. На панели Titles
(Заголовки) надо указать подходящее название диаграммы и закрыть редактор.
Диаграмма связывается с программным
кодом очень просто. Большинство настроек, имеющих отношение к оформлению
диаграммы, формируются в редакторе, а в программе (в разделе класса TForml, где
располагаются создаваемые в Проектировщике элементы управления) должен
появиться новый объект — переменная Seriesl
TnnaTPointSeries, Она описывает последовательность
значений, которые будут отображаться на диаграмме. Всю остальную работу система
Delphi 7 берет на себя — очень удобный и
простой подход.
Рассмотрим основные свойства и
методы класса TPointSeries (он является наследником базового класса TChartSeries,
который служит основой для всех классов, описывающих содержимое конкретных
типов диаграмм). Разработчику требуются такие возможности,
как добавление и удаление точки, изменение некоторого значения, очистка всех
точек, получение общего числа точек и доступ к их текущим значениям.
Пусть имеется диаграмма типа Point
(Точечное представление), на которой должны располагаться условные значения
результатов двух экспериментов (≪Эксперимент А*- и ≪Эксперимент
Б*). Эти значения вводятся с помощью двух текстовых полей, для их
редактирования используется щелчок мыши на точке диаграммы. Нужны также
возможности удаления точки и очистки текущего графика.
Так как требуется выводить
результаты двух экспериментов (два ряда значений), надо добавить к текущей
диаграмме еще один ряд. В редакторе диаграммы на панели Chart > Series
(Диаграмма >- Ряд дачных) щелкните на кнопке Add (Добавить) и выберите вид
представления Point (Точечное).
Примерный вид такой формы показан
на рис. 4.14.
диаграммы целиком помещалась на панели
Chartl, можно
немного сдвинуть левую границу
области диаграммы вправо.
Для этого на панели редактора Chart
>• General (Диаграмма >
Общие) можно задать значение 5% в
левом поле на панели Margins
(Поля).
Добавление новой точки к серии
выполняется с помощью метода Add, заголовок
которого выглядит следующим
образом.
function AddXY(Const AXValue, AYValue: Double;
Const
AXLabel: String;
AColor:
TColor) : Longint;
Добавляемая точка задается
параметрами AXValue и AYValue. Параметры AXLabeL и
AColor — необязательные. Первый
описывает произвольное название группы, к кото-
рой будет принадлежать точка,
второй — цвет этой группы. В нашем случае выберем
красный цвет для точек эксперимента
А, а цвет точек эксперимента Б сделаем
синим. Функция возвращает позицию
(номер) новой точки в свойстве XValues или
YVaLues (массивы значений) в
зависимости от того, по какому измерению добавля-
ется на диаграмму точка.
Обработчик щелчка на кнопке
Эксперимент A (Buttonl) запишется следующим образом.
procedure
TForml.ButtonlClick(Sender: TObject];
begin
Seriesl.AddXY(
StrToFloat(Edit
1.Text) ,
StrToFloat(Edit2.Text)
,
'Эксперимент A' ,
clRed) ;
end;
Обработчик щелчка на кнопке
Эксперимент Б (Button?) будет выглядеть так.
procedure
TForm2.ButtonlClick(Sender: TObject);
begin
Series2.AddXY{
StrToFloat(Editl.Text),
StrToFloat{Edit2.Text),
'Эксперимент Б ' ,
clBlue) ;
end;
Теперь можно запустить программу,
ввести в поля значения и добавить «результаты эксперимента» на диаграмму (рис.
4.15).
Чтобы удалить ранее введенную точку
или изменить ее значение, надо предварительно определить ее номер в массиве
Values. Для этого по каждому ряду данных (объекты Seriesl и Series?)
формируется обработчик события OnClickPointer. Его заголовок выглядит следующим образом.
procedure
SeriesClickPointer(Sender: TCustomSeries; Valuelndex: Longlrit: X, Y: Integer);
Наиболее важный параметр Valuelndex
содержит номер ближайшей точки ряда, около которой
на диаграмме был выполнен щелчок. X и Y — это координаты точки щелчка.
Поместим на форму новый
элемент—флажок Режим удаления (назовем его DeleteBox).
Когда он установлен, выбираемые
точки будут удаляться (после уточняющего запроса). В противном случае текущая
точка будет корректироваться в соответствии со значениями, указанными в полях
ввода.
ЗАМЕЧАНИЕ Можно было бы обрабатывать щелчки и
с помощью события OnClick, в котором кроме номера точки передается и состояние кнопок
мыши. Анализируя это состояние, можно выполнять удаление точки по нажатию
правой кнопки мыши, а корректировку значения — по нажатию левой кнопки.
Удаление элемента из ряда данных
осуществляется с помощью метода Delete, имеющего единственный параметр — номер
элемента. Изменение текущего значения и положения на диаграмме выполняется
простым изменением содержимого соответствующих элементов массивов ValueX и
ValueY. Чтобы сделанные изменения отобразились на диаграмме, надо вызвать метод
Repaint (Перерисовать) для соответствующего ряда данных.
Чтобы не дублировать одинаковый
текст обработчиков щелчка на двух рядах точек, добавим в класс TForml метод,
который будет получать в качестве параметров номер ряда данных и индекс точки,
после чего выполнять все необходимые действия. Введем в часть public класса
TForml заголовок такой процедуры.
procedure
SerieClick( SNum: Integer; Index: Longint );
Теперь достаточно установить на имя
данного метода указатель ишши и выбрать в контекстном меню пункт Complete class
at cursor (Завершить реализацию класса).
В части реализации модуля сразу
появится пустая реализация данной процедуры.
В нее надо добавить проверку
состояния флажка DeleteBox и в зависимости от этого состояния выполнить либо
удаление точки, либо корректировку ее значения (перерисовка диаграммы
осуществится автоматически).
procedure TForml.SerieClicklSNum:
Integer; Index: Integer);
begin
If
DeleteBox.Checked then
begin
if
SNum = 1 then Seriesl.Delete(Index)
else
Series2.Delete(Index)
end
else
begin
if
SNum = 1 then
begin
Seriesl
.XValues [Index] : = StrToFloat (Editl. Text) ,-
Seriesl.YValuesI
Index] := StrToFloat (Edit 2 -Text) ,-
Seriesl.
Repaint ,•
end
else
begin
Series2.
XValues [Index] := StrToFloat (Editl .Text) ,-
Series2.YValues[Index]
:= StrToFloat (Edit2.Text) ,-
Series2.Repaint;
end
end
end;
Тогда обработчики щелчка на точках
каждого ряда данных запишутся следующим образом.
procedure
TForml.SerieslClichPointer(Sender: TCustomSeries;
Valuelndex,
X, Y: Integer);
begin
SerieClickf
1,Valuelndex ) ;
end;
procedure
TForml. Series2Cl ickPointer (Sender г TCustomSeries ,-
Valuelndex,
X, Y: Integer) ,-
begin
SerieClickf
2,Valuelndex ) ;
end;
Теперь программа позволяет с
помощью щелчков удалять лишние точки и корректировать положение точек,
введенных ранее.
Для удаления всех значений в ряду
данных служит метод Clear.
Seriesl.Clear;
Вызов этого метода можно вставить,
например, в обработчик щелчка па новой кнопке Очистить эксперимент А и так
далее.
Первый компонент — это таблица
строк, позволяющая работать с текстовой информацией в двумерной таблице,
имеющей столбцы и строки (их размеры можно менять с помощью мыши).
Дополнительно, к каждой ячейке таблицы можно «привязать» свой объект,
характеристики которого программист представит в виде строки, расположенной в
этой ячейке.
Основное свойство таблицы строк —
это двумерный массив Cells, позволяющий обращаться к содержимому ячеек и
изменять их содержимое. Первое измерение - это номер строки, второе — номер столбца.
ЗАМЕЧАНИЕ Нумерация элементов в таблице строк начинается с нуля.
Число столбцов задается в свойстве
ColCount, число строк — в свойстве RowCount. Следующий код программы изменяет
размер таблицы, помещенной на форму в режиме проектирования (по умолчанию
принят размер 5x5 элементов), на размер 10x10 ячеек и заполняет ячейки
строками, содержащими их координаты (рис, 4.5),
procedure
TForml.FormCreatefSender: TObject);
var
с,г; integer;
begin
StringGridl.ColCount
:= 10;
StringGridl.RowCount
:= 10;
for
с
:= 0 to StringGridl.ColCount-1 do
for
r := 0 to StringGridl.RowCount-1 do
StringGridl.Cells[c,r]
:=
'{'
+ IntToStr(c) • * - ' , ' + IntToStr(r) •*•')';
end;
Обратите внимание, что левый
столбец и верхняя строка, хотя и содержат текстовую информацию, фактически
являются заголовочными областями. Использовать их наравне с другими ячейками не
совсем правильно.
ЗАМЕЧАНИЕ Число строк и столбцов, имеющих
характер заголовка, задается свойствами FixedCols и FixedRows. Если таблица не
содержит заголовочной информации, эти свойство должны принимать значение 0.
Можно получить доступ ко всем
элементам одного столбца или одной строки. Соответствующие свойства Col и Row
имеют тип TStrings, позволяющий обращаться к нужному элементу по номеру.
Чтобы привязать к ячейке объект (наследник
класса TObject), надо использовать свойство Objects, представляющее собой такой
же массив, как Cells, но содержащий не строки, а объекты. Эти объекты должны
создаваться, а также уничтожаться программистом вручную, иными словами, весь
контроль над состоянием этого массива полностью возлагается на разработчика.
Свойство Objects предоставляет только доступ к нужному объекту. Остальные
свойства, предназначенные для оформления таблицы строк, приведены в табл. 4.41.
Компонент Список с флажками
(TCheckListBox)
Данный список ничем не отличается от
обычного списка за исключением дополнительных флажков в начале каждой строки.
При создании такою списка
дополнительно настраиваются свойства, указанные ниже.
Таблица 4.42. Свойства класса TCheckListBox
Свойство Назначение
AllowGrayed Имеет значение True,
если флажки списка могут находиться в промежуточном
(«сером») состоянии
Checked Массив состояний
флажков. Отслеживаются только два состояния: включен (True)
и выключен («серое» состояние
считается выключенным)
Flat Имеет значение True, если
форма флажков плоская
ItemEnabled Массив допустимых
состояний флажков. Если для конкретного флажка задано
значение True, то его состояние
можно менять, в противном случае флажок недоступен для изменения
State Массив состояний флажков,
элементы которого принимают одно из трех значений:
cbLlnchecked (выключен),
cbChecked (включен), cbGrayed («серый»)
При работе со списком флажков можно
обрабатывать событие OnClickCheck, которое возникает, когда пользователь меняет
состояние одного из флажков.
Компонент Редактор списка строк
(TVaLueListEditor)
Компонент TValueLIstEditor
предназначен для создания списков строк, состоящих из пар «имя — значение».
TVaLueListEditor напоминает компонент Таблица строк (TStringGrid), но он более
простой.
Расположенный на форме объект
TValueListEditor представляет собой таблицу из двух столбцов. В первом
указывается имя, во втором — соответствующее ему значение. Название каждого
столбца можно изменить в свойстве TitleCaptions.
На этапе проектирования исходная
информация вводится в таблицу с помощью свойства Strings (для этого вызывается
визуальный редактор пар значений). Строки, записываемые в это свойство во время
работы программы, должны иметь формат «имя = значение» (например, 'XI = 50').
С помощью свойства KeyOptions можно ограничить возможности данного компонента, например разрешить или за�