13. Построение графиков. Компонент TDBChart

13.1. Создание графика *

13.2. Добавление серии в график и установка свойств серии в редакторе графика *

13.2.1. Добавление серии в график *

13.2.2. Выбор источника данных *

13.2.3. Определение функций *

13.3. Добавление серии во время выполнения *

13.4. Работа с сериями. Компонент TChartSeries *

13.4.1.Свойства компонента TChartSeries *

13.4.2. Методы компонента TChartSeries *

13.4.3. События компонента TChartSeries *

13. Построение графиков. Компонент TDBChart

Для построения графиков используется компонент TDBChart, расположенный на странице Data Controls палитры компонентов Delphi

13.1. Создание графика

Для того чтобы создать график, поместите в форму компонент TDBChart в форме будет создана заготовка (рис 131) Затем щелкните мышью по этой заготовке два раза. Будет произведен переход в редактор графика В среде этого редактора можно установить свойства графика и его серий. Содержимое редактора графика представляет собой табулированный блокнот Для нового графика первой всегда показывается закладка Chart и для страницы Chart - закладка Series (рис 13 2).

Каждая из закладок на странице Chart предназначена для установки параметров того или иного компонента графика

Series - содержит серии графика Серией называется набор точек графика На графике серии соответствует отдельная линия или ряд столбцов Если в графике несколько серий, будет визуализировано несколько линий или рядов столбцов Например, на рис 13 3 показан график, состоящий из двух серий. Первая показывает общую сумму продаж за 1 -и, 2-й, 3-й квартал, вторая - сумму продаж по конкретному покупателю

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

Axis - устанавливает свойства осей (рис. 13.4).

В области ShowAxis определяется, для какой оси устанавливаются параметры - левой, правой, верхней или нижней. На странице, определяемой закладкой Scales, устанавливаются свойства масштаба значений по оси. Automatic устанавливает автоматическое масштабирование данных по оси - минимум и максимум вычисляются динамически, исходя из текущих значений серии. При отмене автоматического масштабирования можно установить автоматическое масштабирование минимального {Minimum} или максимального (Maximum} значения (отметка Auto). Для установки значения максимума и (или) минимума вручную следует нажать соответствующую кнопку Change. Шаг масштаба по оси выбирается автоматически, если в Desired Increment установлено значение 0. Установить фиксированное значение шага можно, нажав кнопку Change. Закладка Title позволяет установить текст заголовка по оси, угол расположения заголовка и шрифт, которым заголовок выводится. Закладка Labels задает параметры меток для оси. Закладка Tiks устанавливает параметры самой линии оси.

Titles - определяет заголовок графика, шрифт, выравнивание и др. Legend - задает параметры легенды. Легенда - область графика, где приводится информация о графике. Например, на рис. 13.5 показана легенда, которая расположена под графиком на рис. 13.3, и служит для пояснения графика.

Panel - определяет параметры панели, на которой располагается график.

Paging - устанавливает параметры многостраничного графика.

Walls - задает "стенку" графика. Например, на рис.13.3 "стенка" расположена по левой вертикальной оси.

13.2. Добавление серии в график и установка свойств серии в редакторе графика

13.2.1. Добавление серии в график

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

Чтобы добавить в график серию, следует на странице Chart, (закладка Series) нажать кнопку Add. После этого появится окно выбора типа серии (рис 13.6).

Рис 13.6 Редактор графика - окно выбора типа серии Рис 13.7 Редактор графика - список серий графика

После выбора типа серии в график добавляется компонент, дочерний от базового типа TChartSeries - TLineSeries, TBarSeries, TPieSeries и т.д. Выберем серию типа Line и нажмем Ok. В окне страницы Chart (закладка Series) будет показана серия (рис. 13.7).

Кнопка Add может использоваться для добавления других серий, кнопка Delete - для удаления текущей серии. После нажатия кнопки Title можно определить заголовок серии, кнопки Clone - создать новый экземпляр такой же серии в этом же графике, кнопки Change - изменить тип текущей серии.

Перейдем с закладки Chart на закладку Series. На этой странице представлен блокнот с закладками Format, General, Marks, DataSource. Рассмотрим свойства серии, которые можно установить на страницах, соответствующих этим закладкам.

13.2.2. Выбор источника данных

Несомненно, главные свойства серии можно определить на странице DataSource. На ней определяется источник данных для серии. Выпадающий список ниже закладки позволяет определить тип источника данных для серии:

No Data - серии не назначается источник данных. Далее мы собираемся сделать это программно. Кроме того, заготовленный шаблон серии может в разное время использоваться для показа данных из разных источников, которые мы также собираемся переключать программно во время выполнения.

Random Values - набор случайных чисел. Бывает полезен при формировании заготовки серии, источник данных которой мы собираемся установить позднее.

Function - функция (Сору, Average, Low, High, Divide, Multiply, Subtract, Add) - служит для построения графиков на основании данных в двух или более сериях.

DataSet - позволяет указать НД, значения полей (столбцов) которого будут использоваться для формирования точек серии. В качестве НД могут выступать компоненты TTable, TQuery, TClientDataSet.

Выберем DataSet и из выпадающего списка выберем компонент Table 1, ранее расположенный на нашей форме. Table1 (тип TTable) - набор данных, связанный с таблицей Kap_pryb.DB, где хранятся данные о зависимости между размером капитала некоторой фирмы (поле Kapital) и приростом дохода для каждого факта увеличения капитала (поле ProcKPred). Укажем, что поле Kapital содержит значения по оси X, а поле ProcKPred - значения по оси Y (рис. 13.8.)

ЗАМЕЧАНИЕ Не все типы серии требуют значений по осям Y или Х Для серий типа Pie, Bar можно указывать значения по одной из осей и значения меток Labels В качестве меток могут использоваться символьные поля и поля типа даты и времени Для примера приведем графики отпуска товара конкретному покупателю (рис 13 9), где в качестве данных по оси Y или Х берется сумма отпуска конкретного товара, а в качестве меток Labels - названия товаров Показаны три графика - серии типа Pie, Vertical Bar (или просто Bar) и Horizontal Bar

Серия типа Bar может содержать точки, сформированные как по осям X, Y, так и по оси Y (Bar) и меткам Labels

После того, как мы указали источник данных и поля для формирования значений по осям Х и Y, нажмем кнопку Close и выйдем изредактора графика На ранее пустой панели будет построен график (рис 13 10)

Если вернуться в редактор графика, на странице Series можно, помимо DataSource, увидеть закладки Format, General, Marks Их назначение-

Format - определяет свойства палитры, линий графика и т д

Gene/a/ - задает форматы данных

Marks - устанавливает марки - значения в рамке над точками серии На графике, приведенном на рис 13.10, марки показывают значения узловых точек по оси Y 175, 160, 140 и 120 Марки показываются на графике, если отмечено свойство Visible, свойство Style определяет вид марок (рис 13.11)

13.2.3. Определение функций

На странице Series (закладка Data Source) в качестве источника данных можно определить функцию. Функция обычно используется для показа отношений между другими сериями.

Пусть для графика определены две серии, показывающие общую сумму продаж товаров по месяцам и сумму продаж для конкретного покупателя. Источниками данных этих серий выступают два компонента TQuery. Определим третью серию, которая показывала бы разницу между первыми двумя. Для этого добавим в график новую серию и на странице Series в закладке Data Source выберем Function. В диалоговом окне определения функций выберем тип функции - Subtract (вычитание). В области Source Series \ Available показаны серии, присутствующие в графике. Используя кнопку ”, переместим две упомянутые выше серии (источником которых служат TQuery) в область Selected (рис. 13.12).

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

13.3. Добавление серии во время выполнения

Число серий, присутствующих в текущий момент в графике, во время выполнения можно определить при помощи метода компонента TDBChart function SeriesCount: Longint;

Список серий графика содержится в его свойстве property Series[Index:Longint]:TChartSeries; где Index лежит в диапазоне 0.. SeriesCount-1, поскольку отсчет серий идет с нуля.

Метод procedure RefreshData; обновляет данные в серии из наборов данных, которые служат их источником. Например, пусть график показывает отпуск товара конкретному покупателю. Источником данных для серии графика служит Query 1, которому в качестве параметра передается имя покупателя. При всякой смене имени покупателя происходит обновление Query 1, сопровождающееся изменением данных. Эти изменения отражаются в графике так:

Queryl.Open;

DBChartl. RefreshData;

Покажем, как можно добавить серию в график во время выполнения:

var

MySeries : TBarSeries;

MySeries := TBarSeries.Create(Self);

MySeries.ParentChart := DBChartl;

MySeries.SeriesColor := cIGreen;

MySeries.DataSource := Queryl;

MySeries.XLabelsSource := 'MES';

MySeries.YValues.ValueSource:='S';

MySeries.Active := True;

MySeries.Title := Table1POKUP.Value;

В приведенном примере создается серия типа Bar (вертикальная столбчатая диаграмма), в качестве родительского графика ей назначается DBChartl. В качестве источника данных назначается Queryl. Для формирования значений серии используются поля компонента Queryl: S (по оси Y) и MES (в качестве Labels). Затем серия активизируется (после этого она становится видна в графике) и ее заголовку присваивается наименование покупателя.

13.4. Работа с сериями. Компонент TChartSeries

Компонент TChartSeries является родительским типом для серий графика (для TLineSeries, TAreaSeries, TPointSeries, TBarSeries, THorizBarSeries, TPieSeries, TChartShape, TFastLineSeries, TArrowSeries, TGanttSeries, TBubbleSeries).

 

13.4.1.Свойства компонента TChartSeries

property Active : Boolean; - активизирует (показывает) серию в графике (значение True) и дезактивизирует (скрывает) серию (False). Например: DBChartl.Series[0].Active :=True;

property DataSource : TComponent; - ссылается на компонент типа НД (TTable, TQuery, TClientDataSet) или на другую серию, откуда берутся данные для показа в серии. Например: DBChartl.Series[0].DataSource := Query2;

property HorizAxis: THorizAxis; - указывает, какая горизонтальная ось будет использована для серии. Значения: aTopAxis • верхняя горизонтальная ось; aBottomAxis - нижняя горизонтальная ось.

property Marks : TSeriesMarks; - описывает свойства марок серии, т.е. значений в прямоугольниках, рисуемых для каждого значения серии. Свойства объекта Marks:

property Arrow : TChartPen; - задает свойства пера, рисующего марку. Свойства объекта Arrow:

property Color: TColor; - цвет линий;

property Mode: TPenMode; - способ рисования линий;

property Style: TPenStyle; - стиль линий;

property Visible: Boolean; - видимость линий;

property Width: Integer; - задает ширину линий;

property ArrowLength : Integer; - длина в пикселях линии, соединяющей марку с соответствующим изображением элемента серии. По умолчанию 16;

property BackColor: TColor; - определяет цвет фона марки. По умолчанию $80FFFF (желтый);

property Clip: Boolean; - если содержит True, марки не могут накладываться на другие элементы графика (на легенду, метки осей и т.д.);

property Font : TFont; - определяет шрифт, которым выводится информация внутри марки;

property ParentSeries : TChartSeries; - содержит указатель на серию, к которой принадлежат марки;

property Style : TSeriesMarksStyle; - определяет содержимое марки. По умолчанию smsLabel. В обработчике события TChartSeries. OnGetMarkText можно переопределить значения, принятые по умолчанию. Например: DBChartl.Series[0].Style := smsLabelValue;

Возможные значения свойства Style:

smsValue - значения по осиУ (YValue), за исключением THorizBarSeries (XValue). Например, "9087";

• smsPercent - процентное значение, например "44%"; для форматирования процентного значения также используется свойство TChartSeries. PercentFormat;

• smsLabel - показывает метку, ассоциированную с точкой графика, например "Сахарный песок" (при построении графика продаж по товарам); в том случае, если метки со значениями не ассоциированы, в марках выводятся сами значения;

smsLabelPercent - показывает метку и процентное значение, например "Сахарный песок 44%";

smsLabelValue - показывает метку и значение, например "Сахарный песок 9087";

smsLegend - показывает один из элементов легенды графика, список возможных значений доступен через свойство TChartLegend. TextStyle;

• smsPercentTotal - показывает процентное значение и общую сумму, от которой оно взято, например "44% от 20563".

smsLabelPercent Total - показывает метку, процентное число и общую сумму, например "Сахарный песок 44% от 20563";

smsXValue • показывает значение по оси Х (XValue), например "01.02.1997";

• property Transparent: Boolean; - значение True определяет, что цвет фона марки не используется (в качестве фона используется "прозрачный цвет"); по умолчанию False;

property Visible : Boolean; -определяет, видимы ли (True) или нет (False) марки на графике.

property ParentChart : TCustomChart; - указывает компонент TDBChart, к которому принадлежит серия. Изменение этого свойства позволяет во время выполнения добавлять в график новые серии, показывать серии в других графиках. Например:

var

MySeries : TBarSeries;

MySeries := TBarSeries.Create(Self);

MySeries.ParentChart := DBChartI;

property PercentFormat : String; - определяет формат показа процентных значений;

property RecalcOptions: TSeriesRecalcOptions; - указывает перечень событий, приводящих к пересчету значений серии ( учитывается только для серий, свойство DataSource которых указывает на другую серию) по умолчанию [rOnDelete, rOnModify, rOnInsert, rOnClear],

property SeriesColor: TColor; - определяет цвет, которым выводятся значения серии в графике. Например:

DBChartI.Series[0].SeriesColor := clBlue;

property ShowInLegend: Boolean; - определяет, показывать ли (True) легенду или нет (False). по умолчанию True;

property Title: String; - определяет заголовок серии; по умолчанию заголовок отсутствует, но он может быть назначен в редакторе графика (кнопка Title в окне Series). Например: DBChart1.Series[0].Title := Edit1.Text;

property ValueColor[Index:LongInt]:TColor; - массив, определяет цвет элемента серии с номером Index, например, DBChart1.Series[0].ValueColor[2] := clAqua;

property ValueFormat: String; - определяет формат показа значений серии; при прорисовке осей используется для форматирования меток, при прорисовке серии используется для форматирования значений, показываемых в марках;

property ValueMarkTextlIndex:Longint]:String; - массив значений, выводимых в марках серии;

property VertAxis : TVertAxis; - определяет местоположение вертикальной оси - слева на графике (aLeftAxis) или справа (aRightAxis);

property XLabel[Index:LongInt]: String; - массив, хранящий метки серии по оси X; Index должен находиться в диапазоне 0. Count -1;

DBChartI.Series[0].XLabel[2] := Edit2.Text; property XLabelsSource: String; - имя поля НД (или иного источника значений для серии), определяемого в свойстве DataSource. Содержимое этого поля служит для отображения значений по оси X. Поле должно быть типа, к которому применяется метод AsString. Если значение свойства опущено, значения по оси Х не выводятся. Например: DBChartI.Series [0].XLabelsSource := 'MES';

property XValue[Index:LongInt] : Double; - возвращает значение в списке XValues (см. ниже) с индексом Index (значение в диапазоне 0. Count -1).

property XValues:TChartValueList; - хранит значения серии по оси X. Значения из этого списка НЕЛЬЗЯ удалять, добавлять и т.д. напрямую. Для этого следует воспользоваться соответствующими методами компонента TChartSeries. Могут быть полезны следующие свойства TCliart ValueList:

• property Valuel Index:LongInt |: Double; - обеспечивает доступ к элементу серии с индексом Index (значение в диапазоне 0. Count -1). Например:

DBChart1.Series[0].YValues.Value[2] := StrToFloat(Edit3.Text) ;

DBChart1.Series[0].Repaint;

• property ValueSource : String; - указывает источник данных для формирования значений по оси X. В зависимости от того, каков источник данных для серии (свойство DataSource компонента TChartSeries), может содержать:

1) имя поля - числового типа, типа даты, времени, даты и времени; в этом случае свойство серии DataSource должно ссылаться на НД (TTable, TQuery, TClientDataSet), например:

DBChart1.Series[0].DataSource := Query2;

DBChart1.Series[0].XValues.ValueSource := 'Pole1';

при этом необходимо помнить, что данные будут взяты в серию только из открытого НД; если НД закрыт, то получение данных будет отложено до открытия НД;

2) имя существующего TChart ValueList из другой серии; в этом случае свойство DataSource серии должно ссылаться на другую серию, например:

DBChart1.Series[0].DataSource := DBChart2.Series [4] ;

DBChart1.Series[0].XValues.ValueSource := 'X';

Свойства property YValuetIndex:LongInt]: Double; property YValues: TChartValueList; аналогичны свойствам XValue и XValues и используются для вертикальной оси.

13.4.2. Методы компонента TChartSeries

function AddXY(Const AXValue, AYValue: Double; Const AXLabel: String; ACoIor: TColor): Longint;

Добавляет новую точку в серию. Параметры AXValue и AYValue содержат соответственно значения по осям Х и Y. Параметр AXLabel содержит метку для добавляемой точки серии. Параметр ACoIor определяет цвет. Функция возвращает позицию новой точки в серии. Например:

DbChartl.Series[0].AddXY(TmpX,TmpY,TmpLabel,clAqua) ;

function AddY(Const AYValue: Double; Const AXLabel: String; AColor: TColor): Longint; добавляет в серию новое значение по оси X. Применяется для тех серий, в которых график строится по Х и меткам значений по Х (например, Pie, Bar). Назначение параметров такое же, как у метода AddXY.

procedure Assign Values(Source: TChartSeries); - копирует все точки из серии Source в текущую серию.

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

procedure Clear; - удаляет все значения из серии; если вслед за этим не занести новых точек, будет показываться пустой график.

procedure ColorRange(AValueList: TChartValueList ;Const From Value, To Value: Double; AColor: TColor);

Изменяет цвет указанного диапазона точек серии. AValueList - либо XValues, либо YValues. From Value указывает начальное, а То Value конечное значение в списке AValueList. AColor - новый цвет. Например:

WITH DbChartl.Series[0] do begin

ColorRange(XValues,XValues.Value[2], XValues.Value[2],clAqua) ;

END;//with

function Count : Longint; - возвращает число точек в серии. Например, поместить все значения по Х и Y точек серии в ListBoxl:

ListBoxl. Items . Clear;

WtTH DbChartl.Series [0] do begin for i := 0 TO Count - 1 do

ListBoxl.Items.Add(

FloatToStr(XValues.Value[i]) + ' ' + FloatToStr(YValues.Value[i])) ;

END;//with

procedure Delete(ValueIndex : Longint); - удаляет из серии точку с номером ValueIndex. График, к которому принадлежит серия, автоматически перерисовывается. Например: DBChartl.Series[0].Delete(4) ;

procedure DoSeriesClick(ValueIndex:LongInt; Button:TMouseButton; Shift:

TShiftState; X, Y: Integer); virtual; - инициирует наступление события OnClick.

function GetCursorValueIndex : Longint; - возвращает индекс точки серии в TChart ValueList, ближе всего к которой расположен курсор мыши. Если такую точку определить не удается, возвращается - 1. Например, в следующем фрагменте Label7.Caption будет содержать индекс ближайшей точки к курсору мыши или '???', если такая точка не определена:

procedure TForm1.DBChartlDblClick(Sender: TObject);

var Tmp : Integer;

begin

Tmp := DBChartl.Series[0].GetCursorValueIndex;

IF Tmp >= 0 THEN Label7.Caption := IntToStr(Tmp)

ELSE Label7.Caption := '???';

end;

procedure GetCursorValues( Var x, у: Double); - возвращает значения по X и Y точки графика (а не только серии), ближе всего к которой расположен курсор мыши. Например, Label lO.Caption и Labell2.Caption в следующем фрагменте содержат соответственно значения координат Х и Y графика, соответствующие точке, на которой находится курсор мыши:

var TmpX, TmpY : Double;

DBChartl.Series[0].GetCursorVaiues(TmpX,TmpY);

LabellO.Caption := Format('%10.2f,[TmpX]);

Labell2.Caption := Format('%10.2f,[TmpY]);

function GetHorizAxis: TChartAxis; - возвращает указатель на назначенную серии горизонтальную ось. Используя данный указатель, можно вызывать методы оси, обращаться к ее свойствам.

function GetVertAxis:TChartAxis; - возвращает указатель на вертикальную ось.

function MaxXValue: Double; virtual; - возвращает максимальное значение по X.

function MinXValue: Double; virtual; - возвращает минимальное значение по X.

function MaxYValue: Double; virtual; - возвращает максимальное значение по Y.

function MinYValue: Double; virtual; - возвращает минимальное значение по Y.

procedure RefreshSeries; - обновляет значения серии из источника данных, указанного в свойстве DataSource.

procedure Repaint; - приводит к полной перерисовке всего графика. Рекомендуется вызывать этот метод в случае изменения хотя бы одного из основополагающих свойств серии (например, при изменении значения в DataSource и др.).

function ValuesListCount:LongInt; - возвращает число списков значений точки, используемых в серии. Обычно это 2 (XValues и YValues), но некоторые серии используют 3 (BubbleSeries - XValues, YValues, Radius; GanttSeries -Y, Start,End).

function VisibleCount: Longint; - возвращает число точек серии, видимых на графике.

13.4.3. События компонента TChartSeries

property OnBeforeAdd: TSeriesOnBeforeAdd;

TSeriesOnBeforeAdd = Function(Sender: TChartSeries): Boolean of object;

Наступает перед добавлением точки в серию. В обработчике данного события может производиться анализ корректности добавляемых в серию точек. Наступает также при соединении серии с источником данных (TTable или TQuery).

property OnAfterAdd: TSeriesOnAfterAdd;

TSeriesOnAfterAdd = procedure(Sender:TChartSeries; ValueIndex:Longint) of object;

Происходит после добавления точки в серию.

property OnClear Values: TSeriesOnClear;

TSeriesOnClear = procedure(Sender: TChartSeries) of object;

Происходит при очистке серии от точек.

property OnClick: TSeriesClick;

TSeriesClick = procedure(Sender:TChartSeries; ValueIndex: Longint; Button:

TMouseButton; Shift: TShiftState; X, Y: Integer);

Происходит при щелчке мышью на серии.

property OnGetMarkText: TSeriesOnGetMarkText;

TSeriesOnGetMarkText = procedure ( Sender : TChartSeries ; ValueIndex :

Longint; Var MarkText: String)

Происходит при формировании марки для точки в серии. Обработчик может использоваться для изменения содержимого марки.