Что нового

GUIPasswordCombobox - Создание Combobox с поддержкой ввода паролей

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AutoIt: 3.3.6.1+
Версия: 1.02

Категория: Элементы GUI

Описание: Библиотека предназначена для создания Combobox с возможностью ввода текста в запароленном виде (по аналогии использования стиля $ES_PASSWORD в GUICtrlCreateInput).

Список публичных функции:
Позже будет подробное описание параметров к функциям

_GUICtrlPasswordCombobox_Create - Создание элемента Combobox
_GUICtrlPasswordCombobox_Destroy - Удаление элемента Combobox
_GUICtrlPasswordCombobox_ShowPassword - Отображение паролей
_GUICtrlPasswordCombobox_AddPassword - Добавление пароля в список Combobox
_GUICtrlPasswordCombobox_DeletePassword - Удаление пароля из списка Combobox
_GUICtrlPasswordCombobox_EditSetText - Заполнение текста в элемент Edit от Combobox
_GUICtrlPasswordCombobox_EditGetText - Получение текста из элемента Edit от Combobox

Пример:
Код:
#include "GUIPasswordCombobox.au3"

Global $sPasswords = 'password|пароль|12345|qwerty'
Global $sDefault_Password = '12345'
Global $iMinPasswords = 2
Global $iMaxPasswords = 5 ; -1 = Unlimited

_Example1()
_Example2()

Func _Example1()
	Local $hGUI, $iPass_ComboBox, $iShowPass_CB, $iAddPass_Bttn, $iRemovePass_Bttn
	
	$hGUI = GUICreate('Example #1', 300, 100)
	
	$iPass_ComboBox = _GUICtrlPasswordCombobox_Create($sPasswords, $sDefault_Password, 10, 10, 280, 50)
	_GUICtrlPasswordCombobox_ShowPassword($iPass_ComboBox, True)
	
	$iShowPass_CB = GUICtrlCreateCheckbox('Show passwords', 10, 35)
	GUICtrlSetState(-1, $GUI_CHECKED)
	
	$iAddPass_Bttn = GUICtrlCreateButton('Add', (300 / 2) - 20 - 70, 70, 70, 20, $BS_DEFPUSHBUTTON)
	$iRemovePass_Bttn = GUICtrlCreateButton('Remove', (300 / 2) + 20, 70, 70, 20)
	
	GUISetState(@SW_SHOW, $hGUI)
	
	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				_GUICtrlPasswordCombobox_Destroy($iPass_ComboBox)
				GUIDelete($hGUI)
				ExitLoop
			Case $iShowPass_CB
				_GUICtrlPasswordCombobox_ShowPassword($iPass_ComboBox, BitAND(GUICtrlRead($iShowPass_CB), $GUI_CHECKED) = $GUI_CHECKED)
			Case $iAddPass_Bttn
				If _GUICtrlComboBox_GetCount($iPass_ComboBox) = $iMaxPasswords Then
					MsgBox(48, 'Attention', StringFormat('Passwords Maximum limit (%i) is reached.', $iMaxPasswords), 0, $hGUI)
				Else
					_GUICtrlPasswordCombobox_AddPassword($iPass_ComboBox)
					_GUICtrlPasswordCombobox_EditSetText($iPass_ComboBox, '')
				EndIf
			Case $iRemovePass_Bttn
				If _GUICtrlComboBox_GetCount($iPass_ComboBox) = $iMinPasswords Then
					MsgBox(48, 'Attention', StringFormat('Passwords Minimum limit (%i) is reached.', $iMinPasswords), 0, $hGUI)
					ContinueLoop
				EndIf
				
				Local $iIndex = _GUICtrlPasswordCombobox_DeletePassword($iPass_ComboBox)
				Local $sText = ''
				
				_GUICtrlComboBox_GetLBText($iPass_ComboBox, $iIndex, $sText)
				_GUICtrlComboBox_SetCurSel($iPass_ComboBox, $iIndex)
				
				_GUICtrlPasswordCombobox_EditSetText($iPass_ComboBox, $sText)
		EndSwitch
	WEnd
EndFunc

Func _Example2()
	Local $hGUI, $iPass_ComboBox, $iShowPass_CB, $iAddRemovePass_Bttn
	
	$hGUI = GUICreate('Example #2', 300, 100)
	
	$iPass_ComboBox = _GUICtrlPasswordCombobox_Create($sPasswords, $sDefault_Password, 10, 10, 280, 50)
	_GUICtrlPasswordCombobox_ShowPassword($iPass_ComboBox, True)
	
	$iShowPass_CB = GUICtrlCreateCheckbox('Show passwords', 10, 35)
	GUICtrlSetState(-1, $GUI_CHECKED)
	
	$iAddRemovePass_Bttn = GUICtrlCreateButton('Add/Remove', (300 / 2) - (70 / 2), 70, 70, 20, $BS_DEFPUSHBUTTON)
	
	GUISetState(@SW_SHOW, $hGUI)
	
	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				_GUICtrlPasswordCombobox_Destroy($iPass_ComboBox)
				GUIDelete($hGUI)
				ExitLoop
			Case $iShowPass_CB
				_GUICtrlPasswordCombobox_ShowPassword($iPass_ComboBox, BitAND(GUICtrlRead($iShowPass_CB), $GUI_CHECKED) = $GUI_CHECKED)
			Case $iAddRemovePass_Bttn
				Local $iItems_Count = _GUICtrlComboBox_GetCount($iPass_ComboBox)
				Local $sEdit_Text = _GUICtrlPasswordCombobox_EditGetText($iPass_ComboBox)
				Local $sList_Text = ''
				Local $iAdd = 1
				
				For $i = 0 To $iItems_Count-1
					_GUICtrlComboBox_GetLBText($iPass_ComboBox, $i, $sList_Text)
					
					If $sEdit_Text = $sList_Text Then 	
						$iAdd = 0
						ExitLoop
					EndIf
				Next
				
				If $iAdd Then 	;Add password
					If $iItems_Count = $iMaxPasswords Then
						MsgBox(48, 'Attention', StringFormat('Passwords Maximum limit (%i) is reached.', $iMaxPasswords), 0, $hGUI)
						ContinueLoop
					EndIf
					
					_GUICtrlPasswordCombobox_AddPassword($iPass_ComboBox)
				Else			;Remove password
					If $iItems_Count = $iMinPasswords Then
						MsgBox(48, 'Attention', StringFormat('Passwords Minimum limit (%i) is reached.', $iMinPasswords), 0, $hGUI)
						ContinueLoop
					EndIf
					
					Local $iIndex = _GUICtrlPasswordCombobox_DeletePassword($iPass_ComboBox)
					_GUICtrlComboBox_SetCurSel($iPass_ComboBox, $iIndex)
					_GUICtrlComboBox_GetLBText($iPass_ComboBox, $iIndex, $sEdit_Text)
					_GUICtrlPasswordCombobox_EditSetText($iPass_ComboBox, $sEdit_Text)
				EndIf
		EndSwitch
	WEnd
EndFunc

Файл: GUIPasswordCombobox.zip (включает в себя пример выше)

Снимок:


История версий:
v1.02
* Обновлён пример.
* Убран параметр $iMax_Pass в функции _GUICtrlPasswordCombobox_Create. Должно обрабатываться пользователем.
* Теперь функция _GUICtrlPasswordCombobox_DeletePassword не задаёт последний пароль для элемента Edit от Combobox. Должно обрабатываться пользователем.
* Теперь функция _GUICtrlPasswordCombobox_AddPassword не опустошает элемент Edit от Combobox. Должно обрабатываться пользователем.
+ Добавлена функция _GUICtrlPasswordCombobox_EditSetText.
+ Добавлена функция _GUICtrlPasswordCombobox_EditGetText.

v1.01
* Исправлена проблема с добавлением пароля содержащий символ |.

v1.0
Первая версия

Источник: autoit-script.ru
Автор(ы): G.Sandler (CreatoR)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
В примере, если ввести пароль, содержащий символ вертикальной черты "|", то в режиме отображения паролей в списке появляется лишний пункт, при выборе которого скрипт завершается. Скорее всего из-за того, что символ "|" является текущим разделителем подпунктов.

OffTopic:
Объясните, пожалуйста, практическое применение данного функционала. Где может понадобиться выбирать ПАРОЛЬ из списка? Тем более, когда он закрыт звёздочками...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
если ввести пароль, содержащий символ вертикальной черты "|", то в режиме отображения паролей в списке появляется лишний пункт
Не вижу особого смысла вводить этот символ в качестве пароля. В любом случае сделал замену на _.
Архив обновлён, версия та же.

практическое применение данного функционала
Ну видимо кому то нужно :whistle:.
Мне лично оно не нужно, я сделал это так, чисто из интереса, “а возможно ли” :smile:

Где может понадобиться выбирать ПАРОЛЬ из списка? Тем более, когда он закрыт звёздочками...
Ну не обязательно выбирать запароленные значения, можно же показать предварительно пароль.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
CreatoR
Наверно не стоит "|" заменять на "_", это получится уже другой пароль. Кстати проверил сейчас
Код:
_GUICtrlComboBox_AddString

вводит с символом "|"

Кстати так ещё можно
Код:
$sep=Opt("GUIDataSeparatorChar",Chr(0))
; MsgBox(0, 'Сообщение', $sep)
GUICtrlSetData($Combo2, "Добав|ленный пункт")
Opt("GUIDataSeparatorChar",$sep)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Исправил, спасибо.
 

gora

Знающий
Сообщения
315
Репутация
19
CreatoR
Несколько замечаний по функционалу.
1 Нижний предел числа паролей нельзя установить, а 0 паролей мне не подходит.
2 После добавления пароля окно пароля становится пустым и его нужно выбирать, прежде чем закрыть окно. Лишние движения и не очевидные, т.к., при удалении пароля окно ввода пустым не остается, а заполняется паролем из оставшегося списка.
3 Хотелось бы объединить кнопки Add и Del в одну Refresh. Для добавления нет проблем, а признакам удаления можно было бы использовать пустое окно ввода при нажатии кнопки. Цель - уменьшить число элементов управления.

Спасибо.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
gora [?]
Нижний предел числа паролей нельзя установить, а 0 паролей мне не подходит.
Мне трудно представить как можно задать минимум паролей. Что будет происходить когда пользователь задаст меньше паролей?

Можно при удалении подсчитывать число паролей и не удалять больше.

После добавления пароля окно пароля становится пустым
Это сделано специально, чтобы позволить вводить новый пароль.

Цель - уменьшить число элементов управления
А смысл? :scratch:

И как кнопке указать когда удалять, а когда добавлять? :stars:
 

gora

Знающий
Сообщения
315
Репутация
19
CreatoR [?]
Что будет происходить когда пользователь задаст меньше паролей?
У меня в программе при отсутствии пароля (хотя бы одного) будет ошибка. Можно конечно во все места наставить проверок, но проще в одном месте "не давать удалять последний пароль"
CreatoR [?]
Это сделано специально, чтобы позволить вводить новый пароль.
Ну ведь когда я начинаю ввод пароля первый раз у меня поле не пустое. Я стираю существующий и ввожу. А если я захочу ввести сразу второй то поле пустое. Уже не одинаково. При чем если я просмотрю после ввода пароля список и выберу один из паролей, а затем снова решу добавить новый пароль, то поле опять не будет пустым. Так что эта услуга (пустое поле для ввода пароля) не постоянна и не обязательна. Да и реально она будет использоваться реже. Пачками пароли вряд ли будут вводить.
У меня нет лишнего места для двух кнопок и если можно обойтись одной, то почему бы это не использовать?

И как кнопке указать когда удалять, а когда добавлять?

gora [?]
признаком удаления можно было бы использовать пустое окно ввода при нажатии кнопки
Стер пароль в поле ввода и нажал кнопку - удаление стертого пароля.
Здесь я привел свой вариант, который работает с одной кнопкой. Конечно он не такой красивый как у Вас...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
gora [?]
проще в одном месте "не давать удалять последний пароль"
Попробую сделать параметр минимального числа паролей. Хотя скорее всего я это сделаю в примере (убрав также параметр для максимального числа паролей).

эта услуга (пустое поле для ввода пароля) не постоянна и не обязательна
Хорошо, уберу эту “услугу” :smile:.

Стер пароль в поле ввода и нажал кнопку - удаление стертого пароля.
Стёртый пароль не запоминается, поэтому могу предложить такой вариант: введённый пароль, если найден естественно, будет удаляться из списка, если не найден, то будет добавляться.
Опять же, это можно сделать в примере, не трогая функции UDF.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновление:

v1.02
* Обновлён пример.
* Убран параметр $iMax_Pass в функции _GUICtrlPasswordCombobox_Create. Должно обрабатываться пользователем.
* Теперь функция _GUICtrlPasswordCombobox_DeletePassword не задаёт последний пароль для элемента Edit от Combobox. Должно обрабатываться пользователем.
* Теперь функция _GUICtrlPasswordCombobox_AddPassword не опустошает элемент Edit от Combobox. Должно обрабатываться пользователем.
+ Добавлена функция _GUICtrlPasswordCombobox_EditSetText.
+ Добавлена функция _GUICtrlPasswordCombobox_EditGetText.
 
Верх