再次请教各位达人
提示: 作者被禁止或删除 内容自动屏蔽
Option Explicit Dim SB1 As Boolean Dim Sb2 As Boolean Dim Sb3 As Boolean Dim 水位 As Double Dim 目标水位 As Double Dim 工作 As Boolean Private Sub Command2_Click() 工作 = Not 工作 If 工作 Then Shape4.FillColor = vbGreen Else Shape4.FillColor = vbRed End If End Sub Private Sub Form_Load() 工作 = False Shape4.FillColor = vbRed End Sub Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '显示提示 Dim i As Long '只判断左右移动,不判断上下 If 宽间格 > 0 Then i = (X - 左边距) / 宽间格 If i > 0 And i < 51 Then '提示格式是: 编号,时间 ,下一行,值 Label2.Caption = i & vbCrLf & 数据(i).时间 & vbCrLf & 数据(i).值 Label2.Move X - Label1.Height, Y - Label1.Width Label2.Visible = True Else Label2.Visible = False End If Else Label2.Visible = False End If End Sub Private Sub Timer1_Timer() Dim 速度 As Double If 工作 Then 速度 = Rnd() If Abs(水位 - 目标水位) < 0.5 Then 目标水位 = Round(Rnd() * 11 + 3, 2) End If If 水位 > 目标水位 Then 水位 = 水位 - 速度 Else 水位 = 水位 + 速度 End If 水位 = Round(水位, 2) If 水位 > 14 Then 水位 = 14 End If If 水位 < 3.5 Then 水位 = 3.5 End If Text1.Text = 水位 Call ADD数据(Time, 水位) Call 绘折线图(Picture1) Call 检测 End If End Sub Private Sub 检测() If 水位 < Val(Text2(0).Text) And 水位 > Val(Text3(0).Text) Then Shape1.FillColor = vbGreen Else Shape1.FillColor = vbRed End If If 水位 < Val(Text2(1).Text) And 水位 > Val(Text3(1).Text) Then Shape2.FillColor = vbGreen Else Shape2.FillColor = vbRed End If If 水位 < Val(Text2(2).Text) And 水位 > Val(Text3(2).Text) Then Shape3.FillColor = vbGreen Else Shape3.FillColor = vbRed End If End Sub
Option Explicit Public Type 数据结构类型 时间 As Date 值 As Double X As Long '屏幕提示用的 Y As Long End Type Public 数据(1 To 50) As 数据结构类型 Public Max值 As Double Public Min值 As Double Public 高间格 As Long, 宽间格 As Long Public Const 坐标颜色 = 0 Public Const 网格颜色 = vbGreen Public Const 折线颜色 = vbRed Public Const 标注颜色 = 3 Public Const 左边距 = 400 Public Sub ADD数据(cs1 As String, cs2 As Double) Dim i As Long If IsDate(cs1) And IsNumeric(cs2) Then For i = 2 To 50 数据(i - 1).时间 = 数据(i).时间 数据(i - 1).值 = 数据(i).值 '数据(i - 1).X = 数据(i).X '数据(i - 1).Y = 数据(i).Y Next i 数据(50).时间 = cs1 数据(50).值 = cs2 End If 'X Y需要重新计算,所以不需要移动 End Sub Public Sub MaxMin值() '找出最大值,最小值 'Dim i As Long 'Max值 = 数据(1).值 'Min值 = 数据(1).值 'For i = 2 To 50 ' If Max值 < 数据(i).值 Then ' Max值 = 数据(i).值 ' End If ' 'If Min值 > 数据(i).值 Then ' ' Min值 = 数据(i).值 ' 'End If 'Next i Max值 = 15 Min值 = 3 End Sub Public Sub Cls数据() Dim i As Long For i = 1 To 50 数据(i).值 = 0 数据(i).时间 = #12:00:00 AM# Next i End Sub Public Sub 读数据(cs As String) Dim fr As Long fr = FreeFile Dim d 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) Then d = fj(0) Call ADD数据(fj(0), fj(1)) End If End If Loop Close fr End Sub Public Sub 绘折线图(cs As PictureBox) Dim i As Long, 间格 As Double Dim 总高 As Long Dim 最低格 As Double With cs Call MaxMin值 '找出最大值,最小值 If Min值 = 0 Then 间格 = (Max值) / 11 '分为10格,上下各空一格 最低格 = 0 Else 间格 = (Max值 - Min值) / 12 '分为10格 最低格 = Min值 '- 间格 End If 总高 = .ScaleHeight - 200 高间格 = (总高) / 12 '上下各留一格 宽间格 = (.ScaleWidth - 左边距) / 51 '右边留一格 .Cls '清屏 '画坐标 Dim x1 As Long, X2 As Long, y1 As Long, y2 As Long y1 = .ScaleHeight - 200 x1 = .ScaleWidth - 200 cs.Line (左边距, 0)-(左边距, y1), 坐标颜色 cs.Line (左边距, y1)-(.ScaleWidth, y1), 坐标颜色 '画坐标网络 .ForeColor = 标注颜色 .CurrentX = 0 .CurrentY = y1 - 90 cs.Print Round(最低格, 3) For i = 1 To 11 cs.Line (左边距, y1 - i * 高间格)-(.ScaleWidth, y1 - i * 高间格), 网格颜色 .CurrentX = 0 .CurrentY = y1 - i * 高间格 - 90 cs.Print Round(Min值 + i * 间格, 3) Next i For i = 1 To 50 cs.Line (左边距 + i * 宽间格, 0)-(左边距 + i * 宽间格, y1), 网格颜色 .CurrentX = 左边距 + i * 宽间格 - 150 .CurrentY = y1 + 30 cs.Print i Next i '画折线图 数据(1).Y = y1 - ((数据(1).值 - 最低格) / (Max值 - 最低格)) * 总高 数据(1).X = 左边距 + 宽间格 cs.Circle (数据(1).X, 数据(1).Y), 30, 折线颜色 For i = 2 To 50 数据(i).Y = y1 - ((数据(i).值 - 最低格) / (Max值 - 最低格)) * 总高 数据(i).X = 左边距 + (i) * 宽间格 cs.Circle (数据(i).X, 数据(i).Y), 30, 折线颜色 cs.Line (数据(i - 1).X, 数据(i - 1).Y)-(数据(i).X, 数据(i).Y) Next i End With End Sub