Почему мой вариант VB6 меняется в зависимости от того, когда он назначен? - PullRequest
3 голосов
/ 16 мая 2009

Я новичок в разработке VB6 (и Visual Basic в любой форме), и я столкнулся с проблемой. Ниже могут быть лексические ошибки, потому что я отформатировал код так, чтобы он был немного более читабельным внутри поста, но суть вопроса остается. Вот код

Моя проблема заключается в том, что значения, отображаемые вызовами MsgBox (второй набор, относящийся к переменным scrWord и resWord), различаются в зависимости от того, когда я назначаю переменные scrWord и resWord. Если я назначу переменные scrWord и resWord в первом месте, которое не прокомментировано в коде, показанном выше, то в окнах сообщений в нижней части кода будут напечатаны те строки, которые мне не интересны (например, первое окно сообщения выдаст вывод, похожий на «srcws: resColNum: #») или что-то вроде данных мусора. Обратите внимание, что это означает, что переменная scrWord присвоила статическую строку, которую я использовал в предыдущем окне сообщения. Это НИКОГДА не намеченное поведение, и я понятия не имею, как это происходит.

Если, с другой стороны, присваивание выполняется непосредственно перед окнами сообщений, где присваивание переменной комментируется в приведенном выше коде, тогда переменные выводят другое значение, которое несколько больше похоже на ожидаемое, но не совсем (как правило, две переменные абсолютно одинаковы или одна числовая, если ожидается, что обе переменные будут разными альфа-строками).

Я озадачен этой проблемой и считаю, что это как-то связано с вызовами GetData, возвращающими тип данных Variant.

Спасибо, Evan

Новый код размещен ниже. Все еще не работает.

Dim srcWord As Variant
Dim resWord As Variant

Do While (BinsCol.GetData(grouprownum, 1) = binfromnum And nogroupfound = True)
    Dim groupmismatch As Boolean

    groupmismatch = False

    For j = 1 To FormHyst.GroupList.ListCount


        srcWord = sourceWS.Columns(j).GetData(i, 1)
        resWord = "hello, world"



        MsgBox ("srcws:" & srcWord & vbNewLine &_
                "resws:" & resWord & vbNewLine &_
                "test:" & (resWord <> srcWord))
    Next
Loop

В этом новом коде srcWord и resWord отображают "привет, мир".

Я до сих пор не могу разобраться в этом поведении.

Ответы [ 3 ]

3 голосов
/ 16 мая 2009

Как вы уже сказали, что вы новичок в VB6, вот некоторые общие мысли и советы.

В качестве первого совета: никогда не используйте варианты, если они вам действительно не нужны. Используйте конкретный тип данных, который вы ожидаете. На MSDN есть объяснение того, как варианты работают внутри. При сравнении вариантов происходят неявные преобразования, так что это своего рода азартная игра, если вы действительно не знаете своих данных.

Даже если ваша функция GetData возвращает Variant, вы можете привести значение retrun к определенному типу данных в этом столбце таблицы. Итак, если ваш столбец содержит только строки, приведите его к строке с помощью CStr () и поместите в строковую переменную. То же самое с числами, в двойные или длинные переменные.

Вы также можете использовать функцию VarType для определения реального типа значений, хранящихся в ваших вариантах.

Ниже приведен пример рабочего процесса отладки, но, возможно, он поможет вам отследить вашу проблему:

  1. Включить Option Explicit, чтобы избежать проблем с необъявленными / неправильно написанными переменными. (как уже упоминалось DJ)

  2. Создайте выходные данные отладки после каждой строки, чтобы убедиться, что у вас есть ожидаемые значения, а не что-то еще. Если это невозможно с помощью пошаговой отладки или «Debug.Print», то, возможно, вы можете войти во внешний файл журнала или использовать MsgBox.

  3. Отделите ваш источник от зависимостей внешних компонентов для тестирования. В вашем случае попытайтесь воспроизвести проблему, не читая данные из внешней сетки (например, установите переменные для некоторых конкретных строк). Тогда вы узнаете, есть ли проблема в вашей логике программирования или в данных, которые вы должны обработать.

  4. Всегда проверяйте, что ваш внешний источник данных действительно тот, который вы ожидаете, а не кто-то другой. (Случалось со мной достаточно часто ...) Так что проверьте, какие данные хранятся в вашей сетке (i, j) и соответствуют ли они полученным данным.

Еще один момент: сравнения строк в VB6 чувствительны к регистру, если вы не поместите «Option Compare Text» вверху вашего модуля / класса / формы. Так что "Привет, мир" <> "Привет, мир".

2 голосов
/ 16 мая 2009

Есть ли у вас Option Explicit в верхней части вашего модуля ???

У вас есть опечатка: srcWord против scrWord

1 голос
/ 16 мая 2009

Попробуйте


    Dim srcWord As Variant
    Dim resWord As Variant

Do While (BinsCol.GetData(grouprownum, 1) = binfromnum And nogroupfound = True)


    For columnnum = 1 To FormHyst.GroupList.ListCount

        scrWord = (sourceWS.Columns(columnnum ).GetData(rownum, 1))
        resWord = (resultWS.Columns(columnnum  + 3).GetData(grouprownum, 1))

        MsgBox ("srcColNum:" & columnnum  & vbNewLine & "srcRowNum:" & _
                  rownum)        MsgBox ("resColNum:" & (columnnum  + 3) & vbNewLine & "resRowNum:" & _
                  grouprownum)


        MsgBox ("srcws:" & srcWord)
    Next                                               
Loop


Следующее не имеет никакого смысла

MsgBox ("resws:" & resWord & vbNewLine & "test:" & (resWord <> srcWord))

В результате вы получите "True" или "False" в (resWord <> srcWord)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...