If my bottom axis has a different numbr of points to the actual number of series points (as per the yvalues collection) then there is no way to relate the XVal parameter in the OnCursorToolChange event with the actual value plotted?
Meaning this line of code for example is invalid:
label.caption = tchart1.series(0).yavlues.value(xval)
Is there a way around this problem that does not require tons of unnecessary coding?
I tried associating the series with the Cursor tool in the hopes that the ValueIndex would then give me the right index to use in the yvalue collection but I only ever get -1 in the ValueIndex parameter of the OnCursorToolChange event.
Help...
XVal to Yvalues collection (version 7)
-
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
- Contact:
Hi Rossmc,
You can try doing something like this:
or
You can try doing something like this:
Code: Select all
Private Sub TChart1_OnCursorToolChange(ByVal Tool As Long, ByVal X As Long, ByVal Y As Long, ByVal XVal As Double, ByVal YVal As Double, ByVal Series As Long, ByVal ValueIndex As Long)
Dim Index As Integer
Index = TChart1.Series(0).Clicked(X, Y)
If Index <> -1 Then
Label1.Caption = CStr(TChart1.Series(0).YValues.Value(Index))
End If
End Sub
Code: Select all
Private Sub TChart1_OnCursorToolChange(ByVal Tool As Long, ByVal X As Long, ByVal Y As Long, ByVal XVal As Double, ByVal YVal As Double, ByVal Series As Long, ByVal ValueIndex As Long)
Label1.Caption = CStr(TChart1.Axis.Left.CalcPosPoint(Y))
End Sub
Best Regards,
Narcís Calvet / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
RE: XVal to Yvalues collection
Hi Narcis
Unfortunately those solutions don't give me what I really need.
My real problem is I need to know the YValue where the vertical TeeCursor intersects with the Series on the screen.
For your first solution:
> Index = TChart1.Series(0).Clicked(X, Y)
I won't get the right value unless the mouse cursor happens to be at the same point that the teecursor and series line are intersecting. If the Y parameter above could be converted to the Y position where the teecursor and series intersect then I would get the correct value.
The second solution simply gives me the y value on the axis relative to the mouse cursors position which as I said before is not really what I need.
Any other thoughts on this?
Unfortunately those solutions don't give me what I really need.
My real problem is I need to know the YValue where the vertical TeeCursor intersects with the Series on the screen.
For your first solution:
> Index = TChart1.Series(0).Clicked(X, Y)
I won't get the right value unless the mouse cursor happens to be at the same point that the teecursor and series line are intersecting. If the Y parameter above could be converted to the Y position where the teecursor and series intersect then I would get the correct value.
The second solution simply gives me the y value on the axis relative to the mouse cursors position which as I said before is not really what I need.
Any other thoughts on this?
-
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
- Contact:
Hi Rossmc,
Ok, then this can be easily solved by setting the cursor tool to snap:For your first solution:
> Index = TChart1.Series(0).Clicked(X, Y)
I won't get the right value unless the mouse cursor happens to be at the same point that the teecursor and series line are intersecting. If the Y parameter above could be converted to the Y position where the teecursor and series intersect then I would get the correct value.
Code: Select all
TChart1.Tools.Items(0).asTeeCursor.Snap = True
Best Regards,
Narcís Calvet / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
RE: XVal to Yvalues collection
Hi
Sorry, I keep coming back to this. With .Snap = True I now get a correct ValueIndex and at face value this looks like a solution.
The problem is the complexity of my chart. For example, I have a main line, three moving averages (each with a different period) and a further line as an overlay. I want to know the value of every point where the vertical teeCursor intersects them.
If we had something like .IntersectingValue(SeriesIndex) that returned the y-axis value where the teeCursor intersected the line that would be ideal.
Sorry, I keep coming back to this. With .Snap = True I now get a correct ValueIndex and at face value this looks like a solution.
The problem is the complexity of my chart. For example, I have a main line, three moving averages (each with a different period) and a further line as an overlay. I want to know the value of every point where the vertical teeCursor intersects them.
If we had something like .IntersectingValue(SeriesIndex) that returned the y-axis value where the teeCursor intersected the line that would be ideal.
-
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
- Contact:
Hi Rossmc,
Yes, to achieve what you request you can interpolate through each series X value doing something like this:
Yes, to achieve what you request you can interpolate through each series X value doing something like this:
Code: Select all
Private Sub Form_Load()
For i = 0 To TChart1.SeriesCount - 1
TChart1.Series(i).FillSampleValues (i + 1) * 20
Next
End Sub
Function InterpolateLineSeries(ByVal SeriesIndex As Long, FirstIndex As Integer, LastIndex As Integer, XValue As Double) As Double
Dim index As Integer
Dim dx, dy, val As Double
index = FirstIndex
Do While ((TChart1.Series(SeriesIndex).XValues.Value(index) <= XValue) And (index < LastIndex))
index = index + 1
Loop
' safeguard
If (index < 1) Then
index = 1
ElseIf (index >= TChart1.Series(SeriesIndex).Count) Then
index = TChart1.Series(SeriesIndex).Count - 1
End If
' y=(y2-y1)/(x2-x1)*(x-x1)+y1
dx = TChart1.Series(SeriesIndex).XValues.Value(index) - TChart1.Series(SeriesIndex).XValues.Value(index - 1)
dy = TChart1.Series(SeriesIndex).YValues.Value(index) - TChart1.Series(SeriesIndex).YValues.Value(index - 1)
If (dx <> 0) Then
InterpolateLineSeries = dy * (XValue - TChart1.Series(SeriesIndex).XValues.Value(index - 1)) / dx + TChart1.Series(SeriesIndex).YValues.Value(index - 1)
Else
InterpolateLineSeries = 0
End If
End Function
Private Sub TChart1_OnCursorToolChange(ByVal Tool As Long, ByVal X As Long, ByVal Y As Long, ByVal XVal As Double, ByVal YVal As Double, ByVal Series As Long, ByVal ValueIndex As Long)
TChart1.Header.Text.Clear
For i = 0 To TChart1.SeriesCount - 1
TChart1.Header.Text.Add ("Series" + CStr(i) + ": Y(" + CStr(XVal) + ")= " + _
CStr(InterpolateLineSeries(i, TChart1.Series(i).FirstValueIndex, TChart1.Series(i).LastValueIndex, XVal)))
'CStr(InterpolateLineSeries(i, 0, TChart1.Series(i).Count - 1, XVal)))
Next
End Sub
Best Regards,
Narcís Calvet / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |