Взаимодействие с мышью
График – это не только цветная картинка, призванная развлекать вашего шефа при подведении итогов работы компании за квартал. При должной сноровке график превращается в объект, способный общаться с пользователем. Представьте ситуацию, когда строгий босс вопрошает: «А почему объемы продаж нафталина сократились на 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.
Дата добавления: 2016-03-15; просмотров: 771;