1 bar color only... again

TeeChart for ActiveX, COM and ASP
Post Reply
BdMan
Newbie
Newbie
Posts: 7
Joined: Wed Sep 01, 2004 4:00 am

1 bar color only... again

Post by BdMan » Mon Dec 18, 2006 2:48 pm

hi, I've tried to colorize only one bar.
Reading the other thread, I've understand that I must user the OnGetSeriesBarStyle . I don't think tha this is the most beautiful thing of the world.. but I can modify my code to work in this way, so, no problem.
But anyway, the snippet in the other post, doesn't work for me.

I've tried to re-build the code. In a form with a tchart control this is the what I've write

Private Sub Form_Load()
T.RemoveAllSeries
T.AddSeries scBar
T.Series(0).Add 7, "sdopf", vbRed
T.Series(0).Add 12, "sdfasdf", vbRed

T.AddSeries scBar
T.Series(1).Add 9, "asdew", vbYellow
T.Series(1).Add 10, "vdfg", vbYellow

End Sub



Private Sub T_OnGetSeriesBarStyle(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, BarStyle As TeeChart.EBarStyle)

If SeriesIndex = 0 Then
If ValueIndex = 0 Then
T.Series(0).asBar.BarBrush.Style = bsCross
Else
T.Series(0).asBar.BarBrush.Style = bsSolid
End If
End If
End Sub

Private Sub T_OnGetSeriesMark(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, MarkText As String)
MarkText = "S" & SeriesIndex & " V" & ValueIndex
End Sub



In this way, I make evidence into the makrs the series index and the value index (I suppose) .
In the example I want to "hide" the first value of the first serie... but...
The bar that vanish is the second! (as make serie =0, value = 1).

What goes wrong? Thanks..


p.s. I've the latest version of tchart (1.0.1.3)

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Post by Narcís » Mon Dec 18, 2006 3:09 pm

Hi BdMan,

In your example, brush has already been set for the first point (ValueIndex=0) and the OnGetSeriesBarStyle event sets the brush style for the next point to be drawn (ValueIndex=1). To achieve what you request you should do this:

Code: Select all

Private Sub Form_Load()
    T.RemoveAllSeries
    T.AddSeries scBar
    T.Series(0).Add 7, "sdopf", vbRed
    T.Series(0).Add 12, "sdfasdf", vbRed
    T.Series(0).asBar.BarBrush.Style = bsCross
    
    T.AddSeries scBar
    T.Series(1).Add 9, "asdew", vbYellow
    T.Series(1).Add 10, "vdfg", vbYellow
End Sub

Private Sub T_OnGetSeriesBarStyle(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, BarStyle As TeeChart.EBarStyle)

    If SeriesIndex = 0 Then
        If ValueIndex = 0 Then
            T.Series(0).asBar.BarBrush.Style = bsSolid
'        Else
'            T.Series(0).asBar.BarBrush.Style = bsSolid
        End If
    End If
End Sub

Private Sub T_OnGetSeriesMark(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, MarkText As String)
    MarkText = "S" & SeriesIndex & " V" & ValueIndex
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
Image Image Image Image Image Image
Instructions - How to post in this forum

BdMan
Newbie
Newbie
Posts: 7
Joined: Wed Sep 01, 2004 4:00 am

Post by BdMan » Mon Dec 18, 2006 3:40 pm

thanks a lot for the quick answer.
but...

in this way, there is something that for me doesn't work.
I've tried the modification and all seems to be fine.
But suppose that I want to modify a "group" of bars, in the example, the first (s0v0, s1v0) want be solid, and the second group (s0v1, s1v1 ) crossed.
I've modified the code of Form_Load

T.RemoveAllSeries
T.AddSeries scBar
T.Series(0).Add 7, "sdopf", vbRed
T.Series(0).Add 12, "sdfasdf", vbRed
T.Series(0).asBar.BarBrush.Style = bsDiagCross

T.AddSeries scBar
T.Series(1).Add 9, "asdew", vbYellow
T.Series(1).Add 10, "vdfg", vbYellow
T.Series(1).asBar.BarBrush.Style = bsDiagCross

and OnGetSeriesBarStyle in this way:
If ValueIndex = 1 Then
T.Series(SeriesIndex).asBar.BarBrush.Style = bsSolid
End If

The problem is that now, all bars will be crossed... not only the second.
And more.. if I make a call to tchart1.repaint, both will be solid (for what strange reason, I don't know....)

Thaks again!



narcis wrote:Hi BdMan,

In your example, brush has already been set for the first point (ValueIndex=0) and the OnGetSeriesBarStyle event sets the brush style for the next point to be drawn (ValueIndex=1). To achieve what you request you should do this:

Code: Select all

Private Sub Form_Load()
    T.RemoveAllSeries
    T.AddSeries scBar
    T.Series(0).Add 7, "sdopf", vbRed
    T.Series(0).Add 12, "sdfasdf", vbRed
    T.Series(0).asBar.BarBrush.Style = bsCross
    
    T.AddSeries scBar
    T.Series(1).Add 9, "asdew", vbYellow
    T.Series(1).Add 10, "vdfg", vbYellow
End Sub

Private Sub T_OnGetSeriesBarStyle(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, BarStyle As TeeChart.EBarStyle)

    If SeriesIndex = 0 Then
        If ValueIndex = 0 Then
            T.Series(0).asBar.BarBrush.Style = bsSolid
'        Else
'            T.Series(0).asBar.BarBrush.Style = bsSolid
        End If
    End If
End Sub

Private Sub T_OnGetSeriesMark(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, MarkText As String)
    MarkText = "S" & SeriesIndex & " V" & ValueIndex
End Sub

Pep
Site Admin
Site Admin
Posts: 3295
Joined: Fri Nov 14, 2003 5:00 am
Contact:

Post by Pep » Wed Dec 27, 2006 11:17 am

Hi,

in that case, you can do :

Code: Select all

Private Sub Form_Load()
T.RemoveAllSeries
T.AddSeries scBar
T.Series(0).Add 7, "sdopf", vbRed
T.Series(0).Add 12, "sdfasdf", vbRed
'T.Series(0).asBar.BarBrush.Style = bsDiagCross

T.AddSeries scBar
T.Series(1).Add 9, "asdew", vbYellow
T.Series(1).Add 10, "vdfg", vbYellow
'T.Series(1).asBar.BarBrush.Style = bsDiagCross
End Sub

Private Sub T_OnGetSeriesBarStyle(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, BarStyle As TeeChart.EBarStyle)
If ValueIndex = 1 Then
T.Series(SeriesIndex).asBar.BarBrush.Style = bsSolid
Else
T.Series(SeriesIndex).asBar.BarBrush.Style = bsDiagCross
End If
End Sub

BdMan
Newbie
Newbie
Posts: 7
Joined: Wed Sep 01, 2004 4:00 am

ahi ahi....

Post by BdMan » Tue Jan 09, 2007 7:58 pm

excuseme... i'm know that i'm boring...
but it doesn't work in the way that i want.

I would like maker something like the above code... I would have an array of bars that must be "crossed". This array must be dynamic.
In this array I set the bars (serie and index) to disable.
I could even set (if it possible) the "crossed" in the creation of chart (initSeries), but I don't understand how!!!
(emh.. for explanation, I put the marks explained as series/index, and in the array I put the positions that i want to "cross")

Please, if someone could help me.. this thing make me crazy... and more seriously, my work is stop!!!!!!!
(but why, simply, TChart1_OnGetSeriesBarStyle could not works "before" draw the style ?????????)

thank thanks a lot!

p.s. put a chart (tchart1) in a form to reproduce the code

Option Explicit

Private Type tp_todisable
serie As Long
value As Long
End Type
Private arrToDisable() As tp_todisable





Private Sub initSeries()
TChart1.RemoveAllSeries

Dim lngSerie
Dim lngC As Long

lngSerie = TChart1.AddSeries(scBar)
TChart1.Series(lngSerie).Color = vbRed
TChart1.Series(lngSerie).Title = "Ita"
TChart1.Series(lngSerie).Add Rnd(100), "2001 M", vbRed
TChart1.Series(lngSerie).Add Rnd(100), "2002 M", vbRed
TChart1.Series(lngSerie).Add Rnd(100), "2001 F", vbRed
TChart1.Series(lngSerie).Add Rnd(100), "2002 F", vbRed
' TChart1.Series(lngSerie).asBar.BarBrush.Style = bsBackDiagSmall
TChart1.Series(lngSerie).Marks.Style = smsValue


lngSerie = TChart1.AddSeries(scBar)
TChart1.Series(lngSerie).Color = vbGreen
TChart1.Series(lngSerie).Title = "Ue"
TChart1.Series(lngSerie).Add Rnd(100), "2001 M", vbGreen
TChart1.Series(lngSerie).Add Rnd(100), "2002 M", vbGreen
TChart1.Series(lngSerie).Add Rnd(100), "2001 F", vbGreen
TChart1.Series(lngSerie).Add Rnd(100), "2002 F", vbGreen
' TChart1.Series(lngSerie).asBar.BarBrush.Style = bsBackDiagSmall
TChart1.Series(lngSerie).Marks.Style = smsValue


lngSerie = TChart1.AddSeries(scBar)
TChart1.Series(lngSerie).Color = vbYellow
TChart1.Series(lngSerie).Title = "xUe"
TChart1.Series(lngSerie).Add Rnd(100), "2001 M", vbYellow
TChart1.Series(lngSerie).Add Rnd(100), "2002 M", vbYellow
TChart1.Series(lngSerie).Add Rnd(100), "2001 F", vbYellow
TChart1.Series(lngSerie).Add Rnd(100), "2002 F", vbYellow
' TChart1.Series(lngSerie).asBar.BarBrush.Style = bsBackDiagSmall
TChart1.Series(lngSerie).Marks.Style = smsValue
End Sub
Private Sub disableSeriesBar()
Dim intC As Integer

intC = 0
ReDim arrToDisable(0 To 0)


intC = intC + 1
ReDim Preserve arrToDisable(0 To intC)
arrToDisable(intC).serie = 0
arrToDisable(intC).value = 1


intC = intC + 1
ReDim Preserve arrToDisable(0 To intC)
arrToDisable(intC).serie = 1
arrToDisable(intC).value = 0


intC = intC + 1
ReDim Preserve arrToDisable(0 To intC)
arrToDisable(intC).serie = 2
arrToDisable(intC).value = 0

End Sub

Private Sub Form_Load()
'init chart
TChart1.Aspect.View3D = False

'init series and their values
initSeries

'init the bars to disbale (with bsBackDiagSmall as "color")
disableSeriesBar

End Sub








Private Sub TChart1_OnGetSeriesBarStyle(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, BarStyle As TeeChart.EBarStyle)

Dim i As Long
Dim bFound As Boolean

Dim lngSerie2Check As Long
Dim lngValueIndex2Check As Long


'00 -- set the series&valuesindex to compare: rember that
' the changes made in OnGetSeriesBarStyle envolve the next bar!!
If ValueIndex = TChart1.Series(SeriesIndex).Count - 1 Then
lngSerie2Check = SeriesIndex + 1
lngValueIndex2Check = 0
Else
lngSerie2Check = SeriesIndex
lngValueIndex2Check = ValueIndex + 1
End If

'00 -- search if the values of serie/value found are in array of bars
' to disabling
bFound = False
For i = 0 To UBound(arrToDisable)
If (arrToDisable(i).serie = lngSerie2Check) And _
(arrToDisable(i).value = lngValueIndex2Check) Then
bFound = True
Exit For
End If
Next i


'01 -- set the style according to the bFound
If bFound Then
Debug.Print "set for next of " & SeriesIndex & "/" & ValueIndex & ": (" & _
lngValueIndex2Check & "/" & lngValueIndex2Check & ") diagonal"
TChart1.Series(SeriesIndex).asBar.BarBrush.Style = bsBackDiagSmall
Else
Debug.Print "set for next of " & SeriesIndex & "/" & ValueIndex & ": (" & _
lngValueIndex2Check & "/" & lngValueIndex2Check & ") solid "
TChart1.Series(SeriesIndex).asBar.BarBrush.Style = bsSolid
End If



End Sub

Private Sub TChart1_OnGetSeriesMark(ByVal SeriesIndex As Long, ByVal ValueIndex As Long, MarkText As String)
'only to explain series and valueindx
MarkText = "[" & SeriesIndex & "/" & ValueIndex & "]"
End Sub

Pep
Site Admin
Site Admin
Posts: 3295
Joined: Fri Nov 14, 2003 5:00 am
Contact:

Post by Pep » Tue Jan 16, 2007 1:40 am

Hi,

I'm able to see the problem here. We're investigating which could be the problem and trying to find a possible workaround. I'll back with resulls as soon as possible.

BdMan
Newbie
Newbie
Posts: 7
Joined: Wed Sep 01, 2004 4:00 am

thanks

Post by BdMan » Mon Jan 22, 2007 8:56 am

First of all, thank for support.
And after.. there are some news?? The problem grows evryday, for me :0)

Pep
Site Admin
Site Admin
Posts: 3295
Joined: Fri Nov 14, 2003 5:00 am
Contact:

Post by Pep » Tue Jan 30, 2007 5:15 pm

Hi,

sorry for delay !

we've been investigating about this problem, and the results are that different brushes for the same Series is not yet supported through the OnGetSeriesBarStyle, for the moment only different colors can be assigned.

But there's another way to accomplish it. It's by drawing manually the Bars (using the OnAfterDraw event). Please check the following code :

Code: Select all

Private Sub TChart1_OnAfterDraw()

Dim SeriesIndex
Dim ValueIndex
Dim barWidth
Dim bFound
Dim left, top, right, bottom
Dim lngSerie2Check As Long
Dim lngValueIndex2Check As Long
Dim i As Long
    
For SeriesIndex = 0 To TChart1.SeriesCount - 1
  For ValueIndex = 0 To TChart1.Series(SeriesIndex).Count - 1

   '00 -- set the series&valuesindex to compare: rember that
    ' the changes made in OnGetSeriesBarStyle envolve the next bar!!
    If ValueIndex = TChart1.Series(SeriesIndex).Count - 1 Then
        lngSerie2Check = SeriesIndex + 1
        lngValueIndex2Check = 0
    Else
        lngSerie2Check = SeriesIndex
        lngValueIndex2Check = ValueIndex + 1
    End If
        
    '00 -- search if the values of serie/value found are in array of bars
    ' to disabling
      
    bFound = False
        
    For i = 0 To UBound(arrToDisable)
        If (arrToDisable(i).serie = lngSerie2Check) And _
          (arrToDisable(i).value = lngValueIndex2Check) Then
          bFound = True
          Exit For
        End If
    Next i
    
    barWidth = TChart1.Series(SeriesIndex).asBar.barWidth
    
    With TChart1.Canvas
      If bFound Then
         left = TChart1.Series(SeriesIndex).CalcXPos(ValueIndex)
         top = TChart1.Series(SeriesIndex).CalcYPos(ValueIndex)
         right = TChart1.Series(SeriesIndex).CalcXPos(ValueIndex) + (barWidth + 1)
         bottom = TChart1.Axis.bottom.Position
        .Brush.Style = bsBackDiagSmall
        .BackColor = TChart1.Series(SeriesIndex).PointColor(ValueIndex)
        .Rectangle left, top, right, bottom
      Else
        .Brush.Style = bsSolid
        
      End If
    End With

  Next ValueIndex
Next SeriesIndex

End Sub

Post Reply