Дополнительные компоненты. Компонент Быстрая кнопка (TSpeedButton) Компонент Кнопка с картинкой (TBitBtn) Компонент Шаблон ввода (TMaskEdit) Компонент Рамка (TBevel) Компонент Постоянный текст (TStaticText) Компонент Фигура (TShape) и т.д.

 

Компонент Быстрая кнопка (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 := TSplitter.Create(Forml};

// в качестве его родителя

// задаем текущую форму:

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;

Вызов этого метода можно вставить, например, в обработчик щелчка па новой кнопке Очистить эксперимент А и так далее.

 

 

'>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 можно ограничить возможности данного компонента, например разрешить или за�