各位大哥大姐帮帮忙,小妹vb制动点基础,能详细解答以下问题吗,谢谢了
一分钟接收一次数据存在access中并显示成曲线,应该怎么做?
坐标系原点定位于左下角picturebox的scale(0,y)-(x,0)中x,y应该怎么选择使所画曲线正确显示在picture中?
在网上搜索好多,但看不明白,直白一点picturemodestyle在画图有什么作用?
用mshflex显示access的数据,每次都会把所有记录都显示出来,我只想显示每次运行程序时的记录,应该怎么做?

解决方案 »

  1.   

    1、建议你在保存输入Access数据库的同时,定义一个大的二维数组,用于保存呢采集的数据信息。
    2、用MSChart控件绘制曲线。
    3、具体代码如下:
    Option Explicit
    '对于二维散点图来说,第一列代表了X轴坐标,第二列代表了Y轴坐标
    '因此在定义二维数据时,第二维定义为0到1,第一维代表了第几点数据,可根据数据点数变化
    '下面以数据点数有21点为列子
    Dim MyData(360, 1) As Variant
    Dim DataT(360, 1) As Variant
    Private Const PI = 3.1415926
    Dim intC As Integer
    Dim dblStep As DoublePrivate Sub Command1_Click()
        Timer1.Enabled = Not Timer1.Enabled
        If Timer1.Enabled Then Command1.Caption = "停止示波器"
        If Not Timer1.Enabled Then Command1.Caption = "启动示波器"
    End SubPrivate Sub Form_Load()
        Dim I As Integer
        dblStep = 8 * PI / 360
        '-----x轴坐标值-----Y轴坐标值----------
        For I = 0 To 360
            MyData(I, 0) = I
            MyData(I, 1) = 149 * Sin(dblStep * I) + 150
        Next I
        For I = 0 To 360
            DataT(I, 0) = I
            DataT(I, 1) = 149 * Cos(dblStep * I) + 150
        Next I
        intC = 1
        '波形图外观设置
        With MSChart1
            .TitleText = "速度 m/min"
            '    '设置图线的外观
            .Plot.SeriesCollection(1).Pen.Width = 40
            .Plot.SeriesCollection(1).Pen.Style = VtPenStyleSolid
            '    '设置XY轴
            .Plot.Axis(VtChAxisIdX).ValueScale.Auto = False
            .Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
            '// 设置最大值
            .Plot.Axis(VtChAxisIdX).ValueScale.Maximum = 360
            .Plot.Axis(VtChAxisIdY).ValueScale.Maximum = 300
            '// 设置最小值
            .Plot.Axis(VtChAxisIdY).ValueScale.Minimum = 0
            .Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0
            '//
            .Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 6 'X轴主要网格数量
            .Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 6 'Y轴主要网格数量
            .Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = 0 'X轴次要网格数量
            .Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 0 'Y轴次要网格数量
    '        .Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleDotted
    '        .Plot.Axis(VtChAxisIdY).AxisGrid.MajorPen.Style = VtPenStyleDotted
            MSChart1.Plot.AutoLayout = False
            MSChart1.Plot.UniformAxis = False
            MSChart1.chartType = VtChChartType2dXY '设置图形为二维散点图
            MSChart1.ChartData = MyData '数据
        End With
    End SubPrivate Sub Timer1_Timer()
        Dim intP As Integer
        For intP = 0 To 359
            MyData(intP, 1) = MyData(intP + 1, 1)
        Next intP
        MyData(360, 1) = 149 * Sin(intC * dblStep) + 150
        intC = (intC + 1) Mod 360
        MSChart1.ChartData = MyData
    End Sub这个只是模拟的而已,仅供借鉴
      

  2.   

    如果是数据已经在Access数据库中了,那更好办了,你把数据库中的内容读出来,赋给MyData数组即可。
      

  3.   

    用mshflex显示access的数据,每次都会把所有记录都显示出来,我只想显示每次运行程序时的记录,应该怎么做?
    如果用picturebox应该怎么做?scale(0,picture1.height)-(picturebox1.width,0)为什么曲线没显示在picturebox中?
      

  4.   

    用Timer定时想mshflex中添加实时数据即可。
    关于图片绘图问题,要用Line方法。
      

  5.   

    能不能详细解说一下图片绘图,下面源码可以显示网格,坐标,但是有限地方不明白,能不能解释一下?谢谢
    '添加 Command1 Picture1
    Dim i%, jj%, a(31) As Integer
    Dim x1%, y1%, x2%, y2%, oldx1%, oldy1%, perpixw!, perpixh!, perdivx!, perdivy!
    Private Sub Form_Load()
          Picture1.AutoSize = True
          Picture1.AutoRedraw = True
          Me.AutoRedraw = True
    End Sub
    Private Sub Command1_Click()
          For i = 1 To 31
             jj = Int(Rnd * 1000)
             a(i) = jj
          Next i
          drawpic
    End Sub
    Private Sub drawpic()
          On Error Resume Next
          perpixw = (Picture1.Width) / 12
          perpixh = Picture1.Height / 10
          oldx1 = 0
          oldy1 = Picture1.Height
          Call drawline
          x1 = Picture1.Left - 500
          y1 = Picture1.Top - 100
          For i = 1000 To 0 Step -50  ‘为什么step -50,如果把1000换成变化的值,step该怎么设置
             Me.CurrentX = x1
             Me.CurrentY = y1
             y1 = y1 + Int(Picture1.Height / 20)    ’
             If i Mod 100 = 0 Then Me.Print Str(i)
          Next i
       
          For i = 1 To 31    ’想让纵坐标显示时间量程分别为3,6,12,24,该怎么处理
             x1 = (i - 1) * perpixw
             y1 = a(i) * perpixh
             Me.CurrentY = Picture1.Top + Picture1.Height + 100
             Me.CurrentX = (Picture1.Left - 100) + x1
             If i Mod 5 = 0 Then Print Format(Str(i), "00")
             Picture1.Line (oldx1, oldy1)-(x1, y1), vbRed ‘不懂什么意思,如果去掉就不会有曲线
             oldx1 = x1: oldy1 = y1
          Next i
    End Sub
    Private Sub drawline()
          Picture1.Cls
          Me.Cls
          Me.FontSize = 10
          Me.ForeColor = QBColor(0)
          perdivx = Picture1.Width \ 12
          perdivy = Picture1.Height \ 10
          x1 = 0: x2 = Picture1.Width
          For yy = 0 To Picture1.Height Step perdivy
             Picture1.Line (x1, yy)-(x2, yy), QBColor(3)
          Next yy
          y1 = 0: y2 = Picture1.Height
          For x1 = 0 To Picture1.Width Step perdivx
             Picture1.Line (x1, y1)-(x1, y2), QBColor(3)
          Next x1
    End Sub
     上面源码为什么没有定义scale呢?,敬请指教,谢谢
      

  6.   

    For i = 1000 To 0 Step -50  ‘为什么step -50,如果把1000换成变化的值,step该怎么设置 
    这个你可以自己定,比如将1000换成100,再用-50 ,那么就只能花3个刻度(100、50、0)
    ,但如果用-5,就不一样了,就能画21个刻度了(100/5+1)For i = 1 To 31    ’想让纵坐标显示时间量程分别为3,6,12,24,该怎么处理 
    你只需要在你想绘线的地方绘制即可。
    Picture1.Line (oldx1, oldy1)-(x1, y1), vbRed ‘不懂什么意思,如果去掉就不会有曲线 
    这句就是绘制曲线的语句,每次绘制一小段线段,多条首尾相连的线段连接起来就成了曲线了。