support23, могу только предложить выковыривать из программ JumpReg и TextReplace, особенность - посде добавления очередного пункта, если он уже есть в списке, то перемещается к верху. Выбор из списка перемещает пункт к верху. Превышение определённого количества пунктов удаляет последний в списке. Алгоритм прост, после нажатия Enter или любого события подтверждающего, что ввод окончен происходит очистка ComboBox, а список пунктов хранящийся в переменной подвергается обработке по условию указанному выше и результат применяется к ComboBox.
Вот
Код:
#include <GUIConstantsEx.au3>
#include <GuiComboBox.au3>
$sConfig = @ScriptDir & '\Config.ini'
$sHistory = IniRead($sConfig, 'Main', 'History', '')
$iLimit = 5
$hGUI = GUICreate("Пример, История в Combo", 300, 200)
$iCombo = GUICtrlCreateCombo('', 20, 40, 260, -1)
If $sHistory Then GUICtrlSetData($iCombo, $sHistory, StringRegExpReplace($sHistory, '(.*?)\|.*|(.*?)', '\1'))
$iAddItem_Btn = GUICtrlCreateButton('Добавить', 20, 70, 70, 20)
GUISetState()
While 1
Switch GUIGetMsg()
Case $iAddItem_Btn
_Combo_AddToHistory($iCombo, GUICtrlRead($iCombo), $sHistory, $iLimit)
Case $GUI_EVENT_CLOSE
$sHistory = _GUICtrlComboBox_GetList($iCombo)
IniWrite($sConfig, 'Main', 'History', $sHistory)
Exit
EndSwitch
WEnd
; Добавляет пункт в историю
Func _Combo_AddToHistory($iCombo, $sAdd, ByRef $sHistory, $iLimit)
If Not $sAdd Then Return
If Not $sHistory Then
$sHistory = $sAdd
GUICtrlSetData($iCombo, $sHistory, $sHistory)
Return
EndIf
; Удаляем элемент из списка, если он существует в нём
$tmp = StringReplace('|' & $sHistory & '|', '|' & $sAdd & '|', '|')
If @extended Then $sHistory = StringTrimLeft(StringTrimRight($tmp, 1), 1)
; Добавляем элемент
$sHistory = $sAdd & '|' & $sHistory
; Если число элементов превышает определённый лимит, то отрезаем крайние справа
StringReplace($sHistory, '|', '')
If @extended > $iLimit - 1 Then
; Получаем позицию обрезки и обрезаем
$sHistory = StringLeft($sHistory, StringInStr($sHistory, '|', 0, $iLimit) - 1)
EndIf
GUICtrlSendMsg($iCombo, $CB_RESETCONTENT, 0, 0) ; удаляем контент в Combo
GUICtrlSetData($iCombo, $sHistory, StringRegExpReplace($sHistory, '(.*?)\|.*', '\1')) ; Вставляем контент
; GUICtrlSetState($iCombo, $GUI_FOCUS) ; ставим фокус в Combo, если требуется
EndFunc ;==>_AddedHistory
вариант 2
Код:
#include <GUIConstantsEx.au3>
#include <GuiComboBox.au3>
$sConfig = @ScriptDir & '\Config.ini'
$sHistory = IniRead($sConfig, 'Main', 'History', '')
$iLimit = 5
$hGUI = GUICreate("Пример, История в Combo", 300, 200)
$iCombo = GUICtrlCreateCombo('', 20, 40, 260, -1)
If $sHistory Then GUICtrlSetData($iCombo, $sHistory, StringRegExpReplace($sHistory, '(.*?)\|.*|(.*?)', '\1'))
$iAddItem_Btn = GUICtrlCreateButton('Добавить', 20, 70, 70, 20)
GUISetState()
While 1
Switch GUIGetMsg()
Case $iAddItem_Btn
_Combo_AddToHistory($iCombo, GUICtrlRead($iCombo), $sHistory, $iLimit)
Case $GUI_EVENT_CLOSE
$sHistory = _GUICtrlComboBox_GetList($iCombo)
IniWrite($sConfig, 'Main', 'History', $sHistory)
Exit
EndSwitch
WEnd
; Добавляет пункт в историю
Func _Combo_AddToHistory($iCombo, $sAdd, ByRef $sHistory, $iLimit)
If Not $sAdd Then Return
If Not $sHistory Then
$sHistory = $sAdd
GUICtrlSetData($iCombo, $sHistory, $sHistory)
Return
EndIf
$iIndex = _GUICtrlComboBox_FindStringExact($iCombo, $sAdd) ; поиск строки, если такая уже существует в истории
If $iIndex <> -1 Then _GUICtrlComboBox_DeleteString($iCombo, $iIndex) ; удалить если существует
_GUICtrlComboBox_InsertString($iCombo, $sAdd, 0) ; добавляет строку к начало
$iCount = _GUICtrlComboBox_GetCount($iCombo) ; Количество пунктов
If $iCount > $iLimit Then ; если больше лимита, то удаляем
For $i = $iLimit To $iCount + 1
_GUICtrlComboBox_DeleteString($iCombo, $i)
Next
EndIf
; GUICtrlSetState($iCombo, $GUI_FOCUS) ; ставим фокус в Combo, если требуется
EndFunc ;==>_AddedHistory
|