Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить кнопку Cancel в InputBox? 
:(
    Опции темы
korob2001
Дата 4.1.2005, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Всем привет!
Возникла проблема.

На форму добавляю такие элементы:
Label
Name = lblName
Caption = ""
Alignment = 2 - Center
CommandButton
Name = cmdName
Caption = "Ввод имени"

Пишу для кнопки такой обработчик события Click:
Код

Private Sub cmdName_Click()
   Dim sMsg As String
   Dim sName As String
   sMsg = "Введите ваше имя:"
   sName = InputBox(sMsg, "Ввод имени пользователя", "")
   If Len(sName) > 0 Then
       lblName.Caption = "Привет, " & sName & "!"
   Else
       MsgBox "Укажите ваше имя", vbOKOnly + vbCritical, "Ошибка"
       cmdName_Click
   End If
End Sub

Вобщем нужно проверить, что пользователь ввел хотя бы один символ в InputBox и если это так, то вывести приветствие в lblName. Если поле пустое, то вывести сообщение и вернуть пользователя к вводу имени. Все вроде нормально, но если пользователь жмёт кнопку Cancel в диалоговом окне InputBox, то нужно закрыть диалоговое окно и вернуться к форме, не производя никаких действий.
Проблема в том, что когда пользователь жмёт Cancel, то InputBox возвращает 0 и я не могу его отличить от того, когда пользователь ничего не ввел и нажал кнопку "OK".

Подскажите как осуществить такую проверку?

Заранее спасибо,
Денис

Это сообщение отредактировал(а) korob2001 - 4.1.2005, 15:49


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
boevik
Дата 4.1.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 12
Всего: 35



Никак.
Или дай значение по умалчанию, например "Гость".
И тогда если Len(sName) = 0, то нажали Cancel.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Staruha
Дата 4.1.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 2
Всего: 27



Но ведь кнопка Cancel сама может сказать программе,что ее нажали.Добавь через And еще одно условие.


--------------------
Возмездие настигнет
PM MAIL   Вверх
cardinal
Дата 4.1.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



korob2001, boevik прав. Но только я бы немного подругому твой код написал...
Код

Option Explicit

Private Sub Command1_Click()
Dim Message, Title, Default, MyValue
Message = "Имя пользователя"   ' Set prompt.
Title = "InputBox Demo"   ' Set title.
Default = "Введите ваше имя..."   ' Set default.
' Display message, title, and default value.

MyValue = Default
Do While MyValue = Default
   MyValue = InputBox(Message, Title, Default)
   If MyValue = Default Then
      MsgBox "Укажите ваше имя", vbOKOnly + vbCritical, "Ошибка"
   End If
Loop

If MyValue <> "" Then lblName.Caption = "Привет, " & sName & "!"
End Sub



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
bom
Дата 4.1.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Hi!
Имхо Старуха права:
Код

Dim inptbox As String
inptbox = InputBox("Prompt", "title", "default")
If Len(inptbox) <> 0 And vbOK Then _
MsgBox "Юзверь ввел " & inptbox & " и нажал ОК" _
Else MsgBox "Юзверь нажал Cancel"

PM MAIL   Вверх
Staruha
Дата 4.1.2005, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 2
Всего: 27



Сястье - это когда тебя понимают! smile


--------------------
Возмездие настигнет
PM MAIL   Вверх
bom
Дата 4.1.2005, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Сорри Старуха, похоже vbOK здесь не прокатит smile
Надо юзать вариант cardinala
PM MAIL   Вверх
Staruha
Дата 4.1.2005, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 2
Всего: 27



Я имела ввиду
Private Sub Command1_Click()
Text1.Text = "Ой,меня нажали"
End Sub

Private Sub Command2_Click()
If Text1.Text = "Ой,меня нажали" Then
MsgBox "Юзер ушел"
End If
End Sub



--------------------
Возмездие настигнет
PM MAIL   Вверх
bom
Дата 5.1.2005, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Интересный вопрос однако...
Кроме как отслеживать имя кнопки под курсором в момент ее нажатия ничего умного в голову не приходит:
Код

'Modul
Option Explicit
Public PushedButton As String, timerID As Long
Dim sWindowText As String * 100
Dim cur As POINTAPI
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function SetTimer& Lib "user32" (ByVal hwnd&, ByVal nIDEvent&, ByVal uElapse&, ByVal lpTimerFunc&)
Private Declare Function KillTimer& Lib "user32" (ByVal hwnd&, ByVal nIDEvent&)
Private Type POINTAPI
X As Long
Y As Long
End Type

Private Sub TimerProc(ByVal hwnd&, ByVal uMsg&, ByVal idEvent&, ByVal dwTime&)
GetCursorPos cur
PushedButton = Left$(sWindowText, GetWindowText(WindowFromPoint(cur.X, cur.Y), sWindowText, 100))
End Sub

Public Function StartTimer(ByVal lngInterval As Long) As Long
StartTimer = SetTimer(0, 0, lngInterval, AddressOf TimerProc)
End Function

Public Sub CloseTimer(ByVal mtimerID As Long)
KillTimer 0, mtimerID
End Sub

'Form
Option Explicit
Private Sub cmdName_Click()
  Dim sMsg As String
  Dim sName As String
  sMsg = "Введите ваше имя:"
  timerID = StartTimer(10)
  sName = InputBox(sMsg, "Ввод имени пользователя", "")
  CloseTimer timerID
  If Len(sName) > 0 Then
      lblName.Caption = "Привет, " & sName & "!"
  Else
      MsgBox "Ты нажал " & PushedButton
      MsgBox "Укажите ваше имя", vbOKOnly + vbCritical, "Ошибка"
      cmdName_Click
  End If
End Sub


Недостаток - не отслеживается нажатие с клавиатуры. smile
Есть ли другие способы? smile


Цитата
Я имела ввиду
Private Sub Command1_Click()
Text1.Text = "Ой,меня нажали"

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

PM MAIL   Вверх
Staruha
Дата 5.1.2005, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 2
Всего: 27



грубо говоря
Код

If Len(sName) > 0 Then

надо заменить на
Код

If Len(sName) > 0 And Text1.Text = "Ой,меня нажали" Then

а Text1.Text - надо заменить переменной.Так просто наглядней


--------------------
Возмездие настигнет
PM MAIL   Вверх
Naghual
Дата 5.1.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Старуха, ты говориш о форме с кнопками, код которых можно намудрить глубоко по желанию. Тут вопросов нет.
Только вот korob2001 спрашивал о InputBox. Там невозможно запрограммировать кнопки.

Вы говорите о разных вещах.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
bom
Дата 5.1.2005, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



2Старуха
Способ хороший, но он тоже не подходит для определения какая кнопка была нажата (ОК или Отмена) когда Len(sName) = 0. А именно этот вопрос, как я понимаю, является основным в этом топике.
PM MAIL   Вверх
Staruha
Дата 5.1.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 2
Всего: 27



Цитата
2Старуха
- хотела заплакать ,но подходящего смалика не нашла. smile. Я еще подумаю. А вообще-то где korob2001?


--------------------
Возмездие настигнет
PM MAIL   Вверх
korob2001
Дата 5.1.2005, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Цитата

Никак.
Или дай значение по умалчанию, например "Гость".
И тогда если Len(sName) = 0, то нажали Cancel.

Да, но ведь значение по умолчанию может быть и удалено, после чего юзер может нажать OK. Хотя, в принципе, ничего другово не остаётся.
Цитата

korob2001, boevik прав. Но только я бы немного подругому твой код написал...

Согласен. ;))))
Цитата

Старуха, ты говориш о форме с кнопками, код которых можно намудрить глубоко по желанию. Тут вопросов нет.
Только вот korob2001 спрашивал о InputBox. Там невозможно запрограммировать кнопки.

Вы говорите о разных вещах.

Да, я имел ввиду именно InputBox.
Цитата

хотела заплакать ,но подходящего смалика не нашла. . Я еще подумаю. А вообще-то где korob2001?

Только без слёз. Кнопка Cancel на InputBox того не стоит. ;))))))))

To All
Как я понял невозможно проконтролировать кнопки на InputBox.
Мда....
Может добавить к проекту стандартную форму и самому сделать что-то типа InputBox? Наверное так и поступлю.

Всем большое спасибо.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
cardinal
Дата 5.1.2005, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Во нашел:
Alan Young еще в 2002 году smile написал следующее:
You display an InputBox. But did the user press Cancel - or OK without entering anything? If you thought there was no way to tell the difference, you're wrong.

You see, if the user presses cancel, vbNullString is returned. However if they press OK, the empty string ("") is sent back. But in Visual Basic, vbNullString equates to an empty string, so you can't compare the two - even though in reality, they're completely different.

However you can use the StrPtr ('string pointer') function to determine whether the return string is indeed a vbNullString - as by definition, a vbNullString 'pointer' is zero.

And this code demonstrates how to do that.
Код

Dim strInput As String

strInput = InputBox("Enter something:")

If StrPtr(strInput) = 0 Then
    MsgBox "You pressed cancel!"
End If

www.developer.com

То есть то, что я тогда написал превращается в
Код

Option Explicit

Private Sub Command1_Click()
Dim Message As String
Dim Title As String
Dim MyValue As String
Message = "Имя пользователя"   ' Set prompt.
Title = "Введите ваше имя"

Do While True
  MyValue = InputBox(Message, Title, "")
  If MyValue = "" And StrPtr(MyValue) <> 0 Then
     MsgBox "Укажите ваше имя", vbOKOnly + vbCritical, "Ошибка"
  Else
     Exit Do
  End If
Loop

If MyValue <> "" Then MsgBox "Привет, " & MyValue & "!"
End Sub



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.