Страница: 1 |
Страница: 1 |
Вопрос: Часть кода срабатывает быстрее чем надо
Добавлено: 01.09.06 09:45
Автор вопроса: Strike1984 | ICQ: 247188203
Здравствуйте, мне необходимо из listview, в котором хранятся адреса отправителей почты, разослать сообщения автоматом по кнопке, причем если в ящике ОДНО сообщение, то срабатывает ПРАВИЛЬНО, а если 2 и более, то ошибка, по-видимому не успевает завершить call, как уже textbox(отправки) забивается следующими адресами. Как сделать, чтобы только после Call cmdSend_Click, происходило увелечение i, и программа опять шла по кругу?
Private Sub AutoOtpravka_Click()
Dim a As Integer
Dim i As Integer
a = lvMessages.ListItems.Count
Text2.Text = a
For i = 0 To a Step 1
i = i + 1
txtRecipient.Text = lvMessages.ListItems(i).Text 'в зависимости от изменений ошибка здесь или ниже
Call cmdSend_Click
Next
End Sub
Private Sub cmdSend_Click()
Dim i As Integer
'
'prepare attachments
'
For i = 0 To lstAttachments.ListCount - 1
lstAttachments.ListIndex = i
m_strEncodedFiles = m_strEncodedFiles & _
UUEncodeFile(lstAttachments.Text) & vbCrLf
Next i
'
Winsock2.Connect Trim$(txtHostSmtp), 25 'или ошибка здесь
m_StateS = MAIL_CONNECT
End Sub
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
zulus
Вопросов: 2
Ответов: 23
Профиль | | #1
Добавлено: 01.09.06 11:11
Ну насколько я понял трабла у тебя тут:
For i = 0 To a Step 1
i = i + 1
txtRecipient.Text = lvMessages.ListItems(i).Text
Call cmdSend_Click
Next
У тебя i увеличивается на один лишний ЦИФР. Кстати Listview отсчитывает с 1. Т.е. твой код такой должен быть таким:
For I = 1 To a
txtRecipient.Text = lvMessages.ListItems(i).Text
Call cmdSend_Click
Next I
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 01.09.06 11:37
Еще один... Человек пытается рассылать спам из VB даже не представляя элементарного синтаксиса языка.
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 01.09.06 11:42
и не только синтаксиса ((
Номер ответа: 4
Автор ответа:
Strike1984
ICQ: 247188203
Вопросов: 4
Ответов: 2
Профиль | | #4
Добавлено: 07.09.06 08:53
Не собираюсь я заниматься рассылкой спама.
И циклы у меня были правильные, просто я запаганил код, потому что программа не работала, Вот код, я после каждой строчки вставлял MsgBox "типа это ... выполнено", в том числе и в Private Sub cmdSend_Click(), и цикл у меня происходит ровно столько раз, сколько надо, а вот call срабатывает один. Я думаю тут нужна какая-то логическая переменная, чтобы цикл в AutoOtpravka_Click() продолжался, только после того, как Winsock2 закроется сам (после отправки сообщения)?
Private Sub AutoOtpravka_Click()
Dim i As Integer
For i = 1 To lvMessages.ListItems.Count
txtRecipient.Text = lvMessages.ListItems(i).Text
MsgBox "Call cmdSend_Click"
Call cmdSend_Click
Next i
End Sub
Private Sub cmdSend_Click()
Dim i As Integer
'
'prepare attachments
'
For i = 0 To lstAttachments.ListCount - 1
lstAttachments.ListIndex = i
m_strEncodedFiles = m_strEncodedFiles & _
UUEncodeFile(lstAttachments.Text) & vbCrLf
Next i
MsgBox "cmdSend_Click()"
Winsock2.Close
m_StateS = MAIL_CONNECT
Winsock2.Connect Trim$(txtHostSmtp), 25
End Sub
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 07.09.06 11:19
Интересно, а чего ты ожидал? Где у тебя обработка Winsock2_Connect? Немного странно впрягать асинхронную операцию в линейный цикл. Добавь хоть какую-то синхронизацию, либо меняй логику.
Номер ответа: 6
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #6
Добавлено: 09.09.06 14:56
Реализуй очередь вызовов cmdSend_Click() и проблема решена!
Номер ответа: 7
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #7
Добавлено: 09.09.06 14:57
Или вместо Call cmdSend_Click вставь код этой процедуры. Конечно длиннее, но ...