Обнаружение нажатия кнопки «Отмена» в поле ввода VB6

Я создаю приложение VB, которое вначале принимает числа. Я хочу иметь возможность выйти, если пользователь нажмет кнопку отмены в любом из полей ввода. Код:

Private Sub Command1_Click()
Dim a, b, c, d As Integer
Dim response As Integer
Dim a1, b1, c1, d1 As String
a = InputBox("Enter Numerator 1")
b = InputBox("Enter Denominator 1")
c = InputBox("Enter Numerator 2")
d = InputBox("Enter Denominator 2")

a1 = Str(a)
b1 = Str(b)
c1 = Str(c)
d1 = Str(d)

If a1 <> "" And b1 <> "" And c1 <> "" And d1 <> "" Then
'All Actions
...
Else

 response = MsgBox("Are you sure you want to quit?", vbYesNo + vbQuestion, AdditionV1.0")
 If response = vbYes Then
 End
 Else
 Addition.Show
 End If

Я пробовал использовать StrPtr, и он все еще не работает. Что происходит, даже если я нажимаю «Отмена», все равно отображается сообщение об ошибке.

Помощь будет действительно оценена.


person Bharat Kashyap    schedule 01.01.2012    source источник


Ответы (2)


StrPtr это путь. Поскольку вы не показали соответствующий код, невозможно сказать, что вы сделали не так (но в коде все равно есть несколько ошибок). В принципе работает следующее:

Dim a As String
a = InputBox("Enter Numerator 1")
If StrPtr(a) = 0 Then
    ' Nothing was entered.
End If

Я подозреваю, что вы применили проверку к a1 и т. д. вместо исходных переменных. Это не только не работает (Str заставляет строку быть ненулевой), но и не имеет смысла: вообще, для чего нужны эти переменные?

Кроме того, все ваши объявления переменных неверны. Следующее:

Dim a, b, c, d As Integer

объявляет a, b и c как Variant. Только d будет Integer. По этой и по другим причинам (удобочитаемость) никогда не объявляйте несколько переменных в одном выражении. Всегда объявляйте их отдельно. О, и используйте осмысленные имена. a, b, c, d не помогают.

person Konrad Rudolph    schedule 01.01.2012
comment
Зачем StrPtr(a), если Len(a) достаточно? - person Muis; 11.06.2013
comment
@Joshua Потому что этого недостаточно. Вы хотите различать пустой ввод и отсутствие ввода вообще (т. е. кнопку «Отмена»). Тестирование для Len(a) = такое же, как и для a = "", и, как заметил OP, не делает необходимого различия. - person Konrad Rudolph; 11.06.2013
comment
Лично я никогда не сталкивался с кодом, использующим поля ввода, где было бы важно различать их. В тех случаях, когда пользовательский ввод не требуется на 100%, поле ввода является очень плохим решением, а во всех остальных случаях для отмены можно использовать пустой ввод. И то, что ОП хотел отличить, мне тоже не было ясно из вопроса. Но теперь я понимаю, почему вы используете StrPtr. - person Muis; 12.06.2013
comment
@Joshua Если бы дело не требовалось, то в поле не было бы кнопки «Отмена». Существует множество случаев, когда пустой ввод действителен и отличается от отмены действия (хотя OP не является одним из них и, очевидно, в любом случае является плохим вариантом использования поля ввода) — например, всякий раз, когда пользователю предлагается отредактировать существующее значение, которое может быть пустым («Введите новую любимую еду»), где «Отмена», очевидно, вернет старое значение, а не сохранит новое пустое значение. - person Konrad Rudolph; 12.06.2013

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

Я бы предложил сделать что-то вроде этого (обратите внимание, что я изменил переменные на a1, b1,c1,d1 назначения из InputBox):

    Private Sub Command1_Click()
    Dim a, b, c, d As Integer
    Dim response As Integer
    Dim a1, b1, c1, d1 As String

    a1 = InputBox("Enter Numerator 1")
    if (a1 = "")
       exit sub
    endif

    b1 = InputBox("Enter Denominator 1")
    if (b1 = "")
       exit sub
    endif

    c1 = InputBox("Enter Numerator 2")
    if (c1 = "")
       exit sub
    endif

    d1 = InputBox("Enter Denominator 2")
    if (d1 = "")
       exit sub
    endif


    If a1 <> "" And b1 <> "" And c1 <> "" And d1 <> "" Then
    'All Actions
    ...
    Else

     response = MsgBox("Are you sure you want to quit?", vbYesNo + vbQuestion, AdditionV1.0")
     If response = vbYes Then
     End
     Else
     Addition.Show
     End If
person Gopal Nair    schedule 01.01.2012
comment
Спасибо вам обоим, я изменил типы данных числителей и знаменателей на строки, и StrPtr творил чудеса. Конрад, я начинаю изучать Python, и это был всего лишь вопрос, который я пытался задать несколько месяцев назад и наткнулся на него сегодня. Тем не менее, я принял во внимание все ваши советы и теперь буду делать так, как вы сказали. Кроме того, не могли бы вы подсказать мне, с чего начать изучение Python или следует ли мне в первую очередь изучать Python или C++. Я Бхарат из Индии, я учусь в девятом классе. - person Bharat Kashyap; 01.01.2012