Что нового

Проверка переменной на диапазон числа

VadimKHL

Новичок
Сообщения
155
Репутация
0
Есть поле Input.
Каким образом можно организовать фильтр, что бы в поле можно было ввести только целые числа в диапазоне 1 >= x <= 86?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
While 1
	$sInp = InputBox('', '', '', ' M2')
		Switch @error
			Case 1 To 5
				Exit
		EndSwitch
	Switch $sInp
		Case 1 To 86
			MsgBox(32,'',$sInp)
			Exit
	EndSwitch
WEnd
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
А возможно перевернуть условие,
т.е. если 1 - 86, продолжай выполнять код,
если нет то return (возврат из функции).

Или придется полностью всю функцию добавить в цикл Case?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
While 1
    $sInp = InputBox('', '', '', ' M2')
        Switch @error
            Case 1 To 5
                Exit
        EndSwitch
    Switch $sInp
        Case 1 To 86
            MsgBox(32,'',$sInp)
            Exit
       case else
 MsgBox(32,'','zzzz')
    EndSwitch
WEnd
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Если ввести 2. (два-точка) проходит, а не должно.
Нужно что бы проходили только цифры, без символов, только целые, положительные (абсолютные).
 
A

Alofa

Гость
VadimKHL сказал(а):
... Нужно что бы проходили только цифры...
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <UpdownConstants.au3>

Example1()
Example2()

Func Example1()
	GUICreate('Example1', 200, 100)
	$iInput = GUICtrlCreateInput('1', 50, 20, 100, 20, BitOR($ES_NUMBER, $ES_READONLY))
	GUICtrlSetBkColor(-1, 0xFFFED8)
	GUICtrlCreateUpdown(-1, $UDS_WRAP)
	GUICtrlSetLimit(-1, 86, 1)
	$iButton = GUICtrlCreateButton('Ok', 60, 60, 80)
	GUISetState()

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				GUIDelete()
				ExitLoop
			Case $iButton
				MsgBox(262144, Default, GUICtrlRead($iInput))
		EndSwitch
	WEnd
EndFunc   ;==>Example1

Func Example2()
	Local $iInput, $iButton, $sRead, $sReadPrev
	GUICreate('Example2', 240, 140)
	$iInput = GUICtrlCreateInput('', 70, 30, 100, 20, $ES_NUMBER)
	GUICtrlSetBkColor(-1, 0xFFFED8)
	GUICtrlSetLimit(-1, 2)
	$iButton = GUICtrlCreateButton('Ok', 80, 80, 80)
	GUISetState()

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				ExitLoop
			Case $iButton
				MsgBox(262144, Default, $sRead)
		EndSwitch
		
		$sRead = GUICtrlRead($iInput)
		If (Not $sRead) Or ($sRead >= 1 And $sRead <= 86) Then
			$sReadPrev = $sRead
		Else
			GUICtrlSetData($iInput, $sReadPrev)
		EndIf
	WEnd
EndFunc   ;==>Example2
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
VadimKHL
Если нужно проверять динамически во время ввода, то смотрите здесь: В чем отличие $EN_UPDATE от $EN_CHANGE в ф-ии WM_COMMAND ?
Если нет, вот ещё вариант
Код:
#include <EditConstants.au3>

GUICreate("Input", 300, 100)
$Inp = GUICtrlCreateInput("", 10, 10, 280, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
$Btn = GUICtrlCreateButton("OK", 120, 60, 60, 30)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $Btn
      $s = GUICtrlRead($Inp)
      If $s < 1 Or $s > 86 Then
        MsgBox(0, "", "Error")
      Else
        MsgBox(0, "", "OK")
      EndIf
  EndSwitch
Until 0



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

Alofa
В вашем случае не помешает $ES_READONLY. Иначе можно ввести значение больше 86 или 0.
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Спасибо! Хорошие примеры.
Вопрос,
чем отличаются условия
Код:
If (Not $sRead) Or ($sRead >= 1 And $sRead <= 86) Then

от
Код:
If $s < 1 Or $s > 86 Then


Пойду еще почитаю про динамическое отслеживание... Может разбирусь


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

Кокретно вот про это
Код:
If (Not $sRead)


Про обратные знаки вижу ;D
 
A

Alofa

Гость
OffTopic:
VadimKHL сказал(а):
... чем отличаются условия...
Условие:
Код:
If (Not $sRead) Or ($sRead >= 1 And $sRead <= 86) Then ; Если поле в $iInput пустое ИЛИ число в $sRead входит за диапазон 1-86, то...
	$sReadPrev = $sRead
Else ; Если $iInput не пустое поле И $sRead выходит за диапазон 1-86, то...
	GUICtrlSetData($iInput, $sReadPrev)
EndIf

Будет работает точно также как и:
Код:
If $sRead And ($sRead < 1 Or $sRead > 86) Then ; Если $iInput не пустое поле И $sRead выходит за диапазон 1-86, то...
	GUICtrlSetData($iInput, $sReadPrev)
Else ; Если поле в $iInput пустое ИЛИ число в $sRead входит за диапазон 1-86, то...
	$sReadPrev = $sRead
EndIf


- Как правильно создать условие If ... Then
- НЕофициальный FAQ AutoIt (Ответ #2)

Если вы про выделение участка условия скобками, то это как в математике:
результат выражения 2*(2+2) будет отличаться от (2*2)+2.
 
Верх