Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2015, 13:20   #1
Rhasta-Rhasta
Пользователь
 
Регистрация: 13.09.2015
Сообщений: 16
По умолчанию Вопрос по компоненту Chart (Delphi)

Здравствуйте.
Прошу подсказать, существует ли возможность средствами компонента Chart сделать так, чтобы при наведении курсора на построенную плоскую кривую вблизи курсора всплывало окно с некоторой информацией? Поясню: построен график параметрической функции x=x(t), y=y(t) и наличествует потребность в отображении значения t при наведении курсора на конкретную точку графика.
Спасибо.
Rhasta-Rhasta вне форума Ответить с цитированием
Старый 13.09.2015, 14:58   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да. Я давно когда-то делал показ подсказки при проведении мышки по линии графика.
по памяти что-то типа:
Код:
var vx,vy:integer;
begin
 with Series1 do begin
  GetCursorValues(vx,vy);
  if (vx<0) and (vy<0) then exit;
  Application.Hint:=format('%f - %f',[XScreenToValue[vx],YValueToText[vy]]);
  Application.ActivateHint(Mouse.CursorPos) ;
 end;
end;
В событии OnMouseMove;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2015, 16:35   #3
Rhasta-Rhasta
Пользователь
 
Регистрация: 13.09.2015
Сообщений: 16
По умолчанию

Благодарю, в качестве основы то что надо.
Rhasta-Rhasta вне форума Ответить с цитированием
Старый 14.09.2015, 20:41   #4
Rhasta-Rhasta
Пользователь
 
Регистрация: 13.09.2015
Сообщений: 16
По умолчанию

Может кому будет интересно, вот что получилось: при наведении курсора на график функции ближайшая к нему точка отображается на графике и всплывает подсказка с некоторым комментарием.
Код:
var
MinRange,Range: extended;
vx,vy: double;
i: integer;
begin
  with Chart1 do
  begin
    Series1.Pointer.Visible:=true;  //Series1 будет содержать одну точку, ближайшую к курсору    
    if Series2.Active=true then //series2 содержит отрисованный график функции
    with Series2 do
    begin
      Series1.Clear;
      ShowHint:=false;
      GetCursorValues(vx,vy);
      MinRange:=sqrt(sqr(vx-XValue[0])+sqr(vy-YValue[0]));//задаём начальное минимальное расстояние между курсором и точкой графика
      for i:=1 to Count do
      begin
      	Range:=sqrt(sqr(vx-XValue[i])+sqr(vy-YValue[i]));//текущее расстояние между курсором и точкой на графике
        if Range<min(MaxXValue,MaxYValue)/10 then //если расстояние больше некоторой величины, подсказка не отображается и ближайшая к курсору точка не отрисовывается
        if Range<MinRange then
        begin
          MinRange:=Range;
          Series1.Clear;
          Series1.AddXY(XValue[i],YValue[i]);
          Hint:='MyHint';
          ShowHint:=true;
        end;
      end;
    end
    else ShowHint:=false;
  end;
end;
В событии OnMouseMove;
Попутно всплыл вопрос: почему при обращении к графику Form1.Series1 я могу вызвать опцию Pointer, а при обращении типа Form1.Chart1.Series[0] не могу?

Последний раз редактировалось Rhasta-Rhasta; 14.09.2015 в 20:58.
Rhasta-Rhasta вне форума Ответить с цитированием
Старый 16.09.2015, 06:23   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Подозреваю, что Series1 на форме у Вас строго определённого типа, например TLineSeries у которого легко может быть "опция" (как Вы выразились, хотя устоявшийся термин этому - член {класса}) Pointer, а у обощённой коллекции серий, каждый элемент - базового типа (какой-нибудь TCustomSeries), у которого данного члена нет.
Выход - либо использовать то, как Вы сделали, но это придётся привязываться к конкретной серии, что будет неудобно при введении других чартов/серий с такой же логикой (дублировать код придётся), либо же сделать параметризацию (передавать серию сразу нужного типа в самописную процедурку, в которую вышеприведённый код оформить), либо написать каст (приведение типов):
Код:
if Form1.Chart1.Series[0] is TLineSeries then 
  TLineSeries(Form1.Chart1.Series[0]).Pointer.Visible := true;
phomm вне форума Ответить с цитированием
Старый 16.09.2015, 20:42   #6
Rhasta-Rhasta
Пользователь
 
Регистрация: 13.09.2015
Сообщений: 16
По умолчанию

Спасибо за пояснение
Rhasta-Rhasta вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по компоненту SaveDialog FleXik Общие вопросы Delphi 2 02.11.2012 21:58
вопрос по компоненту TChart 155hatws Помощь студентам 1 03.12.2011 12:26
по компоненту Chart Smerch66 Общие вопросы Delphi 2 21.04.2010 08:11
(проблема с курсовиком)Вопрос по компоненту Chart irk-daredevil Помощь студентам 0 18.12.2009 09:27
Вопрос по компоненту StringGrid Vla9240 Помощь студентам 2 14.05.2009 22:36