Часть кода срабатывает быстрее, или цикл for неправильный

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

Часть кода срабатывает быстрее, или цикл for неправильный

Сообщение strike1984 » 01.09.2006 (Пт) 8:46

Здравствуйте, мне необходимо из 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

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Часть кода срабатывает быстрее, или цикл for неправильны

Сообщение Viper » 01.09.2006 (Пт) 8:58

Во-первых, тэги форматирования до сих пор никто не отменял.
Во-вторых, смотри комменты

Код: Выделить всё
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 ' зачем здесь Step 1? И должно быть a - 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


и в-третьих, какова связь этих процедур между стобой, помимо того, что воторая вызывается из первой?

З.Ы. об общей бредововти кода я не говорю
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение alibek » 01.09.2006 (Пт) 8:58

strike1984, во-первых, используй тэги для форматирования кода.
Во-вторых, если a = lvMessages.ListItems.Count, то почему цикл начинается с нуля?
В-третьих, зачем внутри цикла i=i+1?
В-четвертых, ошибка возникает не из-за того, что не успевает завершиться Call. Ошибка из-за того, что надо понимать используемый код хотя бы в общих чертах, а не бездумно копировать. Работа с сокетами рассматривается в статьях на сайте, почитай их внимательно, тогда сам найдешь, свою ошибку.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение strike1984 » 07.09.2006 (Чт) 8:01

Почитал я инфу, да программирование тяжело до меня бывает доходит, я до этого программировал чат, тоже через винсоки, так что понятие его работы есть, циклы у меня были правильные, просто я запаганил код, потому что программа не работала, Вот код, я после каждой строчки вставлял 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

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 07.09.2006 (Чт) 11:04

Есть говоришь понятие о Winsock? Тогда задумайся о понятиях синхронное и асинхронное выполнение методов. А также вспомни о существовании событий радостно оповещающих тебя о завершении тех или иных операций с сокетом.

И еще раз напоминаю о существовании тэгов форматирования на форуме!
Весь мир матрица, а мы в нем потоки байтов!


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

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

Сейчас этот форум просматривают: Mail.ru [бот], SemrushBot и гости: 140

    TopList