窗体代码,保存在 frm 文件里的. |
程序代码: |
'窗体代码,窗体上,只有一个按钮 command2 ,一个定时器 timer1 , 一个Picture1 , 一个标签 Label2 , |
'其中标签 是在 Picture1 中的. 标签的设置为 自动大小=true |
Option Explicit |
Dim 当前数据 As Double |
Dim 目标数据 As Double |
Dim 工作 As Boolean |
Private Sub Command2_Click() |
工作 = Not 工作 |
End Sub |
Private Sub Form_Load() |
工作 = False |
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 < 数据个数Y + 1 Then |
|
'这里是提示的内容,根据结构来写 |
'这里的,提示格式是: 编号,时间 ,下一行,值 |
Label2.Caption = i + 计数 - 1 & vbCrLf & 数据(i).时间 & vbCrLf & 数据(i).值 |
Label2.Move X - Label2.Height, Y - Label2.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 |
|
Call ADD数据(Time, 当前数据) |
Call 绘折线图(Picture1) |
|
End If |
End Sub |
模块代码 ,保存在 BAS里的. |
程序代码: |
'模块代码 |
Option Explicit |
'这个结构里需要使用到的数据 为 值 , 而 X,Y 是计算出来的, 其它可以用于提示里面,也可以不要. |
Public Type 数据结构类型 |
时间 As Date |
值 As Double |
X As Long '屏幕提示用的 |
Y As Long |
End Type |
'折线图 坐标个数 |
Public Const 数据个数Y = 30 |
Public Const 数据个数X = 12 '等你期望的分格数+2, ,如分为10格,那么这里就填12,下面要各空一格 |
Public 数据(1 To 数据个数Y) 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 计数 As Long |
Public Sub ADD数据(cs1 As String , cs2 As Double ) |
Dim i As Long |
If IsDate(cs1) And IsNumeric(cs2) Then |
For i = 2 To 数据个数Y |
数据(i - 1).时间 = 数据(i).时间 |
数据(i - 1).值 = 数据(i).值 |
'数据(i - 1).X = 数据(i).X |
'数据(i - 1).Y = 数据(i).Y |
Next i |
数据(数据个数Y).时间 = cs1 |
数据(数据个数Y).值 = cs2 |
|
'如果Y坐标值不需要变的话,那么下面这行就不要. |
计数 = 计数 + 1 |
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 数据个数Y |
数据(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), CDbl (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值) / (数据个数X + 1) '分格,上下各空一格,为0时,下面不用空 |
最低格 = 0 |
Else |
间格 = (Max值 - Min值) / 数据个数X '分格, |
最低格 = Min值 |
End If |
总高 = .ScaleHeight - 200 |
高间格 = (总高) / 数据个数X '上下各留一格 |
宽间格 = (.ScaleWidth - 左边距) / (数据个数Y + 1) '右边留一格 |
.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 数据个数X - 1 |
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 数据个数Y |
cs.Line (左边距 + i * 宽间格, 0)-(左边距 + i * 宽间格, y1), 网格颜色 |
.CurrentX = 左边距 + i * 宽间格 - 150 |
.CurrentY = y1 + 30 |
cs.Print i + 计数 - 1 |
Next i |
'画折线图 |
数据(1).Y = y1 - ((数据(1).值 - 最低格) / (Max值 - 最低格)) * 总高 |
数据(1).X = 左边距 + 宽间格 |
cs.Circle (数据(1).X, 数据(1).Y), 30, 折线颜色 |
For i = 2 To 数据个数Y |
数据(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 |
by: 发表于:2017-12-01 14:55:59 顶(1) | 踩(0) 回复
??
回复评论