Как заставить кнопку «отменить» на InputBox выйти из обработки вместо возврата пустой строки? - PullRequest
1 голос
/ 28 июня 2019

У меня есть программа не-VBA, которая принимает пользовательский ввод из серии InputBox, активируемых циклом.Мне нужно, чтобы, если пользователь нажал кнопку «отменить», он вышел из цикла.К сожалению, кнопка «отмена» не делает этого, а вместо этого возвращает пустую строку, которая затем передается в мою функцию проверки входных данных, происходит сбой и выдает сообщение об ошибке.Нажатие «ОК» на проверочном сообщении просто снова вызывает InputBox.Это создает бесконечный цикл отмены> хорошо> отменить> хорошо.Мне нужно, чтобы он работал так, чтобы, когда пользователь нажимал «отменить», InputBox закрывался без отправки какого-либо ввода.Это возможно?Спасибо за любую помощь:)

Вот мой код:

'Assign value to variable
strAmountInput = InputBox("Please enter the monthly rainfall for " & strMonth)


If Validation(strAmountInput) = True Then
    'Set Value for dblAmount
    dblAmount = CDbl(strAmountInput)

    'Add monthly rainfall amount to array, using i as index
    dblMonthlyRain(i) = dblAmount

    'Add item displaying monthly rainfall to listbox
    lstMonthlyRainfall.Items.Add("Rainfall for " & strMonth & " = " & CStr(dblMonthlyRain(i)))
Else
    'Prevent loop from advancing if validation fails, forces user to enter valid input before moving on
    i -= 1

End If

_______________________________________________________________________________________

Private Function Validation(Amount As String) As Boolean

    'Validate user input for InputBox
    If IsNumeric(Amount) = False Then
        MessageBox.Show("Please enter numbers only")
        Return False
    Else
        Return True
    End If

End Function

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Мне нужно, чтобы он работал так, чтобы, когда пользователь нажимает кнопку «Отмена», InputBox закрывался без отправки какого-либо ввода.Это возможно?Спасибо за любую помощь:)

Остальные ответы адресуются с помощью встроенной функции InputBox.Это область, где удобная форма пригодится.Для этого есть два шага:

  • Создание самой формы
  • Создание процедуры-обработчика для верхней эмуляции собственного вызова InputBox

Создание пользовательской формы, котораявыглядит как поле ввода: заголовок, метка, текстовое поле и две кнопки («ОК» и «Отмена»).Преимущество здесь заключается в том, что вы можете выполнять проверку данных на лету в текстовом поле (например, запретить нечисловые записи), а также можете отключить кнопку «ОК», пока в текстовом поле не будет действительной записи.Это хороший подход к проектированию пользовательского интерфейса - обучает пользователя правильно вводить данные.

Создайте функцию, которая принимает аргументы, аналогичные InputBox.В рамках этой функции вы создаете экземпляр пользовательской формы, сначала заполняете ее любыми необходимыми данными (например, устанавливаете метку для вопроса), отображаете пользовательскую форму, ждете ввода пользователя и затем получаете любые ответы.

Интересующая вас часть: что, если они отменят?

Это проще в VBA с типом Variant, поскольку вы можете вернуть логическое значение или строку (или в интеллектуальномполе ввода приближается к целому числу!).Однако Vb.Net не имеет такой роскоши.

Чтобы достичь этого, добавьте дополнительный параметр в свой пользовательский блок ввода вызова ByRef IsCancelled as Boolean.Когда пользователь закрывает форму, ваша пользовательская функция (та, которая эмулирует вызов InputBox) может затем установить флаг отмены на основе ваших пользовательских настроек формы.Пример того, как вы могли бы использовать это в своей основной программе:

Dim noUserInput as Boolean
noUserInput = False
strAmountInput = InputBox("Please enter the monthly rainfall for " & strMonth, noUserInput)
If Not no UserInput Then
    dblAmount = CDbl(strAmountInput)

    'Add monthly rainfall amount to array, using i as index
    dblMonthlyRain(i) = dblAmount

    'Add item displaying monthly rainfall to listbox
    lstMonthlyRainfall.Items.Add("Rainfall for " & strMonth & " = " & CStr(dblMonthlyRain(i)))
End If

Очевидно, что если пользователь отменил, то должна быть причина, поэтому помещение их в бесконечный цикл для продолжения запроса ввода будетраздражает.

То, что я предложил, может показаться дополнительной работой над другими ответами.Однако этот подход можно использовать повторно, и, имея опыт, вы можете адаптировать его к нескольким типам возвращаемых значений, что делает полезную постоянную утилиту для многих программ.

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

0 голосов
/ 28 июня 2019

На основании этого ответа InputBox возвращает строку нулевой длины при нажатии кнопки Отмена, поэтому вы должны проверить это.

strAmountInput = InputBox("Please enter the monthly rainfall for " & strMonth)

If strAmountInput = "" Then
   'Cancel was pressed or no value was entered
Else

  If Validation(strAmountInput) = True Then
     'Set Value for dblAmount
     dblAmount = CDbl(strAmountInput)

     'Add monthly rainfall amount to array, using i as index
     dblMonthlyRain(i) = dblAmount

     'Add item displaying monthly rainfall to listbox
     lstMonthlyRainfall.Items.Add("Rainfall for " & strMonth & " = " & 
     CStr(dblMonthlyRain(i)))
  Else
     'Prevent loop from advancing if validation fails, forces user to enter valid input before moving on
      i -= 1

  End If
End If
...