Есть программа, которая принимает из внешних источников данные по кнопке, причем при нажатии в первый раз, срабатывает всегда, а при нажатии второй раз вылетает с ошибкой 457. В программе используются textboxы и listview, ошибка скорее всего в listview. Помогите избавиться, так опыт у меня небольшой. Есть ссылка http://www.bousoft.com/articles/art19.php#22 для лечения listboxов, но перенести в свою программу не получается.
Заранее всем благодарен.
On Error Resume Next 'при ошибке переходим на след. строку
On Error GoTo i_err 'при ошибке переходим на строку с меткой "i_err"
On Error GoTo 0 'контроль ошибок отключен
Поясни точнее, что делает программа, что выдается эта ошибка? Лучше еще и кусок кода.
Я пишу программу почтовый сервер с автоответчиком, отправка почты работает нормально, прием хромает. Хотя добивался чтобы, он не обращал внимания на эту ошибку 457, но и измений не происходило в listview, или сообщения суммировались каждый раз с нажатием кнопки.
Function Exist(sKey As String) As Boolean
Dim Item
On Error Resume Next
Set Item = mCol.Item(sKey)
If Err.Number = 0 Then Exist = True
On Error GoTo 0
End Function
Public Sub Add(oMessage As CMessage, Optional sKey As String)
If Len(sKey) = 0 Then
mCol.Add oMessage
Else
If Not Exist(sKey) Then mCol.Add oMessage, sKey 'ОШИБКА ЗДЕСЬ
End If
End Sub
Private Sub ListMessages()
 im oMes As CMessage
 im lvItem As ListItem
For Each oMes In m_colMessages
Set lvItem = lvMessages.ListItems.Add(Key:=oMes.MessageID) 'Ошибка здесь, я немного доработал, и она непостоянная, даже если программа срабатывает правильно второй раз, что я вижу по msgbox, то проблема именно с listview
lvItem.Key = oMes.MessageID 'Работает независимо, комментирую эту строку или нет
lvItem.Text = oMes.From
lvItem.SubItems(1) = oMes.Subject
lvItem.SubItems(2) = oMes.SendDate
lvItem.SubItems(3) = oMes.Size
Next
Еще не могу понять ошибку, почему winsock не закрывает connect.
Case POP3_RETR
strBuffer = strBuffer & strData
If InStr(1, strBuffer, vbLf & "." & vbCrLf) Then
strBuffer = Mid$(strBuffer, InStr(1, strBuffer, vbCrLf) + 2)
strBuffer = Left$(strBuffer, Len(strBuffer) - 3)
Set m_oMessage = New CMessage
m_oMessage.CreateFromText strBuffer
m_colMessages.Add m_oMessage, m_oMessage.MessageID
Set m_oMessage = Nothing
strBuffer = ""
If intCurrentMessage = intMessages Then
m_State = POP3_QUIT
Winsock1.SendData "QUIT" & vbCrLf
 ebug.Print "QUIT"
Else
intCurrentMessage = intCurrentMessage + 1
m_State = POP3_RETR
Winsock1.SendData "RETR " & _
CStr(intCurrentMessage) & vbCrLf
 ebug.Print "RETR " & intCurrentMessage
' скорее всего в этой части, выполнение POP_QUIT должно ссылаться на несколько строк выше.
End If
End If
Case POP3_QUIT
Winsock1.Close
Call ListMessages
End Select
Else
Winsock1.Close
MsgBox "POP3 Error: " & strData, _
vbExclamation, "POP3 Error"
End If
Конечно работает, но работает, потому что в предыдущей строке ты уже присвоил стройство key, в этой строке смысла нет.
Лучше сразу замени
Set lvItem = lvMessages.ListItems.Add(Key:=oMes.MessageID)
на
Set lvItem = lvMessages.ListItems.Add(, oMes.MessageID, oMes.From)
Еще смотри, подровнял твою подпрограмму:
Dim oMes As CMessage
Dim lvItem As ListItem
For Each oMes In m_colMessages
Set lvItem = lvMessages.ListItems.Add(Key:=oMes.MessageID)
lvItem.Key = oMes.MessageID
lvItem.Text = oMes.From
lvItem.SubItems(1) = oMes.Subject
lvItem.SubItems(2) = oMes.SendDate
lvItem.SubItems(3) = oMes.Size
Next
'где select case? С чем сравниваешь?
Case POP3_RETR
strBuffer = strBuffer & strData
If InStr(1, strBuffer, vbLf & "." & vbCrLf) Then
strBuffer = Mid$(strBuffer, InStr(1, strBuffer, vbCrLf) + 2)
strBuffer = Left$(strBuffer, Len(strBuffer) - 3)
Set m_oMessage = New CMessage
m_oMessage.CreateFromText strBuffer
m_colMessages.Add m_oMessage, m_oMessage.MessageID
Set m_oMessage = Nothing
strBuffer = ""
If intCurrentMessage = intMessages Then
m_State = POP3_QUIT
Winsock1.SendData "QUIT" & vbCrLf
 ebug.Print "QUIT"
Else
intCurrentMessage = intCurrentMessage + 1
m_State = POP3_RETR
Winsock1.SendData "RETR " & _
CStr(intCurrentMessage) & vbCrLf
 ebug.Print "RETR " & intCurrentMessage
End If
End If
Case POP3_QUIT
Winsock1.Close
Call ListMessages
End Select'вот, End Select есть, а Select Case нету
Else'Else и End if есть, а где условие?
Winsock1.Close
MsgBox "POP3 Error: " & strData, _
vbExclamation, "POP3 Error"
End If
Конечно работает, но работает, потому что в предыдущей строке ты уже присвоил стройство key, в этой строке смысла нет.
Лучше сразу замени
Set lvItem = lvMessages.ListItems.Add(Key:=oMes.MessageID)
на
Set lvItem = lvMessages.ListItems.Add(, oMes.MessageID, oMes.From)
Еще смотри, подровнял твою подпрограмму:
Dim oMes As CMessage
Dim lvItem As ListItem
For Each oMes In m_colMessages
Set lvItem = lvMessages.ListItems.Add(Key:=oMes.MessageID)
lvItem.Key = oMes.MessageID
lvItem.Text = oMes.From
lvItem.SubItems(1) = oMes.Subject
lvItem.SubItems(2) = oMes.SendDate
lvItem.SubItems(3) = oMes.Size
Next
'где select case? С чем сравниваешь?
Case POP3_RETR
strBuffer = strBuffer & strData
If InStr(1, strBuffer, vbLf & "." & vbCrLf) Then
strBuffer = Mid$(strBuffer, InStr(1, strBuffer, vbCrLf) + 2)
strBuffer = Left$(strBuffer, Len(strBuffer) - 3)
Set m_oMessage = New CMessage
m_oMessage.CreateFromText strBuffer
m_colMessages.Add m_oMessage, m_oMessage.MessageID
Set m_oMessage = Nothing
strBuffer = ""
If intCurrentMessage = intMessages Then
m_State = POP3_QUIT
Winsock1.SendData "QUIT" & vbCrLf
Debug.Print "QUIT"
Else
intCurrentMessage = intCurrentMessage + 1
m_State = POP3_RETR
Winsock1.SendData "RETR " & _
CStr(intCurrentMessage) & vbCrLf
Debug.Print "RETR " & intCurrentMessage
End If
End If
Case POP3_QUIT
Winsock1.Close
Call ListMessages
End Select'вот, End Select есть, а Select Case нету
Else'Else и End if есть, а где условие?
Winsock1.Close
MsgBox "POP3 Error: " & strData, _
vbExclamation, "POP3 Error"
End If