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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2013, 15:30   #1
kraw2
Пользователь
 
Регистрация: 19.02.2008
Сообщений: 24
По умолчанию График по клику на легенде.

Здравствуйте, уважаемые мастера.
Delphi 5. Chart. Имеется n Series c кучей точек с маркировкой цифр. Чтобы посмотреть один график тыкаю мышью по соотвествующей маркировке на легенде - показывается один график, тыкаю еще раз - всё восстанавливается:
Код:
procedure TForm1.Chart1ClickLegend(Sender: TCustomChart;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var i,n,k: integer;
begin
  k:=0;
  for i:=0 to Sender.SeriesCount-1 do
    if Sender.Series[i].Active then k:=k+1;
  if k > 1 then begin
    n:=Sender.Legend.Clicked(X,Y);
    for i:=0 to Sender.SeriesCount-1 do
      if i<>n then
        Sender.Series[i].Active:=False;
  end
  else begin
    for i:=0 to Sender.SeriesCount-1 do
        Sender.Series[i].Active:=True;
  end;
  Sender.Refresh;
end;

procedure TForm1.Chart1GetLegendRect(Sender: TCustomChart;
  var Rect: TRect);
begin
  RectLegend:=Rect;
end;
Работает нормально когда у просматриваемого графика более 1 точки.
Если точка одна, то выдается ошибка Access violation по адресу...
Где нужно подшаманить чтобы гафик показывался и с одной точкой?
Благодарю за внимание.




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Stilet; 06.11.2013 в 15:59.
kraw2 вне форума Ответить с цитированием
Старый 06.11.2013, 16:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А известно на какой строке вылезает AV?
Я в коде криминала не вижу...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.11.2013, 17:35   #3
kraw2
Пользователь
 
Регистрация: 19.02.2008
Сообщений: 24
По умолчанию

После присвоения параметров перерисовки легенды:
RectLegend:=Rect в процедуре Chart1GetLegendRect
kraw2 вне форума Ответить с цитированием
Старый 06.11.2013, 19:48   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а... Так то совсем другое дело
Покаж код. Там нужно проверочки на nil ставить знаичт.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.11.2013, 22:06   #5
kraw2
Пользователь
 
Регистрация: 19.02.2008
Сообщений: 24
По умолчанию

Да нет больше кода, связанного с легендой. Есть вначале код заполнения графиков точками и всё. Если бы где-то, что-то неправильно заполнялось - ошибка была уже на уровне отрисовки графиков. Как раз и вопрос то в том, где еще прописать какую процедуру при отрисовке, чтобы вставить эту проверку на nil?
kraw2 вне форума Ответить с цитированием
Старый 06.11.2013, 22:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну ты всетки покажешь свою легендарную Chart1GetLegendRect, или каг?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.11.2013, 22:36   #7
kraw2
Пользователь
 
Регистрация: 19.02.2008
Сообщений: 24
По умолчанию

Chart1GetLegendRect процедура по событию OnGetLegendRect (см. в коде) предназначена для (перевод из Help):
__________
Случай OnGetLegendRect происходит всякий раз, когда Легенда Диаграммы собирается отображен.
Вы можете использовать этот случай, чтобы заставлять специфическую позицию Легенды и измерений.
Параметр Rect определяет встроенную позицию Легенды и измерений на экранных пикселях.
После чертежа Легенды, доступное пространство Диаграммы будет уменьшено, чтобы не перекрываться с Легендой если Вы не установили TChartLegend.СОБСТВЕННОСТЬ ResizeChart в Ложь.
При использовании этого случая вам понадобится использовать TChart.СЛУЧАЙ OnGetLegendPos также, чтобы поставлять точные координаты для каждого пункта Легенды.
___________
Легенда перерисовывается автоматически по координатам Rect. ResizeChart:=True;
kraw2 вне форума Ответить с цитированием
Старый 06.11.2013, 22:56   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

О-о-ой! туплю... Она же в топе темы... Сорри, сегодня не мой день.
Если этот обработчик события убрать, программа отработает норм?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Затабулировать функцию. график указанной функции и график касательной к ней в точке с абсциссой AntonKalinin01 Помощь студентам 0 26.05.2013 07:18
Редирект по клику zaki HTML и CSS 8 26.01.2013 04:48
Редирект по клику Nekto_33 JavaScript, Ajax 7 01.08.2012 09:43
программно определённой легенде DBCart(Pie) задать значение Simatik Компоненты Delphi 0 25.03.2012 20:04
Расстояние между строками в легенде Drakmour Microsoft Office Excel 4 19.03.2012 00:24