Взаимодействие с мышью

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


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.014 сек.