Ошибка 457 для listview

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Ошибка 457 для listview

Сообщение strike1984 » 22.08.2006 (Вт) 13:11

Есть программа, которая принимает из внешних источников данные по кнопке, причем при нажатии в первый раз, срабатывает всегда, а при нажатии второй раз вылетает с ошибкой 457. В программе используются textboxы и listview, ошибка скорее всего в listview. Помогите избавиться, так опыт у меня небольшой. Есть ссылка http://www.bousoft.com/articles/art19.php#22 для лечения listboxов, но перенести в свою программу не получается.
Заранее всем благодарен.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.08.2006 (Вт) 13:17

Код кнопки покажи.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 22.08.2006 (Вт) 13:17

Ошибка 457 означает This key is already associated with an element of this collection.
Код кнопки в студию.
Лучший способ понять что-то самому — объяснить это другому.

strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Сообщение strike1984 » 22.08.2006 (Вт) 13:20

For Each c In Controls
If TypeOf c Is TextBox And c.Name <> "txtBody" Then
If Len(c.Text) = 0 Then
MsgBox c.Name & " can't be empty", vbCritical
Exit Sub
End If
End If
Next
m_State = POP3_Connect
Winsock1.Close
Winsock1.LocalPort = 0
Winsock1.Connect txtHost, 110

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.08.2006 (Вт) 13:24

Это не тот код.
Покажи код, где ListView заполняется данными. Скорее всего Winsock1_DataArrival.
Lasciate ogni speranza, voi ch'entrate.

strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Сообщение strike1984 » 22.08.2006 (Вт) 13:27

Private Sub ListMessages()

Dim oMes As CMessage
Dim lvItem As ListItem

For Each oMes In m_colMessages
Set lvItem = lvMessages.ListItems.Add
lvItem.Key = oMes.MessageID
lvItem.Text = oMes.From
lvItem.SubItems(1) = oMes.Subject
lvItem.SubItems(2) = oMes.SendDate
lvItem.SubItems(3) = oMes.Size
Next

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim strData As String

Static intMessages As Integer
Static intCurrentMessage As Integer
Static strBuffer As String
Winsock1.GetData strData
Debug.Print strData

If Left$(strData, 1) = "+" Or m_State = POP3_RETR Then
Select Case m_State
Case POP3_Connect
intMessages = 0
m_State = POP3_USER
Winsock1.SendData "USER " & txtUserName & vbCrLf
Debug.Print "USER " & txtUserName
Case POP3_USER
m_State = POP3_PASS
Winsock1.SendData "PASS " & txtPassword & vbCrLf
Debug.Print "PASS " & txtPassword
Case POP3_PASS
m_State = POP3_STAT
Winsock1.SendData "STAT" & vbCrLf
Debug.Print "STAT"
Case POP3_STAT
intMessages = CInt(Mid$(strData, 5, _
InStr(5, strData, " ") - 5))
If intMessages > 0 Then
m_State = POP3_RETR
intCurrentMessage = intCurrentMessage + 1
Winsock1.SendData "RETR 1" & vbCrLf
Debug.Print "RETR 1"
Else
m_State = POP3_QUIT
Winsock1.SendData "QUIT" & vbCrLf
Debug.Print "QUIT"
MsgBox "You have not mail.", vbInformation
End If
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
Else
Winsock1.Close
MsgBox "POP3 Error: " & strData, _
vbExclamation, "POP3 Error"
End If
End Sub

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 22.08.2006 (Вт) 13:42

Скорее всего ошибка происходит здесь:
Код: Выделить всё
m_colMessages.Add m_oMessage, m_oMessage.MessageID
И вообще, где обработчики ошибок?
Лучший способ понять что-то самому — объяснить это другому.

strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Сообщение strike1984 » 22.08.2006 (Вт) 13:48

Public Sub Add(oMessage As CMessage, Optional sKey As String)

If Len(sKey) = 0 Then
mCol.Add oMessage
Else
mCol.Add oMessage, sKey 'ОШИБКА ЗДЕСЬ
End If

End Sub

Это отрывок из Class Modules
Это моя первая работа где надо ошибки обрабатывать, и пока не очень доходит как, могу выслать исходник с примерным описанием чего хочу сделать.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.08.2006 (Вт) 13:56

Напиши так:
Код: Выделить всё
If Len(sKey) = 0 Then
  mCol.Add oMessage
Else
  If Not Exist(sKey) Then mCol.Add oMessage, sKey 'ОШИБКА ЗДЕСЬ
End If

Функция Exist может выглядеть например так:
Код: Выделить всё
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
Lasciate ogni speranza, voi ch'entrate.

strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Сообщение strike1984 » 22.08.2006 (Вт) 14:02

Private Sub ListMessages()

Dim oMes As CMessage
Dim lvItem As ListItem

For Each oMes In m_colMessages
Set lvItem = lvMessages.ListItems.Add
lvItem.Key = oMes.MessageID 'ТЕПЕРЬ ОШИБКА ЗДЕСЬ
lvItem.Text = oMes.From
lvItem.SubItems(1) = oMes.Subject
lvItem.SubItems(2) = oMes.SendDate
lvItem.SubItems(3) = oMes.Size
Next

End Sub

Теперь ошибка 35602, к сожалению до завтра придется уйти.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.08.2006 (Вт) 14:05

Ключ в рантайме менять не принято, что же тут удивительного.
Set lvItem = lvMessages.ListItems.Add(Key:=oMes.MessageID)
Lasciate ogni speranza, voi ch'entrate.

strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Сообщение strike1984 » 23.08.2006 (Ср) 11:50

Я пишу программу почтовый сервер с автоответчиком, отправка почты работает нормально, прием хромает. Хотя добивался чтобы, он не обращал внимания на эту ошибку 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()

Dim oMes As CMessage
Dim 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
Debug.Print "QUIT"
Else
intCurrentMessage = intCurrentMessage + 1
m_State = POP3_RETR
Winsock1.SendData "RETR " & _
CStr(intCurrentMessage) & vbCrLf
Debug.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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.08.2006 (Ср) 22:02

strike1984
Начни форматировать код. Пора уже. Или наградим.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 38

    TopList