Что нового

Осваивающий, Продвинутый Вывод сообщения в зависимости от ввода пользователя

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Задача:
Создать форму ввода (не имеет значение какую), позволяя вводить только однозначное число.
При вводе 1 выводить сообщение Hello, при вводе 2 сообщение Goodby, при вводе других значении отображать сообщение об ошибке (типа Просили же "1" или "2" :smile:).

Внимание - Обязательные условия задачи:
* Нельзя в скрипте использовать условные операторы / операторы сравнения (While 1...WEnd можно использовать, но не сверять с чем либо).
* Нельзя использовать внешние библиотеки.
* При ошибке нужно дать возможность продолжать вводить число.



Удачи.



И так, в данном конкурсе есть два победителя.

Первый это конечно XpycT, который первым дал правильное решение на первичную задачу.
Получает за это золотую звезду!

И второй это Arei, который первый дал решение на задачу с изменёнными условиями.
Получает за это серебренную звезду!
 
Последнее редактирование модератором:

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Вроде работает :stars:

Код:
GUICreate("1") 
$Input1 = GUICtrlCreateInput("", 10, 80, 55, 21)
GUICtrlSetLimit(-1,1)

GUISetState()

Dim $array[11]

$array[0]="Ошибка"
$array[1]="Hello"
$array[2]="Goodby"
$array[3]="Ошибка"
$array[4]="Ошибка"
$array[5]="Ошибка"
$array[6]="Ошибка"
$array[7]="Ошибка"
$array[8]="Ошибка"
$array[9]="Ошибка"
$array[10]="Ошибка"

While 1

Do
Sleep(100)

Until GUICtrlRead($Input1) 

MsgBox(0, $array[GUICtrlRead($Input1)], $array[GUICtrlRead($Input1)],12)
GUICtrlSetData($Input1,"") 

WEnd


Единственно, можно добавить для инпута стиль $ES_NUMBER (0x2000)
но по умолчанию для этого используется GUIConstants.au3
Не нарушится ли этим другое условие - отсутствие внешних библиотек? :scratch:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
WSWR
помоему, в твой input копипастом можно вставить сколь угодно длинное число, не говоря уже о просто произвольных символах. проверить возможности щас нет
 

XpycT

Скриптер
Сообщения
380
Репутация
133
Код:
Dim $aInputText[3] = ['Вас просили ввести 1 или 2, а не "%s"', 'Вы ввели "%d" это значит Hello', 'Вы ввели "%d" это значит Goodbye']

$sInput = InputBox("Ввод", "Введите 1 или 2", "", " M1", 250, 100)

$aInput = StringRegExp($sInput, "[1|2]", 3)

For $m = 0 To UBound($aInput) - 1
	Exit 99 * 0 + MsgBox(64, "Сообщение", StringFormat($aInputText[$aInput[0]], $aInput[0]))
Next
MsgBox(16, "Сообщение", StringFormat($aInputText[0], $sInput))
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Добавлю ещё условие:
При ошибке нужно дать возможность продолжать вводить число.

P.S.
WSWR
Do Until это своего рода условие. While 1...WEnd можно использовать, но не сверять с чем либо.
А также форма не закрывается.

XpycT
Решение хорошое, мне нравится, но оно позволяет вводить не только числа.
 

XpycT

Скриптер
Сообщения
380
Репутация
133
2-ой Вариант

Код:
Opt("GUIOnEventMode", 1)
GUICreate("Ввод", 250, 65, -1, -1)
GUISetOnEvent(-3, "_Close")

GUICtrlCreateLabel("Введите 1 или 2", 0, 0, 250, 20)
$nInput = GUICtrlCreateInput("", 0, 20, 250, 20, 0x2000)
GUICtrlSetLimit($nInput, 1)

$nOk = GUICtrlCreateButton("OK", 0, 45, 125, 20)
GUICtrlSetOnEvent(-1, "_ShowMsg")

$nCl = GUICtrlCreateButton("Cancel", 125, 45, 125, 20)
GUICtrlSetOnEvent(-1, "_Close")

GUISetState()

While 1
	Sleep(100)
WEnd

Func _ShowMsg()
	Dim $aInputText[3] = ['Вас просили ввести 1 или 2, а не "%s"', 'Вы ввели "%d" это значит Hello', 'Вы ввели "%d" это значит Goodbye']

	$sInput = GUICtrlRead($nInput)
	$aInput = StringRegExp($sInput, "[1|2]", 3)

	For $m = 0 To UBound($aInput) - 1
			Exit 99 * 0 + MsgBox(64, "Сообщение", StringFormat($aInputText[$aInput[0]], $aInput[0]))
	Next
	MsgBox(16, "Сообщение", StringFormat($aInputText[0], $sInput))
	GUICtrlSetData($nInput, "")
	GUICtrlSetState($nInput, 256) ; $GUI_FOCUS
EndFunc

Func _Close()
	Exit
EndFunc
 

focus

Осваивающий
Сообщения
69
Репутация
20
Вариант - шутка
-- Создать форму ввода (не имеет значение какую) --
Код:
GUICreate('ListView Get Selected Indices', 392, 322)


					$aButton1 = GUICtrlCreateButton(' ж м и ', 10, 30 , 90, 30)
                         $aButton2 = GUICtrlCreateButton('ж м и ', 120, 30 , 90, 30)
                         $aButton3 = GUICtrlCreateButton('проиграеш ! ', 230, 30 , 90, 30)


					GUISetState()

					While 1
						$hMsg = GUIGetMsg()
						Switch $hMsg


							

							Case $aButton1
								GUICtrlCreateLabel(1 , 16, 10, 11, 14)
								MsgBox(0,'Hello' ,'Ты выиграл',12)
			

							Case $aButton2
								GUICtrlCreateLabel(2 , 16, 10, 11, 14)
								MsgBox(0,'Goodby' ,'Ты опять выиграл',12)

							Case $aButton3
								GUICtrlCreateLabel('' , 16, 10, 11, 14)
								MsgBox(16,'Goodby' ,'Говорили проиграеш',12)

						EndSwitch
					WEnd
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
XpycT [?]
Браво! :ok:
Это тот же метод который я и задумывал изначально, правда у меня немного по другому, у меня нет лишних циклов:

Код:
Dim $aArr[10][2] = [[0, 'Error'], [1, 'Hello'], [2, 'Goodby'], [3, 'Error'], [4, 'Error'], [5, 'Error'], [6, 'Error'], [7, 'Error'], [8, 'Error'], [9, 'Error']]

Opt('GUIOnEventMode', 1)

$hGUI = GUICreate('Введите "1" или "2":', 300, 40)
GUISetOnEvent(-3, '_ExitEvent')
$iInput = GUICtrlCreateInput('', 0, 0, 300, 20, 0x2000)
GUICtrlSetLimit(-1, 1)
$iBttn = GUICtrlCreateButton('ОК', 0, 21, 300, 19)
GUICtrlSetOnEvent(-1, '_OKEvent')
GUICtrlSetState(-1, 0x200)
GUISetState(@SW_SHOW, $hGUI)

While 1
	Sleep(10)
WEnd

Func _ExitEvent()
	Exit
EndFunc

Func _OKEvent()
	Local $i = GUICtrlRead($iInput)
	Call('_' & $aArr[$i][1], $i)
EndFunc

Func _Error($i)
	MsgBox(48, 'Ммм...', 'Просили же "1" или "2" а не "' & $i & '"', 0, $hGUI)
EndFunc

Func _Hello($i)
	_Goodby($i)
EndFunc

Func _Goodby($i)
	GUIDelete($hGUI)
	MsgBox(64, 'ОК', $aArr[$i][1])
	Exit
EndFunc
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
А вот я прикалывался, просто для себя ;D

Код:
Opt('GUIOnEventMode', 1)

Dim $sResult[11][2] = [['Ошибка', 'Error'], ['Hello', 'Sucess'], ['Goodby', 'Sucess'], _
					   ['Ошибка', 'Error'], ['Ошибка', 'Error'], ['Ошибка', 'Error'], _
					   ['Ошибка', 'Error'], ['Ошибка', 'Error'], ['Ошибка', 'Error'], _
					   ['Ошибка', 'Error']]

GUICreate('', 100, 40)
GUISetOnEvent(-3, '_Exit')
$Input = GUICtrlCreateInput('', 0, 0, 100, 20, 0x2000)
GUICtrlSetLimit($Input, 1)
$Button = GUICtrlCreateButton('OK', 0, 20, 100, 20)
GUISetState()

While 1
	GUICtrlSetOnEvent($Button, $sResult[GUICtrlRead($Input)][1])
	Sleep(50)
Wend	
	
Func Sucess()
	MsgBox(64, 'Результат:', $sResult[GUICtrlRead($Input)][0])
	_Exit()
EndFunc	

Func Error()
	MsgBox(16, 'Результат:', $sResult[GUICtrlRead($Input)][0])
EndFunc	

Func _Exit()
	Exit
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Немного попробуем изменить условия задачи:

* Создайте InputBox, позволяя вводить только один символ.
* При вводе 1 выводить сообщение 'Вы ввели "...", а значит "Hello"', и затем завершать работу скрипта.
* При вводе 2 выводить сообщение 'Вы ввели "...", а значит "Goodby"', и затем завершать работу скрипта.
* При вводе других значении отображать сообщение об ошибке 'Нужно ввести "1" или "2", а вы ввели "..."', и затем продолжать просить ввод символа.
* Нельзя в скрипте использовать условные операторы / операторы сравнения (While 1...WEnd можно использовать, но не сверять с чем либо).
* Можно использовать только один цикл (While 1...WEnd)
* Нельзя использовать массивы.
* Нельзя использовать внешние библиотеки.


Добавлено:
Сообщение автоматически объединено:

И ещё дополнил, нельзя использовать массивы :laugh:
 

Arei

Скриптер
Сообщения
938
Репутация
115
Код:
Input()

While 1
	Sleep(50)
Wend

Func Input()
	$Input = InputBox('', '', '', ' M1', 200, 100)
	Execute('_' & $Input & '(' & $Input & ')')
	MsgBox(64, 'Результат:', 'Нужно ввести "1" или "2", а вы ввели "' & $Input & '"')
	Input()
EndFunc

Func _1($Var)
	MsgBox(64, 'Результат:', 'Вы ввели "' & $Var & '", а значит "Hello"')
	Exit
EndFunc

Func _2($Var)
	MsgBox(64, 'Результат:', 'Вы ввели "' & $Var & '", а значит "Goodby"')
	Exit
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Arei
Неплохо, но нет реакции на Cancel (т.е скрипт не завершает работу).
И ещё, желательно не использовать рекурсию :smile:
 

Arei

Скриптер
Сообщения
938
Репутация
115
Код:
Input()

While 1
	Sleep(50)
Wend	

Func Input()
	$Input = InputBox('', '', '', ' M1', 200, 100)
	Execute('_V' & $Input & '()')
	MsgBox(64, 'Результат:', 'Нужно ввести "1" или "2", а вы ввели "' & $Input & '"')
	Input()
EndFunc	

Func _V1()
	MsgBox(64, 'Результат:', 'Вы ввели "1", а значит "Hello"')
	Exit
EndFunc

Func _V2()
	MsgBox(64, 'Результат:', 'Вы ввели "2", а значит "Goodby"')
	Exit
EndFunc

Func _V()
	Exit
EndFunc



Добавлено:
Сообщение автоматически объединено:

Код:
AdlibRegister('Input', 10)

While 1
	Sleep(50)
Wend	

Func Input()
	$Input = InputBox('', '', '', ' M1', 200, 100)
	Execute('_V' & $Input & '()')
	MsgBox(64, 'Результат:', 'Нужно ввести "1" или "2", а вы ввели "' & $Input & '"')
EndFunc	

Func _V1()
	MsgBox(64, 'Результат:', 'Вы ввели "1", а значит "Hello"')
	Exit
EndFunc

Func _V2()
	MsgBox(64, 'Результат:', 'Вы ввели "2", а значит "Goodby"')
	Exit
EndFunc

Func _V()
	Exit
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Arei
Отлично!

Вот мой вариант:

Код:
While 1
	$i = InputBox('Ввод', 'Введите 1 или 2:', Eval('i'), ' M1')
	
	Call('_Exit' & $i) 	;Cancel
	Call('_' & $i)		;1 or 2
	
	MsgBox(48, 'Ммм...', 'Нужно ввести "1" или "2", а вы ввели "' & $i & '"')
WEnd

Func _Exit()
	Exit -1
EndFunc

Func _1()
	MsgBox(64, 'ОК', 'Вы ввели "1", а значит "Hello"')
	Exit 1
EndFunc

Func _2()
	MsgBox(64, 'ОК', 'Вы ввели "2", а значит "Goodby"')
	Exit 2
EndFunc



Добавлено:
Сообщение автоматически объединено:

И так, в данном конкурсе есть два победителя.

Первый это конечно XpycT, который первым дал правильное решение на первичную задачу.
И второй это Arei, который первый дал решение на задачу с изменёнными условиями.



OffTopic:
P.S.
Так и думал что нужно было делать для новичков и осваивающих, а то что то довольно быстро решили :beer: .
 

Arei

Скриптер
Сообщения
938
Репутация
115
Не плохо.


Добавлено:
Сообщение автоматически объединено:

Корыстный вопрос,а что за это будет?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
;D вот так получилось

Код:
While 1
	$Msg1 = 'SetExtended(MsgBox(64, "ОК", "Вы ввели 1, а значит Hello"), _Exit())'
	$Msg2 = 'SetExtended(MsgBox(64, "ОК", "Вы ввели 2, а значит Goodby"), _Exit())'
	$Msg = '_Exit()'
    $i = InputBox('Ввод', 'Введите 1 или 2:', Eval('i'), ' M1')
	Execute(Eval('Msg' & $i))
    MsgBox(48, 'Ммм...', 'Нужно ввести "1" или "2", а вы ввели "' & $i & '"')
WEnd

Func _Exit()
    Exit 
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Верх