| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 800 人关注过本帖
标题:请问这几个过程有没有问题?
取消只看楼主 加入收藏
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
结帖率:94.74%
收藏
已结贴  问题点数:30 回复次数:7 
请问这几个过程有没有问题?
在论坛学得一程序,想捉猫画虎,添加了一个数据的读取,可实现不了。能否帮助指点一下,


Option Explicit

Private Type 数据结构类型
    时间 As Date
     As Double
    X As Double      
    Y As Double
End Type

Dim 数据(1 To 50) As 数据结构类型
Dim data8(1 To 50) As 数据结构类型    '自己添加的
Dim Max值 As Double  
Dim Min值 As Double

Dim interdata0 As Double               '自己添加的存储新数据
Dim interdata8 As Double               '自己添加的存储新数据
Dim datagate0 As Boolean               '自己添加的用于判断数据更新
Dim datagate8 As Boolean               '自己添加的用于判断数据更新
Dim 高间格 As Double, 宽间格 As Double 'Long


Public Sub ADDdata()                '自己添加的过程用于将两组数据同步更新

Dim i As Integer
If datagate0 = True or datagate8=true Then   '有任一组数据更新则全部重算,无更新的那一组前推,如都没更新,则本过程无实际代码执行
    If datagate0 = True Then
      For i = 2 To 50
          数据(i - 1).值 = 数据(i).值
      Next i
      数据(50).值 = interdata0
     else
      For i = 2 To 50
          数据(i - 1).值 = 数据(i).值
      Next i
    数据(50).值 = 数据(50).值
    End If

    If datagate8 = True Then
      For i = 2 To 50
          data8(i - 1).值 = data8(i).值
      Next i
    data8(50).值 = interdata8
    Else
      For i = 2 To 50
          data8(i - 1).值 = data8(i).值
      Next i
      data8(50).值 = data8(50).值
    End If
  
   
End If
    datagate0 = False
    datagate8 = False
   
End Sub


Public Sub MaxMin值()       '找出最大值,最小值,添加在两组数中找
Dim i As Integer
Max值 = 1.5     '数据(1).值
Min值 = 1.1     '数据(1).值
For i = 2 To 50
    If Max值 < 数据(i).值 Then
        Max值 = 数据(i).值
    End If
    If Min值 > 数据(i).值 Then
        Min值 = 数据(i).值
    End If
Next i
For i = 2 To 50
   If Max值 < data8(i).值 Then
       Max值 = data8(i).值
   End If
    If Min值 > data8(i).值 Then
        Min值 = data8(i).值
    End If
Next i
End Sub

Public Sub Cls数据()
Dim i As Integer
For i = 1 To 50
    数据(i).值 = 0
    数据(i).时间 = #12:00:00 AM#
    data8(i).值 = 0
    data8(i).时间 = #12:00:00 AM#
Next i

End Sub

Public Sub 读数据(cs As String)

Dim fr As Integer
fr = FreeFile
Dim d As String
Dim dd As String    '自己添加的
Dim fj() As String
Dim j As String


Open cs For Input Access Read As #fr
    Do While Not EOF(fr)
        Line Input #fr, j
        If InStr(1, j, ";") > 0 Then
            fj = Split(j, ";")
            If d <> fj(0)   Or dd <> fj(1) then   '自己添加一个条件
                d = fj(0)
                dd = fj(1)
                interdata0 = sdbl(fj(1))
                datagate0 = True
               
            End If
        End If
    Loop

Close fr


End Sub
Public Sub readdata8(cs8 As String)   '自己添加的读取另一文件数据

Dim fr8 As Integer
fr8 = FreeFile
Dim d8 As String
Dim dd8 As String
Dim fj8() As String
Dim j8 As String

Open cs8 For Input Access Read As #fr8
    Do While Not EOF(fr8)
        Line Input #fr8, j8
        If InStr(1, j8, ";") > 0 Then
            fj8 = Split(j8, ";")
            If d8 <> fj8(0) Or dd8 <> fj8(1) then
                d8 = fj8(0)
                dd8 = fj8(1)
                interdata8 = sdbl(fj8(1))
                datagate8 = True
                              
            End If
        End If
    Loop

Close fr8
End Sub


.....................  


Private Sub Timer1_Timer()


    Call Cls数据                    '清掉前面的代码
    Call 读数据("E:\333.CSV")         '打开第一个文件,读数据
    Call readdata8("E:\888.CSV")         '打开第二个文件,读数据
    Call ADDdata
    Call 绘折线图(Picture1)         '绘制折线图
'    Stop

End Sub
搜索更多相关主题的帖子: 数据 
2010-05-17 07:18
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
多谢指点,不过我的读数据方式有些不同,两个文件不是同时更新,有时一个文件一秒内更新了几次,而另一文件还没有更新,如按原来的方式读取,会造成时间方面的错觉,影响对比,因而增加了datagate阀门判断,如一个变了另一个没变,则把其数据前推,用时间横轴(也就是图表中的1---50)将两组数据联系起来对比。
2010-05-17 20:29
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
按你的提醒改进了一下,两个数组读数据没问题,但划线却有一条是直线,怎回事?
帮忙看一下,
Public Sub paintcurve(cs As PictureBox)

Dim i As Integer, grid As Double
Dim totalhigh As Long
Dim lowergrid As Double

With cs

Call MaxMin           '找出最大值,最小值
If Minvalue = 0 Then
    grid = (Maxvalue) / 11      '分为10格,上下各空一格11
    lowergrid = 0
Else
    grid = (Maxvalue - Minvalue) / 10     '分为10格10
    lowergrid = Minvalue - grid
End If

totalhigh = .ScaleHeight - 200
highgrid = (totalhigh) / 12      '上下各留一格
widthgrid = (.ScaleWidth - 600) / 51       '右边留一格

.Cls      '清屏

'画坐标
Dim x1 As Long, X2 As Long, y1 As Long, y2 As Long

y1 = .ScaleHeight - 200
x1 = .ScaleWidth - 200

cs.Line (600, 0)-(600, y1), vbRed
cs.Line (600, y1)-(.ScaleWidth, y1), vbRed

'画坐标网络
    .ForeColor = RGB(100, 200, 150)
    .CurrentX = 0
    .CurrentY = y1 - 90
    cs.Print Round(lowergrid, 5)
For i = 1 To 11
    cs.Line (600, y1 - i * highgrid)-(.ScaleWidth, y1 - i * highgrid), vbGreen
    .CurrentX = 0
    .CurrentY = y1 - i * highgrid - 90
    cs.Print Round(Minvalue + i * grid, 5)
Next i

For i = 1 To 50
    cs.Line (600 + i * widthgrid, 0)-(600 + i * widthgrid, y1), vbGreen
    .CurrentX = 600 + i * widthgrid - 150
    .CurrentY = y1 + 30
    cs.Print i
Next i

'画折线图
    data0(1).Y = y1 - ((data0(1).value - lowergrid) / (Maxvalue - lowergrid)) * totalhigh
    data0(1).X = 600 + widthgrid
    cs.Circle (data0(1).X, data0(1).Y), 30, vbBlue
   
   
    data8(1).Y = y1 - ((data8(1).value - lowergrid) / (Maxvalue - lowergrid)) * totalhigh
    data8(1).X = 600 + widthgrid
    cs.Circle (data8(1).X, data8(1).Y), 30, vbRed

For i = 2 To 50
    data0(i).Y = y1 - ((data0(i).value - lowergrid) / (Maxvalue - lowergrid)) * totalhigh
    data0(i).X = 600 + (i) * widthgrid
    cs.Circle (data0(i).X, data0(i).Y), 30, vbBlue
    cs.Line (data0(i - 1).X, data0(i - 1).Y)-(data0(i).X, data0(i).Y)
  Next i

For i = 2 To 50
  
    data8(i).Y = y1 - ((data8(i).value - lowergrid) / (Maxvalue - lowergrid)) * totalhigh
    data8(i).X = 600 + (i) * widthgrid
    cs.Circle (data8(i).X, data8(i).Y), 30, vbRed
    cs.Line (data8(i - 1).X, data8(i - 1).Y)-(data8(i).X, data8(i).Y), vbRed
Next i

End With
End Sub
2010-05-18 22:46
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
那条直线是上下移动的,经观察,最后的数data0(50)是对的,其余1--49都是data0(50)这个数
2010-05-19 21:30
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
多谢,我的数据采集过程如下,data8()的数据可以画出,data0的数据画出后是一条直线,经过测试其数据全是data0(1),(上次判断错认为是data(50)),数组长度为50和100都是一样的效果,各个过程是对称的,就不理解添加时怎会有区别。试过三条线的,有两条直线,调换读数据过程和数组的对应关系,结果readdata8对应的始终能画出,帮忙看一下。我的思路是一组数据变化时,另一组数据前推,不再考虑时间参数,因为画图时用不到。内存会不会影响结果?
Public Sub readdata0(cs As String)

Dim fr As Integer
fr = FreeFile
Dim d As String
Dim dd As String
Dim FJ0() As String
Dim j As String


Open cs For Input Access Read As #fr
    Do While Not EOF(fr)
        Line Input #fr, j
        If InStr(1, j, ";") > 0 Then
            FJ0 = Split(j, ";")
            If d <> FJ0(0) Or dd <> FJ0(1) Then
                d = FJ0(0)
                dd = FJ0(1)
                Call adddata0(FJ0(0), FJ0(1))
                Call aadddata8
             End If
        End If
    Loop

Close fr


End Sub
Public Sub readdata8(cs8 As String)

Dim fr8 As Integer
fr8 = FreeFile
Dim d8 As String
Dim dd8 As String
Dim FJ8() As String
Dim j8 As String

Open cs8 For Input Access Read As #fr8
    Do While Not EOF(fr8)
        Line Input #fr8, j8
        If InStr(1, j8, ";") > 0 Then
            FJ8 = Split(j8, ";")
            If d8 <> FJ8(0) Or dd8 <> FJ8(1) Then
                d8 = FJ8(0)
                dd8 = FJ8(1)
                Call adddata8(FJ8(0), FJ8(1))
                Call aadddata0
                End If
        End If
    Loop

Close fr8
End Sub

Public Sub adddata0(cs1 As String, cs2 As String)
Dim i As Integer
If IsDate(cs1) And IsNumeric(cs2) Then
    For i = 2 To 100
      data0(i - 1).value = data0(i).value
     Next i
      data0(100).value = CDbl(cs2)
End If
   
End Sub
Public Sub adddata8(cs1 As String, cs2 As String)
Dim i As Integer
If IsDate(cs1) And IsNumeric(cs2) Then
    For i = 2 To 100
      data8(i - 1).value = data8(i).value
    Next i
      data8(100).value = CDbl(cs2)
End If
   
End Sub

Public Sub aadddata0()
Dim i As Integer
    For i = 2 To 100
       data0(i - 1).value = data0(i).value
    Next i
    data0(100).value = data0(100).value
End Sub
Public Sub aadddata8()
Dim i As Integer
    For i = 2 To 100
       data8(i - 1).value = data8(i).value
    Next i
    data8(100).value = data8(100).value
End Sub

Public Sub MaxMin()       '找出最大值,最小值
Dim i As Integer
Maxvalue = data0(1).value
Minvalue = data0(1).value
For i = 1 To 100
    If Maxvalue < data0(i).value Then
        Maxvalue = data0(i).value
    End If
    If Minvalue > data0(i).value Then
        Minvalue = data0(i).value
    End If
Next i
For i = 1 To 100
    If Maxvalue < data8(i).value Then
        Maxvalue = data8(i).value
    End If
    If Minvalue > data8(i).value Then
      Minvalue = data8(i).value
   End If
Next i
End Sub
2010-05-20 09:39
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
我已实现了自己的想法,可是CPU占用率超过60%,电脑很慢,TIMER的INTERVAL设置为1,可数据还是一出一大堆,完全看不到细节,看样子要学VC了。

[ 本帖最后由 yalewang 于 2010-5-21 23:21 编辑 ]
2010-05-21 23:01
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
附件是我画的图
2010-05-21 23:22
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
传了两次看不到附件?
2010-05-21 23:23
快速回复:请问这几个过程有没有问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017552 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved