问题根源在于下面这一句:
MSChart1.ChartData = MyData '数据获取
这里把二维数组MyData赋给MSChart1.ChartData,而数组MyData是一个固定大小(0~5000,0~1)的数组,在Timer1中,这个数组的前面部分(第一个下标为0~i,0~1)被赋予了值:
MyData(i, 0) = MyData_x(i) 'x轴数据,时间
MyData(i, 1) = MyData_y(i) 'y轴数据,函数值
而后面部分(第一个下标为i+1~5000,0~1)未被赋值,故仍为0,也就是说,后面的点实际上就是原点,这就是导致所画线条总是与坐标原点相连的原因。
那么怎么改进呢?在执行下句:
MSChart1.ChartData = MyData
之前, MyData里的数据只能包含前面0~i个点的数据,而不能是所有5000个点!这就要用到动态数组。但如果直接把MyData定义为二维动态数组,而它的第一维是可变的,但第二维是不变的,不能使用Preserve保留字保存已有数据(只有最后一维是可变时才可使用Preserve保留字)!
把两个下标交换位置,不行!不符合MSChart1.ChartData 对数据的要求!
只好另外定义一个二维动态数组MyData2,在Timer1_Timer事件中动态定义,并把MyData中的前面的数据复制到MyData2中,再把MyData2赋给MSChart1.ChartData 。
*** 作如下:
(1)在窗体的通用段中增加如下定义:
Dim MyData2() As Integer
(2)略加修改Timer1_Timer事件代码如下:
Private Sub Timer1_Timer()
Dim m
ReDim MyData2(i, 1)
MyData_x(i) = i '时间作为x轴
MyData_y(i) = 500 * Sin(i / 10) + 1000 '时间的正弦函数值
MyData(i, 0) = MyData_x(i) 'x轴数据,时间
MyData(i, 1) = MyData_y(i) 'y轴数据,函数值
If x_max >= 10000 Then x_max = 10000
If y_max >= 10000 Then y_max = 10000
If MyData(i, 0) >= x_max Then x_max = x_max * 2 '防止数据溢出
If MyData(i, 1) >= y_max Then y_max = y_max * 2
For m = 0 To i
MyData2(m, 0) = MyData(m, 0)
MyData2(m, 1) = MyData(m, 1)
Next
MSChart1.ChartData = MyData2 '数据获取
i = i + 1
End Sub
其他代码均不变。运行程序,大功告成!
你是说从Y的刻度上加入与X平行的刻度线?你可以修改Y轴的Interval属性达到效果,就是Y轴刻度的大小。
另外你还可以加入两个Serial在当前的ChartArea,就用你画折线的办法画两条直线,不是很难。备注的话很简单,当你在每个Serial中加入Point的时候,可以指定他的Label。
可以的,你可以找出数据库中折线各个点的X的最大值,你画直线的时候加一个X更大的点就行了
就是说X轴是时间格式的,数据例如有4个,1号,5号,25号,30号
你不想让X轴上还有另外的2号等等没用的刻度是吗?
简单,在Point加入之前,就把X值转化为string,当然你一定要先记得排序一下
1、菜单中的工程-部件-添加"Microsoft ADO Data Control 6.0 (OLEDB)"和"Microsoft Chart Control 6.0 (OLEDB)"
2、在窗体中添加ADODC和MSChart并设置ADODC的数据源连接(查询或表)和MSChart的图表类型(直方图、饼图等)和DataSource属性为Adodc1
3、剩下的用语句对应好就差不多了。
补充:Visual Basic是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)