Легенда диаграммы – класс TChartLegend Пояснительная надпись о содержащихся в диаграмме графиках называется легендой. Доступ к описанию легенды обеспечивается из свойства: propertyLegend : TChartLegend; За включение (отключение) показа легенды отвечает свойство: propertyVisible : Boolean; Стиль легенды назначается свойством: propertyLegendStyle : TLegendStyle; TLegendStyle = (lsAuto, lsSeries, lsValues, lsLastValues); За стиль текста отвечает свойство: propertyTextStyle : TLegendTextStyle; TLegendTextStyle = (ltsPlain, ltsLeftValue, ltsRightValue, ltsLeftPercent, ltsRightPercent, ltsXValue); Местоположение области легенды определяется свойством: propertyAlignment : TLegendAlignment; TLegendAlignment = (laLeft, laRight, laTop, laBottom); Координаты прямоугольника с легендой описываются в свойстве RectLegend. Это свойство доступно только для чтения. propertyRectLegend : TRect; //только для чтения Все перечисленные свойства доступны в Инспекторе объектов и на вкладке Legend встроенного редактора диаграммы (рис. 18.7).  Рис. 18.7. Страница настройки легенды диаграммы Координатные оси диаграммы – класс TChartAxis Все координатные оси диаграммы создаются на основе описанного в модуле TeEngine класса TChartAxis. Диаграмма умеет поддерживать до пяти осей одновременно, для чего в TChart объявлены соответствующие свойства: propertyBottomAxis : TChartAxis; //нижняя горизонтальная ось propertyTopAxis : TChartAxis; //верхняя горизонтальная ось propertyLeftAxis : TChartAxis; //левая вертикальная ось propertyRightAxis : TChartAxis; //правая вертикальная ось propertyDepthAxis : TChartAxis; //ось Z для трехмерных графиков Каждая ось идентифицирует свое место в диаграмме посредством двух свойств: propertyHorizontal : Boolean; //только для чтения propertyOtherSide : Boolean; //только для чтения Соответствие между значениями, возвращаемыми данными свойствами, и местом оси в диаграмме приведено в табл. 18.2. Таблица 18.2. Идентификация оси в диаграмме Координатная ось | Свойства оси | Horizontal | OtherSide | LeftAxis | False | False | TopAxis | True | True | RightAxis | False | True | BottomAxis | True | False | Видимость координатных осей определяется свойством диаграммы: propertyAxisVisible : Boolean; По умолчанию оси диаграммы самостоятельно определяют, какие значения присвоить точкам начала и конца отсчета. Для этого ось анализирует хранящиеся в точках графика данные и выявляет самое большое и самое малое значения. При желании можно отказаться от автоматической настройки точек отсчета оси, переведя в состояние false свойство: propertyAutomatic : Boolean; //по умолчанию true Далее программист самостоятельно назначает начало и конец отсчета соответственно: propertyMinimum : Double; propertyMaximum : Double; В этом случае код, назначающий размерность для левой вертикальной оси от 0 до 100, будет выглядеть примерно так: withChart1.LeftAxis do Begin Automatic:= False ; Minimum := 0; Maximum := 100; end; Эквивалентную задачу можно решить с помощью метода: procedureSetMinMax(constAMin, AMax : Double); Процедура сама переведет свойство Automatic в состояние false и передаст в свойства Minimum и Maximum значения аргументов AMin и AMax. Chart1.LeftAxis.SetMinMax( 0, 100 ); Самое большое и самое малое значения точек связанного с осью координат графика проще всего выяснить, обратившись к методу: procedureCalcMinMax (varAMin, AMax : Double); Названные значения будут возвращены в формальные параметры AMin и AMax. Иногда обязанности по определению точек отсчета целесообразно распределить между осью диаграммы и программистом. Допустим, мы планируем всегда начинать отсчет с нулевой отметки, а максимальное значение доверяем выбрать диаграмме. Для этого у оси предусмотрены два свойства: propertyAutomaticMaximum : Boolean; propertyAutomaticMinimum : Boolean; определяющие, какая из точек настраивается автоматически. Например: withChart1.LeftAxis do Begin Automatic := False; Minimum := 0; AutomaticMaximum := True; end; При необходимости координатную ось допустимо привести к логарифмическому виду, для чего следует установить в true свойство: propertyLogarithmic : Boolean; Для того чтобы задать общую подпись для координатной оси, воспользуйтесь свойством: propertyTitle : TChartAxisTitle; Таблица 18.3. Класс TAxisLabelStyle Значение | Описание | talAuto | Автоматический выбор стиля. | talNone | Меток нет. | talValue | Метки оси основываются на текущих значениях соответствующего графика и находятся в пределах его минимального и максимального значений. | talMark | Каждый отдельный график описывается свойством Marks. Поведение таких меток схоже с поведением обычных всплывающих подсказок. Для более подробного понимания стиля см. описание класса TSeriesMarks. | talText | Стиль метки такой же, как у свойства XLabels графика Series. | Расстояние от границы диаграммы до меток устанавливается в свойстве LabelsSize. Расстояние измеряется в пикселах и по умолчанию установлено в 0. propertyLabelsSize : Integer; Формат выводимых значений устанавливается в маске ввода: propertyAxisValuesFormat : string; По умолчанию шаблон маски ввода выглядит следующим образом: '#, ##0.###'. Если координатная ось предназначена для отображения времени, то форматирующая маска вывода даты/времени описывается в свойстве: propertyDateTimeFormat : string; Пример форматирующей строки приведен ниже: Chart1.BottomAxis.DateTimeFormat:='dd/mm/yyyy'; // 15.11.2004 Текст, выводимый в метках оси, может назначаться индивидуально для каждой отдельной отметки. Для этого предназначено событие диаграммы TChart: propertyOnGetAxisLabel : TAxisOnGetLabel; TAxisOnGetLabel = procedure(Sender : TChartAxis; Series : TChartSeries; ValueIndex : LongInt; varLabelText : string) of object; Событие вызывается перед выводом метки на экран. Здесь Series – график, ValueIndex – индекс точки, LabelText – текст метки. Минимальный шаг между метками на оси описывается свойством: propertyIncrement : Double; Чтобы сделать ось видимой, установите в true ее свойство: propertyVisible : Boolean; За прорисовку координатной оси отвечает свойство Axis, в котором описываются характеристики пера, которым прочерчивается ось. propertyAxis : TChartPen; Особенности вывода на экран линий сетки определяются свойством: propertyGrid : TChartPen; Все перечисленные свойства доступны в Инспекторе объектов и на вкладке Axis встроенного редактора диаграммы (рис. 18.8).  Рис. 18.8. Страница настройки координатных осей диаграммы Масштабирование Доброжелательность диаграммы не имеет границ. Она всегда прилагает максимум усилий, дабы обслуживаемый ею график со всеми удобствами и главное целиком поместился в ее рабочей области. Но если график содержит более двух-трех десятков точек, то результат их «утрамбовки» в границах сравнительно небольшого окна выглядит как нагромождение отсчетов, в котором без лупы не разобраться. Для разрешения этой проблемы компонент TChart предлагает два пути: •Разбиение рабочей области диаграммы на несколько страниц с ограниченным числом точек на каждой странице. •Масштабирование диаграммы. Компонент TChart умеет отображать не только весь график в целом, но и его отдельный участок. Для этого достаточно программным образом настроить уже знакомые нам свойства Minimum и Maximum обеих осей диаграммы. Допустим отсчеты по осям X и Y начинались в точке (0, 0) и заканчивались в (100, 100). Если в рабочей области диаграммы мы хотим увидеть только ее центральную часть, то пишем следующий код: withChart1 do Begin BottomAxis.Automatic := False; BottomAxis.Minimum := 20; BottomAxis.Maximum := 80; LeftAxis.Automatic := False ; LeftAxis.Minimum := 20; LeftAxis.Maximum := 80; end; Практически этот же результат можно получить без единой строки кода. Для того чтобы выбрать прямоугольную область, которую желательно увеличить, пользователю достаточно нажать левую кнопку мыши в левом верхнем углу воображаемого прямоугольника и, удерживая кнопку мыши, выделить весь прямоугольник. Далее диаграмма автоматически настроится на показ увеличиваемой области. Для уменьшения масштаба пользователь выполняет обратные действия: нажимает левую кнопку мыши в правом нижнем углу прямоугольника и, удерживая кнопку мыши, выделяет прямоугольник в обратном направлении. Для того чтобы разрешить диаграмме изменять свой масштаб при помощи описанных выше манипуляций с мышью, нужно присвоить значение true свойству: propertyAllowZoom : Boolean; Другой способ организовать масштабирование состоит в явном указании координат прямоугольной области: procedureZoomRect(constRect : TRect); Например: Chart1.ZoomRect( Rect( 5,5,Chart1.Width-5,Chart1.Height-5 ) ); Простейшим способом масштабирования является указание процента увеличения в свойстве: procedureZoomPercent(constPercentZoom : Double ); Например: Chart1.ZoomPercent( 200 ); { Увеличение на 200% } Если передаваемое значение превышает 100%, масштаб увеличивается, если меньше – уменьшается. Будьте внимательны: за 100% принимается текущее состояние диаграммы. В момент изменения масштаба генерируется событие: propertyOnZoom : TNotifyEvent; Возврат к нормальному режиму увеличения достигается при помощи метода: procedureUndoZoom ; Переход к масштабу по умолчанию сопровождается событием: propertyOnUndoZoom : TNotifyEvent; Процесс изменения масштаба может сопровождаться анимацией, что несколько замедляет ход увеличения (уменьшения) масштаба, но делает диаграмму более привлекательной. Для включения анимации установите в true свойство: propertyAnimatedZoom : Boolean; Включение анимации заставит диаграмму переходить от одного масштаба к другому не моментально, а постепенно, отображая промежуточные состояния. Количество переходных состояний указывается в свойстве: propertyAnimatedZoomSteps : Integer; Многостраничные диаграммы Нередко программист сталкивается с ситуацией, когда все точки графика невозможно физически отобразить на рабочей поверхности диаграммы. В таком случае допускается разбиение диаграммы на несколько страниц. Для этого прежде всего необходимо указать максимальное количество точек, размещаемых на одной странице: propertyMaxPointsPerPage : LongInt; Допустим, что график состоит из 95 точек и свойство MaxPointsPerPage равно 10, тогда последняя страница будет содержать всего 5 точек. Для того чтобы уточнить, как разместятся точки графика на последней странице, воспользуйтесь свойством: propertyScaleLastPage : Boolean; Если свойство установлено в false, точки графика будут равномерно «растянуты» по горизонтальной оси, в противном случае точки будут прижаты к левой границе диаграммы. Об общем количестве страниц, собранных в диаграмме, проинформирует свойство: functionNumPages : Longint; Индивидуальный номер страницы используется для идентификации страницы или для перехода к новой странице: propertyPage : LongInt; Два метода решают задачи перехода на страницу вперед и назад: procedureNextPage; procedurePreviousPage ; О переходе к новой странице нам просигнализирует событие: propertyOnPageChange : TNotifyEvent; Например: procedureTForm1.Chart1PageChange(Sender: TObject); Begin Label1.Caption := Format(‘Страница %d из %d’, [ (Sender as TChart).Page, (Sender as TChart). NumPages]); end; Экспорт диаграмм В классе TChart предусмотрен ряд методов, предназначенных для экспорта текущего изображения диаграммы в графический файл: procedureSaveToBitmapFile(constFileName : string); //рисунок в формате *.bmp procedureSaveToMetafile(constFileName : string); //рисунок в формате *.wmf procedureSaveToMetafileEnh(constFileName : string); //рисунок в формате *.emf Единственный параметр FileName предназначен для указания имени файла, в который будет сохранено изображение. Во время выполнения программы текущие данные могут быть сохранены во временный файл с именем AName: procedureSaveChartToFile(AChart : TCustomChart; constAName : string); Для загрузки данных из временного файла понадобится метод: procedureLoadChartFromFile(varAChart : TCustomChart; constAName : string); Для загрузки файла из сети Интернет по адресу, указанному в параметре URL, воспользуйтесь методом: procedureLoadChartFromURL(varAChart : TCustomChart; constURL : string); Отметим, что в классе TChart подготовлены специальные методы для работы с буфером обмена: procedureCopyToClipboardBitmap; procedureCopyToClipboardMetafile(Enhanced : Boolean); Последний метод осуществляет копирование рабочей области диаграммы в буфер обмена Windows в виде метафайла. Формат метафайла определяется параметром Enhanced: false – формат *.wmf, true – формат *.emf. Для обеспечения доступа к указателю метафайла (с целью работы в Win32 API) потребуется функция: functionTeeCreateMetafile(Enhanced : Boolean; constRect : TRect):TMetafile; Функция создает новый метафайл и возвращает его указатель. Не забудьте уничтожить метафайл по завершении работы с ним. varh : HMetafile; . . . h := Chart1.TeeCreateMetafile; Try .... Finally DeleteObject( h ); end; Печать диаграммы Ориентация страницы печати осуществляется при помощи метода: procedurePrintOrientation(AOrientation : TPrinterOrientation); Может быть назначена портретная или альбомная ориентация. Другие способы: procedurePrintPortrait; // портретная ориентация страницы procedurePrintLandscape; // альбомная ориентация страницы Поля страницы настраиваются при помощи свойства PrintMargins. По умолчанию все поля установлены в значение 15. propertyPrintMargins : TRect; Для отправки на печать всей клиентской части диаграммы вызовите метод: procedurePrint; В момент печати устанавливается в true свойство: propertyPrinting : Boolean; //только для чтения Следующие методы позволят распечатать диаграмму в строго определенном месте на странице: procedurePrintRect(constR : TRect); procedurePrintPartial(constR : TRect); Место печати указывается в прямоугольной структуре R : TRect. Максимальный размер участка для печати составляет: (0, 0, Printer.PageWidth-1, Printer.PageHeight-1). Единственное отличие метода PrintPartial() от PrintRect() состоит в том, что он не вызывает методы принтера BeginDoc (новый документ) и EndDoc (конец документа). При желании можно заставить диаграмму отобразить саму себя на любом объекте, обладающем свойством Canvas. Для этого пригодится метод: procedureDraw(UserCanvas : TCanvas; constUserRect : TRect); Во втором параметре надо установить границы прямоугольника, в пределах которого будет осуществляться прорисовка. varUserRect : TRect; Begin UserRect.Left := 0; UserRect.Right := Printer.PageWidth div 2; UserRect.Top := 0; UserRect.Bottom := Printer.PageHeight div 3; Printer.BeginDoc; Chart1.Draw(Printer.Canvas, UserRect); Printer.EndDoc; end; Для печати в монохромном виде целесообразно установить в true свойство: propertyMonochromePrinting : Boolean; |