МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар.

Удаление точек – очистка графика





Для удаления точки с индексом 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.

 

 





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.