'資料庫與統計圖表之應用
'利用圖表物件編修自製堆疊圖表
'利用 Line (x1,y1)-(x2,y2),color,bf可繪出實心填滿色彩之矩形
'利用 Shape控制項亦可繪製實心填滿色彩之矩形
'讀入資料->計算相對長度->推算座標->繪製



Private Sub Combo1_Click()
Set MC = myChart
Call ReadData
Select Case Combo1.ListIndex
Case 10
MC.chartType = VtChChartType2dPie
Case 11
MC.chartType = VtChChartType2dXY
Case 12
MC.Visible = False
Call DrawStack
Case Else
MC.chartType = Combo1.ListIndex
End Select
MC.Refresh
End Sub
Private Sub DrawStack()
Set MC = myChart
Set AD = myData
Row = AD.Recordset.Fields.Count '欄位數量,對映圖表的列數(RowCount)
Col = AD.Recordset.RecordCount '記錄筆數,對映圖表的行數(ColumeCount)
MC.RowCount = Row
MC.columnCount = Col
dx = (Shape1.Width - 200) / (Row + 1) '間距=全寬/列數
bar_w = dx \ 5 '圖棒寬
TotBar = Row * Col '圖棒總數
maxvalue = FindMaxValue '找每季累計最大值
h_Unit = (Shape1.Height - 500) / maxvalue '行高基本單位
lastTop = Shape1.Height - 400 '扣除邊框距離
lastLeft = Shape1.Left '預設左邊界
AD.Recordset.MoveFirst
k = 1
For i = 1 To Row
row_x = lastLeft + dx '第i列的x座標
bar_w = dx \ 5 '棒寬
For j = 1 To Col
v = AD.Recordset.Fields(i - 1).Value '取得第0欄資料
bar_h = v * h_Unit
Load bar(k)
bar(k).Left = row_x
bar(k).Top = lastTop - bar_h
bar(k).Width = bar_w
bar(k).Height = bar_h
bar(k).FillStyle = 0
bar(k).FillColor = RGB(j / Col * 255, j / Col * 160, j / Col * 60)
bar(k).Visible = True
k = k + 1
lastTop = lastTop - bar_h '目前棒高暫存
AD.Recordset.MoveNext
Next
Load lblRow(i)
lblRow(i) = AD.Recordset.Fields(i - 1).Name
lblRow(i).Left = row_x - 125
lblRow(i).Top = Line1.Y1 + 100
lblRow(i).Visible = True
lastTop = Shape1.Height - 400
lastLeft = lastLeft + dx
AD.Recordset.MoveFirst
Next
End Sub
Private Function FindMaxValue() As Integer
Set MC = myChart
Set AD = myData
Row = AD.Recordset.Fields.Count '欄位數量,對映圖表的列數(RowCount)
Col = AD.Recordset.RecordCount '記錄筆數,對映圖表的行數(ColumeCount)
Max = 0
Sum = 0
AD.Recordset.MoveFirst
For i = 1 To Row
For j = 1 To Col
v = AD.Recordset.Fields(i - 1).Value
Sum = Sum + v
AD.Recordset.MoveNext
Next
If Sum >= Max Then Max = Sum
AD.Recordset.MoveFirst
Sum = 0
Next
FindMaxValue = Max
End Function
Private Sub Command1_Click()
Set MC = myChart
Call ReadData
MC.Refresh
End Sub
Private Sub Form_Load()
Call initCombo
myChart.chartType = VtChChartType2dCombination
lblRow(0).Visible = False
bar(0).Visible = False
Call ReadData
End Sub
Private Sub ReadData()
Dim Row, Col As Integer
Set MC = myChart
Set AD = myData
Row = AD.Recordset.Fields.Count '欄位數量,對映圖表的列數(RowCount)
Col = AD.Recordset.RecordCount '記錄筆數,對映圖表的行數(ColumeCount)
MC.RowCount = Row
MC.columnCount = Col
AD.Recordset.MoveFirst
For i = 1 To Row
For j = 1 To Col
MC.Row = i
MC.Column = j
MC.Data = AD.Recordset.Fields(i - 1).Value
AD.Recordset.MoveNext
Next
AD.Recordset.MoveFirst
MC.RowLabel = AD.Recordset.Fields(i - 1).Name '取得列名稱(資料欄位名稱)
Next
End Sub
Private Sub initCombo()
Combo1.AddItem "0:3dBar", 0
Combo1.AddItem "1:2dBar", 1
Combo1.AddItem "2:3dLine", 2
Combo1.AddItem "3:2dLine", 3
Combo1.AddItem "4:3dArea", 4
Combo1.AddItem "5:2dArea", 5
Combo1.AddItem "6:2dStep", 6
Combo1.AddItem "7:2dStep", 7
Combo1.AddItem "8:3dCombination", 8
Combo1.AddItem "9:2dCombination", 9
Combo1.AddItem "14:2dPie", 10
Combo1.AddItem "16:2dXY", 11
Combo1.AddItem "18:自製堆疊圖", 12
End Sub