Что нового

GUISelButton - Выбор нескольких вариантов из выпадающего списка

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AutoIt: 3.3.10.2 - 3.3.14.2
Версия: 1.2

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

Описание: Создание (псевдо) элемента GUISelButton для выбора нескольких вариантов из выпадающего списка.
Что то вроде ComboBox но с CheckBox-ами.
(используется библиотека GUIScrollBars_Ex от Melba23)

Код/Пример:
Код:
#include <Array.au3>
#include 'GUISelButton.au3'

$hGUI = GUICreate('GUISelButton Demo', 280, 100)

$hSelButton1 = _GUICtrlSelButton_Create('Selection Button 1', 'Item #1|Item #2|Item #3', 20, 20, 130, 120, False, 'Sellect all')
$hSelButton2 = _GUICtrlSelButton_Create('Selection Button 2', '', 20, 60, 130, 120, True)

$sItems = ''

For $i = 1 To 50
	$sItems &= ($sItems ? '|' : '') & 'Other Item #' & $i
Next

_GUICtrlSelButton_SetData($hSelButton2, $sItems, 'Sellect all')
_GUICtrlSelButton_SetState($hSelButton2, $GUI_CHECKED, Random(0, 19, 1))
;GUICtrlSetState(_GUICtrlSelButton_GetID($hSelButton2), $GUI_DISABLE)

$iShowSel1_Bttn = GUICtrlCreateButton('Show selected', 180, 20, 80, 20)
$iShowSel2_Bttn = GUICtrlCreateButton('Show selected', 180, 60, 80, 20)

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_GUICtrlSelButton_Delete($hSelButton1)
			_GUICtrlSelButton_Delete($hSelButton2)
			
			Exit
		Case $iShowSel1_Bttn
			$aSel = _GUICtrlSelButton_GetSelected($hSelButton1)
			_ArrayDisplay($aSel)
		Case $iShowSel2_Bttn
			$aSel = _GUICtrlSelButton_GetSelected($hSelButton2)
			_ArrayDisplay($aSel)
	EndSwitch
WEnd

Снимок:


Файл: GUISelButton.zip

История версий:
1.3
* Исправлен баг когда пункты не добавляются в случае если не используется $sSellAllCBText (пустая строка) и создаётся только один пункт в $sData.
* Исправлена проблема с отображением коротких названий пунктов.

1.2
* Исправлена проблема связанная с тем что _GUICtrlSelButton_GetSelected не возвращала первый выбранный элемент.

1.1
* Добавлена возможность отмечать все элементы сразу.
* Несколько мелких исправлений.

1.0
* Первая публичная версия

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Небольшое обновление:

1.1
* Добавлена возможность отмечать все элементы сразу.
* Несколько мелких исправлений.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Почему-то игнорирует первый пункт в выпадающих списках - если выбран , то не показывает в списке выбранных, даже если установить "Sellect all", то первого пункта не будет.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Да это моя ошибка, в следующей версии исправлю.
А пока можно заменить в библиотеке:

Код:
Local $iStart = ($ahGCSB_IDs[$hSelButton][$iGCSB_sSellAllText] ? 2 : 1)
	
	For $i = $iStart To $aInfo[0][0]


на

Код:
For $i = 1 To $aInfo[0][0]
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
1.2
* Исправлена проблема связанная с тем что _GUICtrlSelButton_GetSelected не возвращала первый выбранный элемент.
 

TERMINAL

Новичок
Сообщения
18
Репутация
1
Ув.CreatoR, я сначало создаю через _GUICtrlSelButton_Create пустышку, потом обрабатываю информацию для получения списка. Если попадается один пункт и я указываю без параметра "Select All" в _GUICtrlSelButton_SetData($TestKnopka, "Это пример"), то пункт этот не высвечивается-кнопка не реагирует.

Проблема получается в _GUICtrlSelButton_Create. Если указывать один пункт без разделителя "|"-срабатывает на ошибку и пропускается этот пункт для добавления. Если же добавить к пункту разделитель, тогда появляется два пункта с чекбоксами, один который пустой. Как для меня, выход-передавать обязательно разделитель, но не обрабатывать пустые значения. Поэтому добавил поправки в циклы _GUICtrlSelButton_Create и _GUICtrlSelButton_SetData:
Код:
For $i = 1 To $aItems[0]
	If StringStripWS($aItems[$i], 3) = "" Then ContinueLoop
	If StringLen($aItems[$i]) > StringLen($sBigStr) Then
		$sBigStr = $aItems[$i]
	EndIf
Next

и
Код:
For $i = 1 To $aItems[0]
	If StringStripWS($aItems[$i], 3) = "" Then ContinueLoop
	$aItems[$i] = GUICtrlCreateCheckbox($aItems[$i], 10, $iT, $aStrSize[0] + 10, 15)
	$iT += (($sSellAllCBText And $i = 1) ? 40 : 20)
Next

Буду дальше тестировать на глюки при внесении на мои изменения.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
TERMINAL [?]
выход-передавать обязательно разделитель, но не обрабатывать пустые значения. Поэтому добавил поправки в циклы _GUICtrlSelButton_Create и _GUICtrlSelButton_SetData:
Корректнее решить это так:

Код:
$aItems = StringSplit(($sSellAllCBText ? $sSellAllCBText & '|' : '') & $sData, '|')
	
	If @error And StringStripWS($sSellAllCBText, 3) <> '' Then
		$aItems = 0
	Else


в обеих функциях.
Т.е
Код:
If @error Then

заменить на
Код:
If @error And StringStripWS($sSellAllCBText, 3) <> '' Then
 
Автор
CreatoR

CreatoR

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

v1.3
* Исправлен баг когда пункты не добавляются в случае если не используется $sSellAllCBText (пустая строка) и создаётся только один пункт в $sData.
* Исправлена проблема с отображением коротких названий пунктов.
 
Верх