Что нового

В поле ввода только число и отрицательное число

reset86

Новичок
Сообщения
47
Репутация
0
У меня было реализовано это так, как в примере. Но при тестировании понял, что $ES_NUMBER не позволяет вводить отрицательные числа (пример: -1).
Есть ли какой то простой способ реализовать это, без регулярок?
Это кусок формы.
Код:
; ...
$Label16 = GUICtrlCreateLabel("Ось Y", 243, 188, 55, 20)
$Input7 = GUICtrlCreateInput($VarX7, 243, 212, 55, 19, BitOR($GUI_SS_DEFAULT_INPUT,$ES_NUMBER), 0)
; ...


Попробовал использовать для этого IsNumber, но тот пример что в справке работает, а в таком виде уже нет:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 215, 127, -1, -1)
$Input1 = GUICtrlCreateInput("", 24, 24, 169, 21)
$Button1 = GUICtrlCreateButton("Button1", 24, 64, 73, 25)
GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

Case $Button1
$iLife = GUICtrlRead($Input1)
If IsNumber($iLife) Then
MsgBox(4096, "", 'Да, это число')
Else
MsgBox(4096, "", 'Нет, это не число')
EndIf

EndSwitch
WEnd
 

hedji

Продвинутый
Сообщения
409
Репутация
94
GUICtrlRead() - возвращает данные с типом строка.
Поэтому IsNumber($iLife) не работает, для него $iLife - это строка, и не важно "-1" там или 'qwerty".

https://autoit-script.ru/index.php?topic=18820.0
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
<продолжение предыдущего сообщения>
А при попытке конвертации строки в число (целое) результатом будет число или ноль, который тоже число. Получается, что всегда будет либо строка, либо число. И даже, если считать ноль строкой, то начнутся проблемы при конвертации строк вида "2w". Поэтому, "регулярка" в данном случае - самое простое. Например
Код:
If StringRegExp($iLife, "^-?[0-9]+$") Then ; целое число
 

axsmak

Знающий
Сообщения
32
Репутация
7
На ноль просто перепроверка нужна
Неверный ответ. Извиняюсь:
Код:
If Int($iLife) == 0 And $iLife <> "0" Then 
  ConsoleWrite("$iLife - STRING" & @CRLF)
Else
  ConsoleWrite("$iLife - NUMBER" & @CRLF)



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

InnI: Так всё будет отлично, даже с учётом "2w"
Код:
Global $a[5] = ["1.2", "2", "2w", "we", "-45"]
For $i = 0 To UBound($a)-1
    If String(Int($a[$i])) == String($a[$i]) Then
      ConsoleWrite($a[$i] & " - NUMBER" & @CRLF)
    Else
      ConsoleWrite($a[$i] & " - STRING" & @CRLF)
    EndIf
Next

Выдаст
Код:
1.2 - STRING
2 - NUMBER
2w - STRING
we - STRING
-45 - NUMBER
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
axsmak
На ноль просто перепроверка нужна
2w ;)

Оператор "==" имеет смысл только для строк: http://autoit-script.ru/autoit3_docs/intro/lang_operators.htm
А я бы ещё уточнил: только для букв.
 
Автор
reset86

reset86

Новичок
Сообщения
47
Репутация
0
axsmak, это то что нужно, начал рыть в том же направлении. Числа типа 09 и не должны быть, только целые и отрицательные целые, так как это пиксели.

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 215, 127, -1, -1)
$Input1 = GUICtrlCreateInput("", 24, 24, 169, 21)
$Button1 = GUICtrlCreateButton("Button1", 24, 64, 73, 25)
GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$iLife = GUICtrlRead($Input1)
If String(Int($iLife)) == String($iLife) Then
ConsoleWrite($iLife & " - NUMBER" & @CRLF)
Else
ConsoleWrite($iLife & " - STRING" & @CRLF)
EndIf

EndSwitch
WEnd


Мое решение, к чему пришел, очень похоже.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 215, 127, -1, -1)
$Input1 = GUICtrlCreateInput("", 24, 24, 169, 21)
$Button1 = GUICtrlCreateButton("Button1", 24, 64, 73, 25)
GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

Case $Button1
$iLife = GUICtrlRead($Input1)
$iLife1 = Int($iLife)
If $iLife1 == $iLife Then
MsgBox(4096, "", 'Да, это число')
ConsoleWrite($iLife & @CRLF)
Else
MsgBox(4096, "", 'Нет, это не число')
EndIf
EndSwitch
WEnd



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

Хоть и пришел к похожему решению, но решение от axsmak более правильное, я не додумался до конвертации String(Int($iLife)).
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
axsmak
1.2 - ну никак не String! Это Double.

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("23535", 173, 110, -1, -1)
$Input1 = GUICtrlCreateInput("", 24, 24, 121, 21)
$Button1 = GUICtrlCreateButton("Check", 48, 56, 75, 25)
GUISetState(@SW_SHOW)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
	  Case $Button1
		 $vItIs = VarGetType(Execute(GUICtrlRead($Input1)))
		 If $vItIs = "String" Then
			MsgBox(32, "23535", "It is - " & $vItIs)
		 Else
			MsgBox(32, "23535", "It is - " & $vItIs)
		 EndIf
	  Case $GUI_EVENT_CLOSE
		 Exit

   EndSwitch
WEnd
 
A

Alofa

Гость
OffTopic:
reset86
Есть на свете такая замечательная вещь, как Tidy.
 
Автор
reset86

reset86

Новичок
Сообщения
47
Репутация
0
Решение на VarGetType, то что предложил Garrett, на самом деле правильнее, правда в моем текущем случае, нельзя чтобы были нецелые числа.
Но можно использовать Round и тогда получается то, что нужно.

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("", 173, 110, -1, -1)
$Input1 = GUICtrlCreateInput("", 24, 24, 121, 21)
$Button1 = GUICtrlCreateButton("Check", 48, 56, 75, 25)
GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg

Case $Button1
$Var1 = GUICtrlRead($Input1)
$Var2 = Round($Var1)
$vItIs = VarGetType(Execute($Var1))

If $vItIs = "String" Then
MsgBox(4096, "", 'Это не число')
Else
MsgBox(32, "", $Var2)
EndIf

Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd


Alofa мне с табуляцией читать и понимать код сложнее. Поэтому я всегда делаю - CTRL+A и потом Shift+Tab, а переносами разделяю на блоки, во всех ЯП. Хотя я знаю, что это не правильно и многих бесит.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
reset86
Какая-то у вас проверка ради проверки. Ну, введите "2*2" и посмотрите результат. В вашем случае это не строка... но разве это "пиксель"?
 

axsmak

Знающий
Сообщения
32
Репутация
7
Garrett сказал(а):
axsmak
1.2 - ну никак не String! Это Double.
Конечно не String. Но суть в том, что это не челое число
В моём способе чётко фильтруются целые числа и отсеивается прочее. "1.2" -- это не целое число, да и, строго говоря "09" тоже.

Целые положительные и целые отрицательные:
Код:
If String(Int($sVal)) == String($sVal) Then


Если требуется включить Double:
Код:
If String(Number($sVal)) == String($sVal) Then



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

reset86 сказал(а):
Решение на VarGetType, то что предложил Garrett, на самом деле правильнее, правда в моем текущем случае, нельзя чтобы были нецелые числа.
Но можно использовать Round и тогда получается то, что нужно.
Не нужен Round. Достаточно изменить условие проверки:
Код:
If $vItIs == "Int32" Then
  MsgBox(32, "", $Var2 & " - целое число")
EndIf
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
axsmak
не целое число, да и, строго говоря "09" тоже
Давайте не будем путать число с формой его записи. Тем более, что форма записи влияет на тип. Это int32: "00200", "0xC8". А это уже double: "2e2".

Если требуется включить Double
"2e-2"
 

axsmak

Знающий
Сообщения
32
Репутация
7
InnI сказал(а):
Если требуется включить Double
"2e-2"
Трудно представить себе человека вписывающего в поле ввода координат "2e-2"...
Но, думаю, пора прекращать словоблудие. Тем более, что тема решена предельно соотвестствуя запросам топикстартера.
 
Автор
reset86

reset86

Новичок
Сообщения
47
Репутация
0
InnI это тестовый пример, у меня в программе 1200 строк, не буду же я весь код выкладывать, показывая как я в конечном итоге это все интегрировал в код ))
И на VarGetType работает как надо. У меня две оси, 0 это центр экрана.
Код:
; Это пример, для чего это может быть необходимо.
$hForm = GUICreate("Test", 400, 300, ((@DesktopWidth-400)/2)+200, ((@DesktopHeight-300)/2)+100, $WS_POPUP)
; Где 200 и 100 получены через поле ввода, соответственно нецелых чисел, здесь быть не должно.

Пиксели, это число пикселей на экране и быть например 60,5 пикселей, не может, просто напросто физически.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
reset86
60,5 пикселей, не может, просто напросто физически
Код:
$gui = GUICreate("", 321.15, 60.5)
GUISetState()
WinSetTitle($gui, "", PixelGetColor(345.8, 133 / 3))
$x = 2e2 * .81 + 13.31
Opt("MouseCoordMode", 2)
MouseMove($x, Sqrt(1500))
Do
Until GUIGetMsg() = -3


получены через поле ввода
Вы, видимо, ещё не знаете, что может ввести пользователь :smile: И будете долго искать ошибку, когда он (совершенно случайно) напишет "22O" или "33!". А может, вам просто повезёт, и вы с этим никогда не столкнётесь.
 
A

Alofa

Гость
reset86
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

$Form1 = GUICreate('Form1', 215, 127, -1, -1)
$Input1 = GUICtrlCreateInput('', 24, 24, 169, 21)
$Button1 = GUICtrlCreateButton('Button1', 24, 64, 73, 25)
GUISetState()

GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$vLife = Execute(GUICtrlRead($Input1))
			If $vLife Then
				MsgBox(4096, '', 'Число = ' & $vLife)
			Else
				MsgBox(4096, '', 'Так не пойдет')
			EndIf
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	Local $nID = BitAND($wParam, 0x0000FFFF) ; _WinAPI_LoWord
	Local $nNotifyCode = BitShift($wParam, 16) ; _WinAPI_HiWord
	If $nID = $Input1 And $nNotifyCode = $EN_UPDATE Then
		$sInputString = StringRegExpReplace(GUICtrlRead($Input1), '[^\d-+*/]', '')
		If @extended Then GUICtrlSetData($Input1, $sInputString)
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Верх