Что нового

Как автоматически проверять данные, вводимые в формы GUI

Suppir

Продвинутый
Сообщения
967
Репутация
62
Вот примерная форма будущего приложения:

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

$Form1_1 = GUICreate("NSR-авто, v. 1.0", 222, 730, 269, 84)
GUISetFont(10, 400, 0, "Arial")
$Combo1 = GUICtrlCreateCombo("", 5, 35, 210, 25)
$Label1 = GUICtrlCreateLabel("Выберите орган власти", 10, 10, 143, 20)
$Input1 = GUICtrlCreateInput("", 5, 90, 151, 24)
$Button1 = GUICtrlCreateButton("<", 163, 90, 25, 24, 0)
$Button2 = GUICtrlCreateButton(">", 190, 90, 25, 24, 0)
$Input2 = GUICtrlCreateInput("", 5, 140, 211, 24)
$Input3 = GUICtrlCreateInput("", 5, 195, 211, 24)
$Edit1 = GUICtrlCreateEdit("", 5, 250, 210, 89)
$Edit2 = GUICtrlCreateEdit("", 5, 365, 210, 109)
$Input4 = GUICtrlCreateInput("", 5, 500, 211, 24)
$Input5 = GUICtrlCreateInput("", 5, 555, 211, 24)
$Label2 = GUICtrlCreateLabel("Установите номер топика", 10, 70, 155, 20)
$Label3 = GUICtrlCreateLabel("Дата документа (ALT+1)", 10, 120, 149, 20)
$Label4 = GUICtrlCreateLabel("Номер документа (ALT+2)", 10, 175, 160, 20)
$Label5 = GUICtrlCreateLabel("Название документа (ALT+3)", 10, 230, 178, 20)
$Label6 = GUICtrlCreateLabel("Текст документа (ALT+q)", 10, 345, 153, 20)
$Label7 = GUICtrlCreateLabel("Левая подпись (ALT+w)", 10, 480, 147, 20)
$Label8 = GUICtrlCreateLabel("Правая подпись (ALT+e)", 10, 535, 152, 20)
$Checkbox2 = GUICtrlCreateCheckbox("поверх всех окон", 5, 655, 132, 21)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button3 = GUICtrlCreateButton("Создать NSR", 140, 680, 75, 45, $BS_MULTILINE)
$Button4 = GUICtrlCreateButton("изм", 180, 5, 35, 25, 0)
$Button6 = GUICtrlCreateButton("Очистить формы", 5, 680, 75, 45, $BS_MULTILINE)
$Button5 = GUICtrlCreateButton("ini", 85, 680, 50, 45, 0)
$Checkbox1 = GUICtrlCreateCheckbox("показать результат в блокноте", 5, 614, 212, 14)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button7 = GUICtrlCreateButton("i", 190, 655, 20, 20, 0)
$Checkbox3 = GUICtrlCreateCheckbox("выполнять автозамены", 5, 634, 162, 19)
GUICtrlSetState(-1, $GUI_CHECKED)
$Checkbox4 = GUICtrlCreateCheckbox("определять структуру блоков", 5, 590, 207, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
GUISetState(@SW_SHOW)


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



По какому принципу лучше всего делать следующую проверку:

Eсли пользователь ввел неправильный параметр в какой-либо из Input'ов или Edit'ов, то необходимо подсветить содержимое этого Input'а или Edit красным цветом.



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

Например, если юзер ввел в $Input1 число менее 5 символов, то подсветить содержимое красным цветом.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Re: Проверка правильности ввода в формы GUI

Suppir
Данный пример проверяет ввод текста в поле...
Правильным считается ввод цифр...

Код:
; НАЧАЛО

; Создание окна

 $GUI=GuiCreate("Проверка корректности",250,25)

; Создание метки и поля

 $LABEL1=GUICtrlCreateLabel("Заголовок:",0,0,100)
 $INPUT1=GUICtrlCreateInput("",100,0,110,25)

; Отображение окна

 GuiSetState()

; Установка ловушки для событий-команд

 GUIRegisterMsg(0x0111,"COMMAND")

; Обработка событий в цикле MessageLoop

 While true

  Switch GUIGetMsg()
   ; Событие "ЗАКРЫТИЕ ОКНА"
   Case -3
    ExitLoop
  EndSwitch

 WEnd

; Проверка поля

 Func CHECK()
  $S=GUICtrlRead($INPUT1)
  if (StringLen($S)>0) and (StringIsInt($S)) then
   GUICtrlSetColor($LABEL1,0x0000FF)
   Return true
  else
   GUICtrlSetColor($LABEL1,0xFF0000)
   Return false
  endif
 EndFunc

; Обработка событий

 Func COMMAND($hWnd,$nMsg,$wParam,$lParam)
  Local $nNotifyCode=BitShift($wParam,16)
  Local $nID=BitAND($wParam,0xFFFF)
  Local $hCtrl=$lParam
  Switch $nID
   Case $INPUT1
    CHECK()
  EndSwitch
  Return "GUI_RUNDEFMSG"
 EndFunc

; КОНЕЦ
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: Проверка правильности ввода в формы GUI

У меня так что-то получилось:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 232, 104, 192, 114)
$Input1 = GUICtrlCreateInput("", 8, 8, 209, 21)
$Input2 = GUICtrlCreateInput("", 8, 40, 209, 21)
$Button1 = GUICtrlCreateButton("Ok", 72, 72, 81, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

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

		Case $Input1
			$text = GUICtrlRead ($Input1)
			$len = StringLen($text)
			If $len >= 5	Then	
				GUICtrlSetColor($Input1, 0x000000)
			Else
				GUICtrlSetColor($Input1, 0xFF0000)
			EndIf
		Case $Button1
			Exit
	EndSwitch
WEnd

Правда цвет меняется не в процессе ввода, а при установке указателя мыши
на второе поле ввода.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Проверка правильности ввода в формы GUI

Yuriy

почему-то ничего не происходит.

Дело в том, что эти поля могут заполнятся как вручную, так и через функции. Например, при заполнении одного поля, автоматически будет меняться значение другого.

Необходимо, чтобы проверка правильности введенных значений проводилась, скажем, один раз в 2 секунды по нескольким элементам GUI. Возможно ли так сделать?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Re: Проверка правильности ввода в формы GUI

Suppir
Данный пример проверяет поле через каждые 2 секунды...

Код:
; НАЧАЛО

; Создание окна

 $GUI=GuiCreate("Проверка корректности",250,25)

; Создание метки и поля

 $LABEL1=GUICtrlCreateLabel("Заголовок:",0,0,100)
 $INPUT1=GUICtrlCreateInput("",100,0,110,25)

; Отображение окна

 GuiSetState()

; Установка Adlib-функции

 AdlibRegister("CHECK",2000)

; Обработка событий в цикле MessageLoop

 While true

  Switch GUIGetMsg()
   ; Событие "ЗАКРЫТИЕ ОКНА"
   Case -3
    ExitLoop
  EndSwitch

 WEnd

; Проверка поля

 Func CHECK()
  $S=GUICtrlRead($INPUT1)
  if (StringLen($S)>0) and (StringIsInt($S)) then
   GUICtrlSetColor($LABEL1,0x0000FF)
   Return true
  else
   GUICtrlSetColor($LABEL1,0xFF0000)
   Return false
  endif
 EndFunc

; КОНЕЦ
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Проверка правильности ввода в формы GUI

Спасибо. Не работал никогда с adlib-функциями, буду разбираться.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Re: Проверка правильности ввода в формы GUI

Suppir
Использование Adlib-функций имеет определенный риск...
Мне бы хотелось увидеть комментарии CreatoR и Yashied по этому поводу...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Проверка правильности ввода в формы GUI

snoitaleR

Насколько я понял из описания - эта adlib-функция будет приостанавливать основной скрипт каждые x секунд и выполнять функцию. После чего основной скрипт будет продолжать работу. Имхо, очень удобная штука (т.е. можно будучи в цикле отрабатывать другие функции - по сути, многопоточность).
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: Проверка правильности ввода в формы GUI

Suppir
ну это многопоточность в первом приближении, так сказать ;D
так как истинная многопоточность - не останавливает работу одних своих потоков для выполнения других. собственно, отсюда и название. а вообще, да. если функция занимает малое кол-во процессорного времени, то удобство такого подхода возрастает в разы
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Проверка правильности ввода в формы GUI

OffTopic:
Раньше я думал, что adlib-функции нужны для работы со звуком :smile: У меня была звуковая карта такая.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: Проверка правильности ввода в формы GUI

Спасибо, snoitaleR.
Пригодится.
Так теперь лучше стало работать.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 232, 104, 192, 114)
$Input1 = GUICtrlCreateInput("", 8, 8, 209, 21)
$Button1 = GUICtrlCreateButton("Ok", 72, 72, 81, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
AdlibRegister("test")
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit		
		Case $Button1
			Exit
	EndSwitch
WEnd

Func test()	
	$text = GUICtrlRead ($Input1)
	$len = StringLen($text)
	If $len >= 5	Then
		GUICtrlSetColor($Input1, 0x000000)				
	Else
		GUICtrlSetColor($Input1, 0xFF0000)
	EndIf
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Проверка правильности ввода в формы GUI

Yuriy

Ну да, ты ведь используешь тот же подход.


Вообще, довольно важная тема. По крайней мере у меня много раз возникало желание проверить вводимые в формы данные. Для input'ов в свойствах можно выставить "только для чисел", но для других форм это очень актуально.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir
А чем такой вариант не устраивает? Ведь если данные, введённые в Input, не соответствуют условию, скрипт должен ждать корректных данных.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 232, 104, 192, 114)
$Input1 = GUICtrlCreateInput("", 8, 8, 209, 21)
$Button1 = GUICtrlCreateButton("Ok", 72, 72, 81, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit       
        Case $Button1
            _CheckLen()
    EndSwitch
WEnd

Func _CheckLen()
    $text = GUICtrlRead ($Input1)
    $len = StringLen($text)
    If $len >= 5    Then
		GUICtrlSetColor($Input1, 0x000000)
        MsgBox(0,"","Количество символов соответствует условию")
		Exit
    Else
        GUICtrlSetColor($Input1, 0xFF0000)
		MsgBox(0,"","Количество символов НЕ соответствует условию")
    EndIf
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Garrett

Конкретно для моей задачи идеально подходит вариант snoitaleR'а.

Т.е. пользователь заполняет поля. Причем он может заполнять их в любом порядке.
При этом необходимо подсвечивать красным поля, если внутри них некорректные значения.




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

Я видел такую подсветку на некоторых сайтах, во время ввода логина-пароля.
 
Верх