这个是从串口接收报警信号的过程 Private Sub Comm1_OnComm() On Error Resume Next Dim Result1 As String Dim DD1 As Integer Dim DD2 As Integer Dim i As Integer Dim FQ() As Integer FC = "" JS = Comm1.Input If CStr(Hex(JS(1))) = "38" And CStr(Hex(JS(2))) = "4D" Then CH = CStr(Hex(JS(3))) FH = CStr(Hex(JS(4))) TH = CStr(Hex(JS(5))) DH = CStr(Hex(JS(6))) FC = CStr(Hex(JS(7))) DD1 = SixteenTurnTen(FC)
If FC = "0" Then Tp = "紧急报警" NT_sub TH_sub Exit Sub End If For i = 1 To 8 FQ(i) = 0 Next i Do If DD1 Mod 2 = 1 Then Result1 = "1" & Result1 DD1 = DD1 - 1 / 2
Else Result1 = "0" & Result1 DD1 = DD1 / 2 End If Loop While DD1 = 0
DD2 = Len(Result1)
For i = DD2 To 1 Step -1 If Mid(Result1, i, 1) = 1 Then FQ(i) = 1 Else FQ(i) = 0 End If Next i For i = 1 To 8 Select Case FQ(i) Case 0 Case 1 Select Case i Case 1 Tp = "红外报警" NT_sub TH_sub Case 2 Tp = "门磁报警" NT_sub TH_sub Case 3 Tp = "火灾报警" NT_sub TH_sub Case 4 Tp = "煤气报警" NT_sub TH_sub Case 5 Tp = "红外报警" NT_sub TH_sub Case 6 Tp = "门磁报警" NT_sub TH_sub Case 7 Tp = "火灾报警" NT_sub TH_sub Case 8 Tp = "煤气报警" NT_sub TH_sub End Select End Select Next i Else Exit Sub End If End Sub
这个是接收到紧急报警时所要运行的过程,就在NT_sub过程死机 Public Sub TH_sub() Select Case TH Case "1" SBB(1).Visible = False Case "2" SBB(2).Visible = False Case "3" SBB(3).Visible = False Case "4" SBB(4).Visible = False Case "5" SBB(5).Visible = False Case "6" SBB(6).Visible = False Case "7" SBB(7).Visible = False Case "8" SBB(8).Visible = False Case "9" SBB(9).Visible = False Case "10" SBB(10).Visible = False End Select End SubPublic Sub NT_sub() 在这个过程中死机 Nt = DH + "栋" + TH + "梯" + CH + "层" + FH + "号" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''' str = "SELECT OName From Owner where NT='" & Nt & "'" If rs1.State Then rs1.Close End If rs1.Open str, cn, adOpenDynamic, adLockOptimistic, adCmdText If rs1.RecordCount < 1 Then str = "空" Else str = rs1!Oname End If Dt = Now
If frmMsage.Visible = True Then If frmMsage1.Visible = True Then If frmMsage2.Visible = True Then If frmMsage3.Visible = True Then If frmMsage4.Visible = True Then If frmMsage5.Visible = True Then If frmMsage6.Visible = True Then If frmMsage7.Visible = True Then If frmMsage8.Visible = True Then If frmMsage9.Visible = True Then Unload frmMsage frmMsage.Show Else frmMsage9.Show End If Else frmMsage8.Show End If Else frmMsage7.Show End If Else frmMsage6.Show End If Else frmMsage5.Show End If Else frmMsage4.Show End If Else frmMsage3.Show End If Else frmMsage2.Show End If Else frmMsage1.Show End If Else frmMsage.Show End If If rs9.State Then rs9.Close End If str22 = "SELECT * From Alarm where HandleResult = '未曾处理'" rs9.Open str22, cn, adOpenDynamic, adLockOptimistic, adCmdText Label2.Caption = "未处理报警:" & rs9.RecordCount & "次" End Sub
if ... end if 层数太多了吧?
是不是代码太长了,我的一个MDI模块有2000多行,这只是一不分,问题就出在下面这两个过程 这个是从串口接收报警信号的过程,只看 Private Sub Comm1_OnComm() On Error Resume Next Dim Result1 As String Dim DD1 As Integer Dim DD2 As Integer Dim i As Integer Dim FQ() As Integer FC = "" JS = Comm1.Input If CStr(Hex(JS(1))) = "38" And CStr(Hex(JS(2))) = "4D" Then CH = CStr(Hex(JS(3))) FH = CStr(Hex(JS(4))) TH = CStr(Hex(JS(5))) DH = CStr(Hex(JS(6))) FC = CStr(Hex(JS(7))) DD1 = SixteenTurnTen(FC)
If FC = "0" Then Tp = "紧急报警" NT_sub TH_sub Exit Sub End If end if End SubPublic Sub NT_sub() 在这个过程中死机 Nt = DH + "栋" + TH + "梯" + CH + "层" + FH + "号" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''' str = "SELECT OName From Owner where NT='" & Nt & "'" If rs1.State Then rs1.Close End If rs1.Open str, cn, adOpenDynamic, adLockOptimistic, adCmdText If rs1.RecordCount < 1 Then str = "空" Else str = rs1!Oname End If Dt = Now
If frmMsage.Visible = True Then If frmMsage1.Visible = True Then If frmMsage2.Visible = True Then If frmMsage3.Visible = True Then If frmMsage4.Visible = True Then If frmMsage5.Visible = True Then If frmMsage6.Visible = True Then If frmMsage7.Visible = True Then If frmMsage8.Visible = True Then If frmMsage9.Visible = True Then Unload frmMsage frmMsage.Show Else frmMsage9.Show End If Else frmMsage8.Show End If Else frmMsage7.Show End If Else frmMsage6.Show End If Else frmMsage5.Show End If Else frmMsage4.Show End If Else frmMsage3.Show End If Else frmMsage2.Show End If Else frmMsage1.Show End If Else frmMsage.Show End If If rs9.State Then rs9.Close End If str22 = "SELECT * From Alarm where HandleResult = '未曾处理'" rs9.Open str22, cn, adOpenDynamic, adLockOptimistic, adCmdText Label2.Caption = "未处理报警:" & rs9.RecordCount & "次" End Sub
是不是对数据库操作时候产生的死循环? rs1 前面打开后 没有关闭 是不是在过程中又调用了rs1?
doevents加多点试试看不过也不至于死机把
老兄你的算法不行啊,好多地方都可以很简略的象这里 Public Sub TH_sub() Select Case TH Case "1" SBB(1).Visible = False Case "2" SBB(2).Visible = False Case "3" SBB(3).Visible = False Case "4" SBB(4).Visible = False Case "5" SBB(5).Visible = False Case "6" SBB(6).Visible = False Case "7" SBB(7).Visible = False Case "8" SBB(8).Visible = False Case "9" SBB(9).Visible = False Case "10" SBB(10).Visible = False End Select End Sub 直接改成 Public Sub TH_sub() DIM TEMP TEMP=TH SBB(TEMP).Visble=false End Sub 就OK了
还有这里 If frmMsage.Visible = True Then If frmMsage1.Visible = True Then If frmMsage2.Visible = True Then If frmMsage3.Visible = True Then If frmMsage4.Visible = True Then If frmMsage5.Visible = True Then If frmMsage6.Visible = True Then If frmMsage7.Visible = True Then If frmMsage8.Visible = True Then If frmMsage9.Visible = True Then Unload frmMsage frmMsage.Show Else frmMsage9.Show End If Else frmMsage8.Show End If Else frmMsage7.Show End If Else frmMsage6.Show End If Else frmMsage5.Show End If Else frmMsage4.Show End If Else frmMsage3.Show End If Else frmMsage2.Show End If Else frmMsage1.Show End If Else frmMsage.Show End If 可以改为frmMsage的 数组控件 frmMsage(9) ' 0~9 那样就简单的写成如下算法 DIM X AS INTEGER FOR X=0 TO 8 IF frmMsage(X).Visible Then frmMsage(X).Show EXIT FOR END IF NEXT IF frmMsage(9).Visible THEN Unload frmMsage frmMsage.SHOW END IF 这样是不是容易理解 看起来也舒服点
Private Sub Comm1_OnComm()
On Error Resume Next
Dim Result1 As String
Dim DD1 As Integer
Dim DD2 As Integer
Dim i As Integer
Dim FQ() As Integer
FC = "" JS = Comm1.Input If CStr(Hex(JS(1))) = "38" And CStr(Hex(JS(2))) = "4D" Then
CH = CStr(Hex(JS(3)))
FH = CStr(Hex(JS(4)))
TH = CStr(Hex(JS(5)))
DH = CStr(Hex(JS(6)))
FC = CStr(Hex(JS(7)))
DD1 = SixteenTurnTen(FC)
If FC = "0" Then
Tp = "紧急报警"
NT_sub
TH_sub
Exit Sub
End If
For i = 1 To 8
FQ(i) = 0
Next i
Do
If DD1 Mod 2 = 1 Then
Result1 = "1" & Result1
DD1 = DD1 - 1 / 2
Else
Result1 = "0" & Result1
DD1 = DD1 / 2
End If
Loop While DD1 = 0
DD2 = Len(Result1)
For i = DD2 To 1 Step -1
If Mid(Result1, i, 1) = 1 Then
FQ(i) = 1
Else
FQ(i) = 0
End If
Next i
For i = 1 To 8
Select Case FQ(i)
Case 0
Case 1
Select Case i
Case 1
Tp = "红外报警"
NT_sub
TH_sub
Case 2
Tp = "门磁报警"
NT_sub
TH_sub
Case 3
Tp = "火灾报警"
NT_sub
TH_sub
Case 4
Tp = "煤气报警"
NT_sub
TH_sub
Case 5
Tp = "红外报警"
NT_sub
TH_sub
Case 6
Tp = "门磁报警"
NT_sub
TH_sub
Case 7
Tp = "火灾报警"
NT_sub
TH_sub
Case 8
Tp = "煤气报警"
NT_sub
TH_sub
End Select
End Select
Next i
Else
Exit Sub
End If
End Sub
这个是接收到紧急报警时所要运行的过程,就在NT_sub过程死机
Public Sub TH_sub()
Select Case TH
Case "1"
SBB(1).Visible = False
Case "2"
SBB(2).Visible = False
Case "3"
SBB(3).Visible = False
Case "4"
SBB(4).Visible = False
Case "5"
SBB(5).Visible = False
Case "6"
SBB(6).Visible = False
Case "7"
SBB(7).Visible = False
Case "8"
SBB(8).Visible = False
Case "9"
SBB(9).Visible = False
Case "10"
SBB(10).Visible = False
End Select
End SubPublic Sub NT_sub() 在这个过程中死机
Nt = DH + "栋" + TH + "梯" + CH + "层" + FH + "号"
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
str = "SELECT OName From Owner where NT='" & Nt & "'"
If rs1.State Then
rs1.Close
End If
rs1.Open str, cn, adOpenDynamic, adLockOptimistic, adCmdText
If rs1.RecordCount < 1 Then
str = "空"
Else
str = rs1!Oname
End If
Dt = Now
rs.AddNew
rs!Nt = Nt
rs!Oname = str
rs!AlarmTime = Dt
rs!Type = Tp
rs!EmpName = loginName
rs!HandleResult = "未曾处理"
rs.Update
SD = str
If frmMsage.Visible = True Then
If frmMsage1.Visible = True Then
If frmMsage2.Visible = True Then
If frmMsage3.Visible = True Then
If frmMsage4.Visible = True Then
If frmMsage5.Visible = True Then
If frmMsage6.Visible = True Then
If frmMsage7.Visible = True Then
If frmMsage8.Visible = True Then
If frmMsage9.Visible = True Then
Unload frmMsage
frmMsage.Show
Else
frmMsage9.Show
End If
Else
frmMsage8.Show
End If
Else
frmMsage7.Show
End If
Else
frmMsage6.Show
End If
Else
frmMsage5.Show
End If
Else
frmMsage4.Show
End If
Else
frmMsage3.Show
End If
Else
frmMsage2.Show
End If
Else
frmMsage1.Show
End If
Else
frmMsage.Show
End If
If rs9.State Then
rs9.Close
End If
str22 = "SELECT * From Alarm where HandleResult = '未曾处理'"
rs9.Open str22, cn, adOpenDynamic, adLockOptimistic, adCmdText
Label2.Caption = "未处理报警:" & rs9.RecordCount & "次"
End Sub
这个是从串口接收报警信号的过程,只看
Private Sub Comm1_OnComm()
On Error Resume Next
Dim Result1 As String
Dim DD1 As Integer
Dim DD2 As Integer
Dim i As Integer
Dim FQ() As Integer
FC = "" JS = Comm1.Input If CStr(Hex(JS(1))) = "38" And CStr(Hex(JS(2))) = "4D" Then
CH = CStr(Hex(JS(3)))
FH = CStr(Hex(JS(4)))
TH = CStr(Hex(JS(5)))
DH = CStr(Hex(JS(6)))
FC = CStr(Hex(JS(7)))
DD1 = SixteenTurnTen(FC)
If FC = "0" Then
Tp = "紧急报警"
NT_sub
TH_sub
Exit Sub
End If
end if
End SubPublic Sub NT_sub() 在这个过程中死机
Nt = DH + "栋" + TH + "梯" + CH + "层" + FH + "号"
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
str = "SELECT OName From Owner where NT='" & Nt & "'"
If rs1.State Then
rs1.Close
End If
rs1.Open str, cn, adOpenDynamic, adLockOptimistic, adCmdText
If rs1.RecordCount < 1 Then
str = "空"
Else
str = rs1!Oname
End If
Dt = Now
rs.AddNew
rs!Nt = Nt
rs!Oname = str
rs!AlarmTime = Dt
rs!Type = Tp
rs!EmpName = loginName
rs!HandleResult = "未曾处理"
rs.Update
SD = str
If frmMsage.Visible = True Then
If frmMsage1.Visible = True Then
If frmMsage2.Visible = True Then
If frmMsage3.Visible = True Then
If frmMsage4.Visible = True Then
If frmMsage5.Visible = True Then
If frmMsage6.Visible = True Then
If frmMsage7.Visible = True Then
If frmMsage8.Visible = True Then
If frmMsage9.Visible = True Then
Unload frmMsage
frmMsage.Show
Else
frmMsage9.Show
End If
Else
frmMsage8.Show
End If
Else
frmMsage7.Show
End If
Else
frmMsage6.Show
End If
Else
frmMsage5.Show
End If
Else
frmMsage4.Show
End If
Else
frmMsage3.Show
End If
Else
frmMsage2.Show
End If
Else
frmMsage1.Show
End If
Else
frmMsage.Show
End If
If rs9.State Then
rs9.Close
End If
str22 = "SELECT * From Alarm where HandleResult = '未曾处理'"
rs9.Open str22, cn, adOpenDynamic, adLockOptimistic, adCmdText
Label2.Caption = "未处理报警:" & rs9.RecordCount & "次"
End Sub
rs1 前面打开后 没有关闭 是不是在过程中又调用了rs1?
Public Sub TH_sub()
Select Case TH
Case "1"
SBB(1).Visible = False
Case "2"
SBB(2).Visible = False
Case "3"
SBB(3).Visible = False
Case "4"
SBB(4).Visible = False
Case "5"
SBB(5).Visible = False
Case "6"
SBB(6).Visible = False
Case "7"
SBB(7).Visible = False
Case "8"
SBB(8).Visible = False
Case "9"
SBB(9).Visible = False
Case "10"
SBB(10).Visible = False
End Select
End Sub
直接改成
Public Sub TH_sub()
DIM TEMP
TEMP=TH
SBB(TEMP).Visble=false
End Sub
就OK了
If frmMsage.Visible = True Then
If frmMsage1.Visible = True Then
If frmMsage2.Visible = True Then
If frmMsage3.Visible = True Then
If frmMsage4.Visible = True Then
If frmMsage5.Visible = True Then
If frmMsage6.Visible = True Then
If frmMsage7.Visible = True Then
If frmMsage8.Visible = True Then
If frmMsage9.Visible = True Then
Unload frmMsage
frmMsage.Show
Else
frmMsage9.Show
End If
Else
frmMsage8.Show
End If
Else
frmMsage7.Show
End If
Else
frmMsage6.Show
End If
Else
frmMsage5.Show
End If
Else
frmMsage4.Show
End If
Else
frmMsage3.Show
End If
Else
frmMsage2.Show
End If
Else
frmMsage1.Show
End If
Else
frmMsage.Show
End If
可以改为frmMsage的 数组控件 frmMsage(9) ' 0~9
那样就简单的写成如下算法
DIM X AS INTEGER
FOR X=0 TO 8
IF frmMsage(X).Visible Then
frmMsage(X).Show
EXIT FOR
END IF
NEXT
IF frmMsage(9).Visible THEN
Unload frmMsage
frmMsage.SHOW
END IF
这样是不是容易理解 看起来也舒服点