Бага? Зависание Exe-шника при Exit For...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Бага? Зависание Exe-шника при Exit For...

Сообщение Andrey Fedorov » 23.07.2007 (Пн) 11:21

Столкнулся с довольно интересным багом - в программе есть код:

Код: Выделить всё
For j = .LeftCol + .Cols - 1 To k Step -1
    If b Then
        With mCols(j)
            If .Left > 0 Then
                x2 = .Left + .Width
                b = False
'                Exit For
            End If
        End With
    End If
Next j


При выполнении данного кода из скомпилитрованного OCX он работает нормально, но если раскомментировать строку с Exit For и скомпилить новый ocx, то программа зависает (хотя процедура с данным кодом успешно завершается).

Переменная b в данном коде была добавлена лишь для того чтобы обойтись без Exit For...

Желающие посмотреть сей эффект лично должны иметь установленный Janus GridEx 2000 и скачать исходники здесь: http://bbs.vbstreets.ru/viewtopic.php?t=33779 (код там был сегодня обновлен).

Далее в методе RefreshHeader UserControl-a GridHeader найти вышеприведенный участок кода...

В общем, кто может - проверьте, есть ли этот эффект на ваших компах...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 23.07.2007 (Пн) 16:12

Опытным путем было установлено что если Exit For вытащить за пределы With, то зависание не происходит.

То бишь нормально работает код:

Код: Выделить всё
                        For j = .LeftCol + .Cols - 1 To k Step -1
                            With mCols(j)
                                If .Left > 0 Then
                                    x2 = .Left + .Width
                                    b = False
                                End If
                            End With
                            If Not b Then Exit For
                        Next j


При пристальном рассотрении Help-a по With обнаружилось:

Note: In general, it's recommended that you don't jump into or out of With blocks. If statements in a With block are executed, but either the With or End With statement is not executed, a temporary variable containing a reference to the object remains in memory until you exit the procedure.


Так что не бага.... А просто нарвался на фичу, которая проявилась лишь в скомпилированном OCX, причем в довольно интересном виде...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 25.07.2007 (Ср) 11:57

+1


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 56

    TopList