Page 1 of 1

[CLOSED] arrows and text at the top of a chart

Posted: Tue Apr 09, 2013 9:10 am
by 16665441
TeeChart Pro v20120.0.9.120901
windows 8

is it possible to draw arrows with text at the top of the chart (see attachment)
the arrows en text must scroll horizontaly with chart
arrows should not scroll vertically if the chart scroll verticallypoints in the chart are drawn in real time, a point every 30 seconds
Is it possible to delete the first "POINTER" each part of "scline" (see attachment °
thks

Re: arrows and text at the top of a chart

Posted: Tue Apr 09, 2013 3:14 pm
by yeray
Hi,

Let me start from the second part:
jika wrote:Is it possible to delete the first "POINTER" each part of "scline" (see attachment °
This can be achieved using the OnGetPointerStyle. Of course you have to know the index of both the SeriesIndex and the ValueIndex to hide, or how to calculate them:

Code: Select all

Private Sub Form_Load()
  TChart1.Aspect.View3D = False

  TChart1.AddSeries scLine
  TChart1.Series(0).FillSampleValues 10
  TChart1.Series(0).asLine.Pointer.Visible = True
  TChart1.Series(0).SetNull 5
End Sub

Private Sub TChart1_OnGetSeriesPointerStyle(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, AStyle As TeeChart.EPointerStyle)
  If SeriesIndex = 0 Then
    If ValueIndex = 0 Or ValueIndex = 6 Then
      AStyle = psNothing
    Else
      AStyle = psDownTriangle
    End If
  End If
End Sub
jika wrote:is it possible to draw arrows with text at the top of the chart (see attachment)
the arrows en text must scroll horizontaly with chart
arrows should not scroll vertically if the chart scroll vertically
points in the chart are drawn in real time, a point every 30 seconds
This is a bit more tricky. I'd draw both the arrows and the texts manually. Here it is an example:

Code: Select all

Private Sub Form_Load()
  TChart1.Aspect.View3D = False
  TChart1.Header.Visible = False
  TChart1.Walls.Visible = False

  TChart1.AddSeries scLine
  TChart1.Series(0).FillSampleValues 25
  TChart1.Series(0).asLine.Pointer.Visible = True
  
  Dim i As Integer
  For i = 0 To TChart1.Series(0).Count - 1
    If (i Mod 8 = 0) Then
      TChart1.Series(0).SetNull i
    End If
  Next i
End Sub

Private Sub TChart1_OnGetSeriesPointerStyle(ByVal SeriesIndex As Long, ByVal valueIndex As Long, AStyle As TeeChart.EPointerStyle)
  If SeriesIndex = 0 Then
    If ((valueIndex - 1) Mod 8 = 0) Then
      AStyle = psNothing
    Else
      AStyle = psDownTriangle
    End If
  End If
End Sub

Private Sub TChart1_OnAfterDraw()
  Dim valueIndex As Integer
  Dim startXPos, YPos As Integer
  Dim textXPos As Integer
  Dim textString As String
  
  YPos = TChart1.GetChartRect.Top
  With TChart1.Series(0)
    valueIndex = .FirstValueIndex
    startXPos = -1
    Do While valueIndex <= .LastValueIndex
      If valueIndex > 0 And .IsNull(valueIndex - 1) Then
        startXPos = .CalcXPos(valueIndex)
        TChart1.Canvas.Pen.Color = .Color
        TChart1.Canvas.Pen.Width = 2
        TChart1.Canvas.DrawLine startXPos, YPos, startXPos + 5, YPos - 5
        TChart1.Canvas.DrawLine startXPos, YPos, startXPos + 5, YPos + 5
      End If
      
      If valueIndex < .Count - 1 And .IsNull(valueIndex + 1) Then
        TChart1.Canvas.Pen.Color = .Color
        TChart1.Canvas.Pen.Width = 2
        If startXPos = -1 Then
          TChart1.Canvas.DrawLine TChart1.GetChartRect.Left, YPos, .CalcXPos(valueIndex), YPos
          TChart1.Canvas.DrawLine .CalcXPos(valueIndex), YPos, .CalcXPos(valueIndex) - 5, YPos - 5
          TChart1.Canvas.DrawLine .CalcXPos(valueIndex), YPos, .CalcXPos(valueIndex) - 5, YPos + 5
          
          textString = "Some text"
          textXPos = (TChart1.GetChartRect.Left + (.CalcXPos(valueIndex) - TChart1.GetChartRect.Left) / 2) - TChart1.Canvas.TextWidth(textString) / 2
          TChart1.Canvas.TextOut textXPos, YPos - 15, textString
        Else
          TChart1.Canvas.DrawLine startXPos, YPos, .CalcXPos(valueIndex), YPos
          TChart1.Canvas.DrawLine .CalcXPos(valueIndex), YPos, .CalcXPos(valueIndex) - 5, YPos - 5
          TChart1.Canvas.DrawLine .CalcXPos(valueIndex), YPos, .CalcXPos(valueIndex) - 5, YPos + 5
          
          textString = "Some text"
          textXPos = (startXPos + (.CalcXPos(valueIndex) - startXPos) / 2) - TChart1.Canvas.TextWidth(textString) / 2
          TChart1.Canvas.TextOut textXPos, YPos - 15, textString
        End If
        startXPos = -1
      Else
        If valueIndex = .LastValueIndex Then
          If startXPos > -1 Then
            TChart1.Canvas.DrawLine startXPos, YPos, TChart1.GetChartRect.Right, YPos
            
            textString = "Some text"
            textXPos = (startXPos + (TChart1.GetChartRect.Right - startXPos) / 2) - TChart1.Canvas.TextWidth(textString) / 2
            TChart1.Canvas.TextOut textXPos, YPos - 15, textString
          End If
        End If
      End If
      valueIndex = valueIndex + 1
    Loop
  End With
End Sub