Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для AZJIO

Старожил


Сообщения: 265
Благодарности: 126

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось AZJIO, 24-04-2013 в 23:07.


Отправлено: 17:20, 24-04-2013 | #6