D7: Tchart -> извлечение внесенных значений
Добавлено: 15 сен 2004, 08:57
Приветствую всех.
Требуется помощь воевавших с TChart.
Описываю кусок того что сделал: В программе имеется график на который выводятся значения методом AddXY так что ось X имеет форматирование по времени.
with Chart1.BottomAxis do begin
Series1.XValues.DateTime := True ;
Increment := DateTimeStep[ dtOneSecond ];
DateTimeFormat :='n:ss' ;
ExactDateTime := True ;
end ;
Я добавляю отсчеты, скажем, раз в секунду.
Series1.AddXY ( Series1.XValues.Last + TimeStep, Value ) ;
( где TimeStep cоответствует dtOneSecond )
Далее делаю подобие вертикального курсора, (CursorSeries : TShapeSeries) который в OnClick TChart'а устанавливаю в мышеуказанное место ( на всю высоту ) :
Series1.GetCursorValues(x,y); //*
DecodeTime ( X,H,M,Sec,MSec ) ; // неоптимально для наглядности
MSec := 0 ; //**
X := EncodeTime ( H,M,Sec,MSec ) ;
CursorSeries1.X0 := X ;
CursorSeries1.X1 := X ;
CursorSeries1.Y0 := Min(Series1.MinYValue, Chart1.LeftAxis.Minimum );
CursorSeries1.Y1 := Max(Series1.MaxYValue, Chart1.LeftAxis.Maximum );
До сих пор все работает как надо и проблем не вызывает.
Теперь проблема: надо считать значение из графика в месте расположения курсора.
Мои потуги: координата "X" получена в (//*), далее округляю до шага внесения значений в серию (//**), чтобы уж точно брать значения которые заносил (без округления - совсем туго).
Далее вычисляю номер отсчета по данной X коррдинате:
Index := Series1.XValues.Locate(X) ;
ну и собственно из Series1.YValue[Index] получаю искомое значение.
Но все не так гладко... Locate(X) хорошо работет если в серии десяток точек (вообще!, а не видимых);
Если точек больше - почти всегда возвращается -1. Даже округление до шага занесения (//**) не помогает.
Главная особенность - расстояние по оси X - в еденицах времени!!!(с целочисленным отсчетами - все идеально, но оно не актуально).
В TChart имеется несколько методов, которые позволяют пойти через преобразование в экранные пикселы, но сей путь мне видится не самым корректным...ибо идеологически - тормозной.
Вопрос1: где ошибка - у меня или в TChart?
Вопрос2: есть ли какое отъезженное решение, не связанное с поиском в серии или ведением дублирующего списка пар X-Y. (X - всегда однозначно)? Хотя бы для фиксированного шага по оси X.
Заранее премногоблагодарствую.
Требуется помощь воевавших с TChart.
Описываю кусок того что сделал: В программе имеется график на который выводятся значения методом AddXY так что ось X имеет форматирование по времени.
with Chart1.BottomAxis do begin
Series1.XValues.DateTime := True ;
Increment := DateTimeStep[ dtOneSecond ];
DateTimeFormat :='n:ss' ;
ExactDateTime := True ;
end ;
Я добавляю отсчеты, скажем, раз в секунду.
Series1.AddXY ( Series1.XValues.Last + TimeStep, Value ) ;
( где TimeStep cоответствует dtOneSecond )
Далее делаю подобие вертикального курсора, (CursorSeries : TShapeSeries) который в OnClick TChart'а устанавливаю в мышеуказанное место ( на всю высоту ) :
Series1.GetCursorValues(x,y); //*
DecodeTime ( X,H,M,Sec,MSec ) ; // неоптимально для наглядности
MSec := 0 ; //**
X := EncodeTime ( H,M,Sec,MSec ) ;
CursorSeries1.X0 := X ;
CursorSeries1.X1 := X ;
CursorSeries1.Y0 := Min(Series1.MinYValue, Chart1.LeftAxis.Minimum );
CursorSeries1.Y1 := Max(Series1.MaxYValue, Chart1.LeftAxis.Maximum );
До сих пор все работает как надо и проблем не вызывает.
Теперь проблема: надо считать значение из графика в месте расположения курсора.
Мои потуги: координата "X" получена в (//*), далее округляю до шага внесения значений в серию (//**), чтобы уж точно брать значения которые заносил (без округления - совсем туго).
Далее вычисляю номер отсчета по данной X коррдинате:
Index := Series1.XValues.Locate(X) ;
ну и собственно из Series1.YValue[Index] получаю искомое значение.
Но все не так гладко... Locate(X) хорошо работет если в серии десяток точек (вообще!, а не видимых);
Если точек больше - почти всегда возвращается -1. Даже округление до шага занесения (//**) не помогает.
Главная особенность - расстояние по оси X - в еденицах времени!!!(с целочисленным отсчетами - все идеально, но оно не актуально).
В TChart имеется несколько методов, которые позволяют пойти через преобразование в экранные пикселы, но сей путь мне видится не самым корректным...ибо идеологически - тормозной.
Вопрос1: где ошибка - у меня или в TChart?
Вопрос2: есть ли какое отъезженное решение, не связанное с поиском в серии или ведением дублирующего списка пар X-Y. (X - всегда однозначно)? Хотя бы для фиксированного шага по оси X.
Заранее премногоблагодарствую.