Что нового

[Элементы GUI] Очистка Input-a с дальнейшим немедленный автоматическим заполнением

scampwork

Новичок
Сообщения
3
Репутация
0
Доброго времени суток.
При изучении любого языка программирования, думаю, правильно сразу практиковать навыки. Вот и я решил начать с простого — генератор паролей. Знаю, не говорите, их тысячи, но у меня будет свой – практика как ни как ;D
Но столкнулся с проблемой, разглядывая которую даже под лупой, не могу найти ошибки. Нужна ваша помощь!
Долго думал, показывать ли весь код. Хотел на простом примере показать в чем суть вопроса. Но на простом примере все работает! :( Так что выкладываю весь код генератора.
А проблема вот в чем: Функция _Main() ==> второй бесконечный цикл While 1 ==> ищем кнопку $ButtonRefreshPassword. На нее подвешено 2 действия с Input – 1-е очистка, 2-е Показ нового пароля. Еще раз извиняюсь за то, что пришлось вывалить весь код. Как всегда я чего-то не учел и очистка инпута не происходит( Буду благодарен за любую помощь :smile:
Код:
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3> 
#include <Array.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
_Main()

Func _Main()
   Global $password
   Local $ButtonDoPassword, $msg, $howmuch, $difficult
   GuiCreate("Генератор паролей", 210, 160)
   $howmuch = GUICtrlCreateInput("" , 50, 20, 100, 20)
   $difficult = GUICtrlCreateCombo("" , 50, 70)
   GUICtrlSetData(-1, 'very easy|easy|normal|hard', 'hard')
   $ButtonDoPassword = GuiCtrlCreateButton("Ok", 50,120,60,20)
   GUISetState(@SW_SHOW)
   GUISetOnEvent($GUI_EVENT_CLOSE, 'GUIExit')
   While 1
		$msg = GUIGetMsg()
		Select
		  Case $msg = $GUI_EVENT_CLOSE
		     ExitLoop
		  Case $msg = $ButtonDoPassword
			 Local $much, $dif
			 Local $GuiPasswordInput[2]
			 $much = GUICtrlRead($howmuch)
			 $dif = GUICtrlRead($difficult)
			 GUIDelete()
			 GUICreate("Ваш пароль", 200, 150)
			 $GuiPasswordInput[1] = ""
			 $GuiPasswordInput[0] = GUICtrlCreateInput($GuiPasswordInput[1], 50, 20, 100, 20)
			 $ButtonRefreshPassword = GuiCtrlCreateButton("Refresh!", 50,80,60,20)
			 GUISetState(@SW_SHOW)
			 GUISetOnEvent($GUI_EVENT_CLOSE, 'GUIExit')
			 CreateThePassword($much, $dif)
			 GUICtrlSetData($GuiPasswordInput[0], $password)
			 ;Send("{CTRLDOWN}+a{CTRLUP}")
				While 1
					 $guimsg = GUIGetMsg()
					 Select
						Case $guimsg = $ButtonRefreshPassword
						   CreateThePassword($much, $dif)
						   GUICtrlSetData($GuiPasswordInput[0], $GuiPasswordInput[1])
						   GUICtrlSetData($GuiPasswordInput[0], $password)
						Case $guimsg = $GUI_EVENT_CLOSE
						   Exit
					 EndSelect
				  WEnd
			ExitLoop
	    EndSelect
	WEnd
   GUIDelete()
EndFunc   

Func CreateThePassword($much, $dif)
   Local $count
   Local $sing[3]
   $sing[0] = "!"
   $sing[1] = "%"
   $sing[2] = "*"
			For $a = 0 To $much - 1
			   Select
				  Case $dif = 'very easy'
					 $count = Random(0, 9, 1)
				  Case $dif = 'easy'
					 If Random() < 0.5 Then
						$count = Random(0, 9, 1)
					 Else
						$count = Chr(Random(Asc("a"), Asc("z"), 1))
					 EndIf
				  Case $dif = 'normal'
					 $rand = Random(-5, 5, 1)
					 If $rand <= 1 AND $rand >= -1 Then
						$count = Random(0, 9, 1)
					 ElseIf $rand > 1 Then
						$count = Chr(Random(Asc("a"), Asc("z"), 1))
					 ElseIf $rand < -1 Then
						$count = Chr(Random(Asc("A"), Asc("Z"), 1))
					 EndIf
				  Case $dif = 'hard'
					 $rand = Random(-5, 7, 1)
					 If $rand <= 1 AND $rand >= -1 Then
						$count = Random(0, 9, 1)
					 ElseIf $rand < -1 Then
						$count = Chr(Random(Asc("a"), Asc("z"), 1))
					 ElseIf $rand > 1 AND $rand <= 5 Then
						$count = Chr(Random(Asc("A"), Asc("Z"), 1))
					 ElseIf $rand > 5 AND $rand <= 7 Then
						$p = Random(0, 2, 1)
						$count = $sing[$p]
					 EndIf
				  EndSelect
				  $password &= $count
			   Next
		
Return $password
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.






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

scampwork [?]
автоайтискрипчане
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Модератор.
 
Автор
S

scampwork

Новичок
Сообщения
3
Репутация
0
Прошу прощения, не сразу разобрался что-как. Первый раз сам задаю вопрос на форуме а не поисковику :smile:
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
вот чуть облегченный твой код.что то он сильно закручен. можно в одном окне все сделать
я во втором окне установил
Код:
Sleep

чтобы было видно что окно очищается. только потом видно что цифры прибавляются.


Код:
Func _Main()
   Global $password
   Local $ButtonDoPassword, $msg, $howmuch, $difficult
   GuiCreate("Генератор паролей", 210, 160)
   $howmuch = GUICtrlCreateInput("" , 50, 20, 100, 20)
   $difficult = GUICtrlCreateCombo("" , 50, 70)
   GUICtrlSetData(-1, 'very easy|easy|normal|hard', 'hard')
   $ButtonDoPassword = GuiCtrlCreateButton("Ok", 50,120,60,20)
   GUISetState(@SW_SHOW)
   While 1
        $msg = GUIGetMsg()
        Select
          Case $msg = $GUI_EVENT_CLOSE
             ExitLoop
          Case $msg = $ButtonDoPassword
             Local $much, $dif
             Local $GuiPasswordInput
             $much = GUICtrlRead($howmuch)
             $dif = GUICtrlRead($difficult)
             GUIDelete()
             GUICreate("Ваш пароль", 200, 150)
             $GuiPasswordInput = GUICtrlCreateInput('', 50, 20, 100, 20)
             $ButtonRefreshPassword = GuiCtrlCreateButton("Refresh!", 50,80,60,20)
             GUISetState(@SW_SHOW)
             CreateThePassword($much, $dif)
             GUICtrlSetData($GuiPasswordInput, $password)
                While 1
                     $guimsg = GUIGetMsg()
                     Select
						Case $guimsg = $ButtonRefreshPassword
							GUICtrlSetData($GuiPasswordInput, '')
							Sleep(3000)
                           CreateThePassword($much, $dif)
                           GUICtrlSetData($GuiPasswordInput, $password)
                        Case  $guimsg =$GUI_EVENT_CLOSE
                           Exit
                     EndSelect
                  WEnd
            ExitLoop
        EndSelect
    WEnd
   GUIDelete()
EndFunc
 
Автор
S

scampwork

Новичок
Сообщения
3
Репутация
0
Спасибо! Только что заметил тоже это)))
Оказывается Input нормально очищался, а удвоение пароля началось в повторном вызове функции. Исправил, добавив строку обнуления пароля
Код:
Case $guimsg = $ButtonRefreshPassword
						$password = ""
						CreateThePassword($much, $dif)
						GUICtrlSetData($GuiPasswordInput, $password, '')
 
Верх