自己写了一个控件,用到了SSTAB,并且在SSTAB中动态地添加和删除控件。
现在能够成功地添加控件,并添加到指定的TAB页中;也能够成功地删除控件。
问题是:当我成功地删除控件后,当鼠标点了SSTAB刚才被清空一个TAB页之后,程序就崩溃,弹出一个“应用程序错误”窗口,显示“"0x66065c5f"指令引用的"0x00000034"内存。该内存不能为"read"”
请问大家有没有什么经验或者建议。不胜感谢!相关代码如下:'测试代码
Private Sub btnAddInfos_Click()
Call HostInfoControl1.AddInfo(0, "测试", "中国要在二要中国要在二要中国要在二要中国要在二要中国要在二要中国要在二要")
Call HostInfoControl1.AddInfo(0, "内存", "内存信息")
Call HostInfoControl1.AddInfo(0, "硬盘", "空间信息1")
Call HostInfoControl1.AddInfo(1, "CPU", "CPU使用信息CPU使用信息CPU使用信息CPU使用信息CPU使用信息CPU使用信息CPU使用信息")
Call HostInfoControl1.AddInfo(1, "CPU", "CPU使用信息2")
Call HostInfoControl1.AddInfo(0, "硬盘", "空间信息2")
Call HostInfoControl1.AddInfo(1, "HTTP", "HTTP服务")
Call HostInfoControl1.AddInfo(2, "HTTPS", "HTTPS服务HTTPS服务HTTPS服务HTTPS服务HTTPS服务HTTPS服务HTTPS服务")
Call HostInfoControl1.AddInfo(0, "硬盘", "空间信息3")
Call HostInfoControl1.AddInfo(2, "HTTPS", "HTTPS服务2")
HostInfoControl1.CurrTab = 0
End SubPrivate Sub btnClearInfos_Click()
Call HostInfoControl1.ClearInfos
End Sub'部分控件代码(HostInfoControl)
'##########################################################################
'#
'# Name: ClearInfos
'# Description: 清除在SSTAB的各页中的消息项
'# Input:
'# Output:
'# Return:
'# 执行成功时返回true
'##########################################################################
Public Function ClearInfos() As Boolean
Dim ix As Integer
Dim objLabel1 As Label
Dim objLabel2 As Label
ClearInfos = False
For ix = 1 To m_InfoNames.Count
Controls.Remove "lblInfoName" & CStr(ix)
Set objLabel1 = m_InfoNames.Item(1)
Set objlable1 = Nothing
m_InfoNames.Remove 1 '如果把此行代码注释则不会出现崩溃
Next
For ix = 1 To m_InfoMsgs.Count
Controls.Remove "lblInfoMsg" & CStr(ix)
Set objLabel1 = m_InfoMsgs.Item(1)
Set objlable1 = Nothing
m_InfoMsgs.Remove 1 '如果把此行代码注释则不会出现崩溃
Next
For ix = 1 To m_MsgInfos.Count
m_MsgInfos.Remove 1
Next
m_InfoCount = 0
ClearInfos = True
End Function'##########################################################################
'#
'# Name: AddInfo(TabIndex, InfoName, InfoMsg)
'# Description: 在SSTAB的指定页中增加一个消息项的方法
'# Input:
'# TabIndex: SSTAB的Tab顺序,从0开始
'# InfoName: 消息项目名称
'# InfoMsg: 消息项的内容
'# Output:
'# Return:
'# 执行成功时返回true
'##########################################################################
Public Function AddInfo(ByVal TabIndex As Integer, ByVal InfoName As String, ByVal InfoMsg As String)
On Error GoTo ErrorHandle
Dim intLastTabInfo As Integer
Dim intPrevBottom As Long
Dim objLabel1 As Label
Dim objLabel2 As Label
If (TabIndex < 0 And TabIndex > TabCount - 1) Then
AddInfo = False
Exit Function
End If
intLastTabInfo = LastIndexOfMsgInfos(TabIndex)
intPrevBottom = 0
If (intLastTabInfo > 0) Then
Set objLabel1 = m_InfoNames.Item(intLastTabInfo)
intPrevBottom = objLabel1.Top + objLabel1.Height
Set objLabel2 = m_InfoMsgs.Item(intLastTabInfo)
If (intPrevBottom < objLabel2.Top + objLabel2.Height) Then
intPrevBottom = objLabel2.Top + objLabel2.Height
End If
intPrevBottom = intPrevBottom + m_VInterval
End If
If (intPrevBottom = 0) Then
intPrevBottom = m_InfoNameTop
End If
tabGroup.object.tab = TabIndex
Set lblInfoName = Controls.Add("VB.Label", "lblInfoName" & CStr(m_InfoNames.Count + 1), tabGroup)
With lblInfoName
.Left = InfoNameLeft
.Top = intPrevBottom 'intPrevTop + 300
.AutoSize = True
.Caption = InfoName
.Visible = True
End With
m_InfoNames.Add lblInfoName, CStr(m_InfoNames.Count)
Set lblInfoMsg = Controls.Add("VB.Label", "lblInfoMsg" & CStr(m_InfoMsgs.Count + 1), tabGroup)
With lblInfoMsg
.Left = InfoMsgLeft
.Top = intPrevBottom
.AutoSize = True
.BorderStyle = 1
.BackColor = &H80000018
.Caption = InfoMsg
.WordWrap = True
If (.Width + .Left > picMain.Width - 300) Then
.Width = picMain.Width - .Left - 300
End If
Debug.Print "Width:" & .Width
.Visible = True
End With
m_InfoMsgs.Add lblInfoMsg, CStr(m_InfoMsgs.Count)
Call AddMsgInfo(TabIndex, InfoName, InfoMsg)
AddInfo = True
Exit Function
ErrorHandle:
Debug.Print Err.Description
AddInfo = False
End Function
现在能够成功地添加控件,并添加到指定的TAB页中;也能够成功地删除控件。
问题是:当我成功地删除控件后,当鼠标点了SSTAB刚才被清空一个TAB页之后,程序就崩溃,弹出一个“应用程序错误”窗口,显示“"0x66065c5f"指令引用的"0x00000034"内存。该内存不能为"read"”
请问大家有没有什么经验或者建议。不胜感谢!相关代码如下:'测试代码
Private Sub btnAddInfos_Click()
Call HostInfoControl1.AddInfo(0, "测试", "中国要在二要中国要在二要中国要在二要中国要在二要中国要在二要中国要在二要")
Call HostInfoControl1.AddInfo(0, "内存", "内存信息")
Call HostInfoControl1.AddInfo(0, "硬盘", "空间信息1")
Call HostInfoControl1.AddInfo(1, "CPU", "CPU使用信息CPU使用信息CPU使用信息CPU使用信息CPU使用信息CPU使用信息CPU使用信息")
Call HostInfoControl1.AddInfo(1, "CPU", "CPU使用信息2")
Call HostInfoControl1.AddInfo(0, "硬盘", "空间信息2")
Call HostInfoControl1.AddInfo(1, "HTTP", "HTTP服务")
Call HostInfoControl1.AddInfo(2, "HTTPS", "HTTPS服务HTTPS服务HTTPS服务HTTPS服务HTTPS服务HTTPS服务HTTPS服务")
Call HostInfoControl1.AddInfo(0, "硬盘", "空间信息3")
Call HostInfoControl1.AddInfo(2, "HTTPS", "HTTPS服务2")
HostInfoControl1.CurrTab = 0
End SubPrivate Sub btnClearInfos_Click()
Call HostInfoControl1.ClearInfos
End Sub'部分控件代码(HostInfoControl)
'##########################################################################
'#
'# Name: ClearInfos
'# Description: 清除在SSTAB的各页中的消息项
'# Input:
'# Output:
'# Return:
'# 执行成功时返回true
'##########################################################################
Public Function ClearInfos() As Boolean
Dim ix As Integer
Dim objLabel1 As Label
Dim objLabel2 As Label
ClearInfos = False
For ix = 1 To m_InfoNames.Count
Controls.Remove "lblInfoName" & CStr(ix)
Set objLabel1 = m_InfoNames.Item(1)
Set objlable1 = Nothing
m_InfoNames.Remove 1 '如果把此行代码注释则不会出现崩溃
Next
For ix = 1 To m_InfoMsgs.Count
Controls.Remove "lblInfoMsg" & CStr(ix)
Set objLabel1 = m_InfoMsgs.Item(1)
Set objlable1 = Nothing
m_InfoMsgs.Remove 1 '如果把此行代码注释则不会出现崩溃
Next
For ix = 1 To m_MsgInfos.Count
m_MsgInfos.Remove 1
Next
m_InfoCount = 0
ClearInfos = True
End Function'##########################################################################
'#
'# Name: AddInfo(TabIndex, InfoName, InfoMsg)
'# Description: 在SSTAB的指定页中增加一个消息项的方法
'# Input:
'# TabIndex: SSTAB的Tab顺序,从0开始
'# InfoName: 消息项目名称
'# InfoMsg: 消息项的内容
'# Output:
'# Return:
'# 执行成功时返回true
'##########################################################################
Public Function AddInfo(ByVal TabIndex As Integer, ByVal InfoName As String, ByVal InfoMsg As String)
On Error GoTo ErrorHandle
Dim intLastTabInfo As Integer
Dim intPrevBottom As Long
Dim objLabel1 As Label
Dim objLabel2 As Label
If (TabIndex < 0 And TabIndex > TabCount - 1) Then
AddInfo = False
Exit Function
End If
intLastTabInfo = LastIndexOfMsgInfos(TabIndex)
intPrevBottom = 0
If (intLastTabInfo > 0) Then
Set objLabel1 = m_InfoNames.Item(intLastTabInfo)
intPrevBottom = objLabel1.Top + objLabel1.Height
Set objLabel2 = m_InfoMsgs.Item(intLastTabInfo)
If (intPrevBottom < objLabel2.Top + objLabel2.Height) Then
intPrevBottom = objLabel2.Top + objLabel2.Height
End If
intPrevBottom = intPrevBottom + m_VInterval
End If
If (intPrevBottom = 0) Then
intPrevBottom = m_InfoNameTop
End If
tabGroup.object.tab = TabIndex
Set lblInfoName = Controls.Add("VB.Label", "lblInfoName" & CStr(m_InfoNames.Count + 1), tabGroup)
With lblInfoName
.Left = InfoNameLeft
.Top = intPrevBottom 'intPrevTop + 300
.AutoSize = True
.Caption = InfoName
.Visible = True
End With
m_InfoNames.Add lblInfoName, CStr(m_InfoNames.Count)
Set lblInfoMsg = Controls.Add("VB.Label", "lblInfoMsg" & CStr(m_InfoMsgs.Count + 1), tabGroup)
With lblInfoMsg
.Left = InfoMsgLeft
.Top = intPrevBottom
.AutoSize = True
.BorderStyle = 1
.BackColor = &H80000018
.Caption = InfoMsg
.WordWrap = True
If (.Width + .Left > picMain.Width - 300) Then
.Width = picMain.Width - .Left - 300
End If
Debug.Print "Width:" & .Width
.Visible = True
End With
m_InfoMsgs.Add lblInfoMsg, CStr(m_InfoMsgs.Count)
Call AddMsgInfo(TabIndex, InfoName, InfoMsg)
AddInfo = True
Exit Function
ErrorHandle:
Debug.Print Err.Description
AddInfo = False
End Function
请大家帮帮忙,解决问题之后我会加分的。