Удаление точек – очистка графика Для удаления точки с индексом ValueIndex из набора вызовите процедуру: procedureDelete(ValueIndex : Longint); Для полной очистки содержимого графика используйте метод: procedureClear; В момент удаления всех значений вызывается событие: propertyOnClearValues : TSeriesOnClear; TSeriesOnClear = procedure(Sender: TChartSeries) of object; Оформление графика Внешний вид графика в первую очередь определяется его классом и устанавливается еще на этапе его создания (см. рис. 18.3). В этом же подразделе мы говорим только о дополнительных возможностях по настройке внешнего вида отдельного графика. У программистов наибольшей популярностью пользуется свойство, определяющее цвет графика: propertySeriesColor : TColor; Например: LineSeries1.SeriesColor := clRed; AreaSeries2.SeriesColor := clYellow; Надо отметить, что диаграмма TChart умеет самостоятельно назначать новый цвет для каждого вновь создаваемого в ней графика. Но запас идей у диаграммы не слишком велик: он ограничен 16-ю цветовыми вариантами. Поэтому начиная с 17-го графика цвета начнут повторяться. Если немного потрудиться, то вполне реально определить индивидуальную окраску для каждой точки одного и того же графика (вспомните метод Add(), последний параметр которого определяет цвет точки). Но при этом надо помнить, что эксклюзивный подбор цвета для точки возможен только в случае, если в false установлено свойство: propertyColorEachPoint : Boolean; Если же это свойство хранит значение true, то все точки графика будут окрашены в один цвет. В качестве источника цвета способны выступать данные из поля таблицыили запроса к базе данных (формат поля должен соответствовать макросу RGB()). Имя источника передается в свойство: propertyColorSource : string; Весьма полезный метод позволит изменить цвет отдельных точек графика по признаку вхождения этих точек в диапазон: procedureColorRange(AValueList : TChartValueList; constFromValue, ToValue : Double; AColor : TColor); В первом параметре AValueList указывается список анализируемых значений, в параметрах FromValue и ToValue устанавливается диапазон значений, последний параметр AColor определяет цвет. LineSeries1.ColorRange(LineSeries1.YValues, 100, LineSeries1.MaxYValue, clYellow); В заключение стоит упомянуть о возможности перевода графика в монохромный режим. Это свойство пригодится при просмотре задания, отправляемого на черно-белый принтер. propertyMonochrome : Boolean; Взаимодействие с мышью График – это не только цветная картинка, призванная развлекать вашего шефа при подведении итогов работы компании за квартал. При должной сноровке график превращается в объект, способный общаться с пользователем. Представьте ситуацию, когда строгий босс вопрошает: «А почему объемы продаж нафталина сократились на 50%?» и щелкает кнопкой мыши по провальной точке графика. А программа ему в ответ: виноват завмагом Сидоров. Вот радость! Завмаг лишен премии, моль сыта, шеф доволен, а программист на всякий случай уволен! А все это произошло благодаря тому, что график умеет реагировать на воздействие мышки. Для этого в нем инкапсулированы функции, позволяющие идентифицировать точку графика, над которой находится курсор. В подтверждение сказанного рассмотрим небольшой пример. При полной инсталляции Delphi на компьютер устанавливаются таблицы демонстрационной базы данных «DBDEMOS». Нас интересует таблица Country, в которой содержатся данные о Северной и Южной Америках, их столицах и количестве населения. Давайте попробуем построить диаграмму с графиком, отражающим зависимость: страна и ее население. Начните новый проект, разместите на его главной форме диаграмму Chart1 и компонент доступа к данным Query1 (страница BDE). С этого момента конструктор формы нам больше не потребуется. Переходим в редактор кода и объявляем глобальную переменную BarSeries. В ней будет храниться экземпляр будущего графика. Var Form1: TForm1; BarSeries : TBarSeries; Implementation Ниже представлен исходный код, вызываемый при создании формы. Единственная сложность – незнакомый компонент Query1. Пока вам достаточно знать, что элемент Query1 : TQuery называется запросом. Такое имя компонент заслужил благодаря умению получать данные из таблиц, для чего он отправляет к базе данных запрос на языке SQL (Structured Query Language). procedureTForm1.FormCreate(Sender: TObject); Begin Chart1.AllowZoom:=False; //отключаем увеличение BarSeries :=TBarSeries.Create(Chart1); //создаем график BarSeries.ParentChart:=Chart1; //передаем график во владение диаграмме withQuery1 do Begin DatabaseName:='DBDemos'; //указываем псевдоним базы данных {готовим текст запроса к таблице Country} SQL.Clear; SQL.Add('Select * from country order by name'); Open; //отправляем запрос whileEof<>True do{цикл перебора всех записей в таблице} Begin {вставляем новое значение в график} BarSeries.AddY(FieldByName('Population'). AsFloat, FieldByName('Name').AsString); Next; //переход к следующей записи end; Close; //завершаем работу с таблицей end; end; Прокомментирую ключевые эпизоды события OnCreate(). В момент рождения формы создается экземпляр графика, а ссылка на него заносится в переменную BarSeries. Затем мы готовим текст запроса к таблице Country. Если перевести строку запроса 'Select * from country order by name' с пока непонятного языка SQL на человеческий, то получится примерно следующее: «Выбратьвсе записи из таблицы country и упорядочить их по названиям стран». Получив запрашиваемые данные, перебираем все строки результирующего набора внутри цикла while..doи для каждой записи создаем соответствующую точку на графике. В точку вносятся данные о населении (поле Population) и названии страны (поле Name). Специально акцентирую внимание на том, что название страны мы внесли в подпись точки по горизонтальной оси (свойство XLabel); эти данные пригодятся позже. Запустите приложение на выполнение; появится график с обещанными данными. Прежде чем перейти ко второй части примера, сообщу, что преобразование координат курсора в порядковый индекс точки графика обеспечит функция: functionGetCursorValueIndex : LongInt; Если метод возвращает –1, то это означает, что позиция курсора не совпадает с точкой графика. Следующий этап работы посвятим вопросу взаимодействия графика и мыши. Для этого нам потребуется событие OnMouseDown() диаграммы Chart1. procedureTForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); varIndex:integer; Capital : String; Begin Index:=BarSeries.GetCursorValueIndex; {над какой точкой графика расположен курсор} ifIndex>-1 then withQuery1 do Begin SQL.Clear; {готовим новый запрос} SQL.Add('Select Capital from country where Name ="'+BarSeries.XLabel[Index]+'"'); Open; //отправляем запрос Capital:=FieldByName('Capital').AsString; //сохраняем результат Close; //закрываем набор данных ShowMessage('Столица страны -'+Capital); {выводим результаты запроса} end; end; Первая строка процедуры посвящена выяснению индекса точки, над которой была нажата кнопка мыши. Если метод GetCursorValueIndex() вернул неотрицательное значение, то формируем очередной запрос к таблице. На этот раз строка SQL: 'Select Capital from country where Name="'+BarSeries.XLabel[Index]+'"' переводится следующим образом: «Найти в таблице столицу страны c на- званием Name». Текст названия мы получим из свойства XLabel точки графика с индексом Index. Результаты запроса помещаются в строковую переменную Capital и выводятся в отдельном сообщении. Вот и все. Взаимодействие с базами данных – профессиональная обязанность диаграммы TDBChart. По сравнению со своим ближайшим родственником TChart этот компонент обладает рядом особенностей, к которым в частности относится свойство: propertyDataSource : TComponent; обеспечивающее прямое взаимодействие с источником данных (компонентами TTable, TQuery, TStoredProc и т. д.). Однако рассмотренный пример обработки данных обычным компонентом TChart весьма актуален и может пригодиться в дальнейшей работе. Познакомимся еще с некоторыми методами, связывающими график и манипулятор-мышь. Индекс элемента графика можно выяснить по его экранным координатам: functionClicked(x, y: Integer) : Longint; Функция требует, чтобы мы передали координаты X и Y, и возвращает индекс описываемого этими точками элемента. Для того чтобы сразу прочитать значения X и Y выбранной точки, понадобится процедура: procedureGetCursorValues(varx , y : Double ); Преобразование экранной координаты X (Y) в хранящееся в точке графика значение осуществляет метод: functionXScreenToValue(ScreenPos : Longint) : Double; //координата X functionYScreenToValue(ScreenPos : Longint) : Double; //координата Y В завершение стоит упомянуть о расширенном описании события OnClick() графика: TSeriesClick = procedure(Sender : TChartSeries; ValueIndex: LongInt; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Событие способно сразу возвратить индекс элемента – параметр ValueIndex. |