Автор Тема: [Осваивающий, Продвинутый] Вывод сообщения в зависимости от ввода пользователя  (Прочитано 15974 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7805
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Задача:
Создать форму ввода (не имеет значение какую), позволяя вводить только однозначное число.
При вводе 1 выводить сообщение Hello, при вводе 2 сообщение Goodby, при вводе других значении отображать сообщение об ошибке (типа Просили же "1" или "2" :)).

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



Удачи.



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

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

И второй это Arei, который первый дал решение на задачу с изменёнными условиями.
Получает за это серебренную звезду!
« Последнее редактирование: Декабрь 05, 2012, 19:43:37 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн WSWR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 926
  • Репутация: 351
    • Награды
  • Версия AutoIt: 3.3.14.0
Вроде работает  :stars:

Код: AutoIt [Выделить]
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
Не нарушится ли этим другое условие - отсутствие внешних библиотек? :think:
« Последнее редактирование: Март 13, 2012, 14:50:32 от WSWR »

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
WSWR
помоему, в твой input копипастом можно вставить сколь угодно длинное число, не говоря уже о просто произвольных символах. проверить возможности щас нет


Русское сообщество AutoIt


Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 131
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
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))

« Последнее редактирование: Март 13, 2012, 16:28:11 от XpycT »


Рожденный летать, висеть не может.

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7805

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Добавлю ещё условие:
При ошибке нужно дать возможность продолжать вводить число.

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

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

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 131
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
2-ой Вариант

Код: AutoIt [Выделить]
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
    • Награды
Вариант - шутка
-- Создать форму ввода (не имеет значение какую) --
Код: AutoIt [Выделить]
 

                     

                    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




 


Русское сообщество AutoIt


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
OffTopicNik_rus  [?]
Цитировать
Kaster, Ctrl+V - все равно 1 символ.
да, это я дурак, проглядел GUICtrlSetLimit(-1,1)

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7805

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
XpycT  [?]
Цитировать
2-ой Вариант
Браво! :ok:
Это тот же метод который я и задумывал изначально, правда у меня немного по другому, у меня нет лишних циклов:

Код: AutoIt [Выделить]
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 Гуру
  • *****
  • Сообщений: 1512
  • Репутация: 405
    • Награды
  • Версия AutoIt: 3.3.12.0
А вот я прикалывался, просто для себя  ;D

(нажмите для показа/скрытия)

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7805

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Немного попробуем изменить условия задачи:

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


Добавлено: Март 13, 2012, 23:02:09
И ещё дополнил, нельзя использовать массивы :laugh:
« Последнее редактирование: Март 13, 2012, 23:02:34 от CreatoR, Причина: Объединение сообщений »

Оффлайн Arei [?]

  • Скриптер
  • ****
  • Сообщений: 938
  • Репутация: 115
  • Пол: Мужской
    • Награды
Код: AutoIt [Выделить]
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 [?]

  • Администратор
  • *
  • Сообщений: 7805

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Arei
Неплохо, но нет реакции на Cancel (т.е скрипт не завершает работу).
И ещё, желательно не использовать рекурсию :)

Оффлайн Arei [?]

  • Скриптер
  • ****
  • Сообщений: 938
  • Репутация: 115
  • Пол: Мужской
    • Награды
Код: AutoIt [Выделить]
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



Добавлено: Март 13, 2012, 23:24:00
Код: AutoIt [Выделить]
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


Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
8 Ответов
11685 Просмотров
Последний ответ Февраль 10, 2015, 03:10:00
от CreatoR
6 Ответов
4225 Просмотров
Последний ответ Ноябрь 30, 2010, 14:38:41
от CreatoR
7 Ответов
3786 Просмотров
Последний ответ Январь 24, 2012, 11:25:03
от iamOmg
11 Ответов
11116 Просмотров
Последний ответ Март 13, 2012, 02:24:31
от AZJIO
3 Ответов
3609 Просмотров
Последний ответ Март 17, 2012, 04:18:54
от Yashied
13 Ответов
9775 Просмотров
Последний ответ Декабрь 05, 2012, 19:44:23
от CreatoR
4 Ответов
2473 Просмотров
Последний ответ Апрель 02, 2013, 13:58:46
от InnI
2 Ответов
1516 Просмотров
Последний ответ Ноябрь 11, 2013, 22:54:22
от Ganibal95
1 Ответов
945 Просмотров
Последний ответ Сентябрь 10, 2014, 17:37:30
от Крепыш
6 Ответов
1267 Просмотров
Последний ответ Ноябрь 09, 2015, 08:13:08
от Medic84