Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] история в GUICtrlCreateCombo (http://forum.oszone.net/showthread.php?t=259290)

support23 24-04-2013 08:34 2138693

история в GUICtrlCreateCombo
 
Вложений: 1
Доброго дня!
Можно ли хранить историю введенных имен в поле GUICtrlCreateCombo, и при запуске утилиты загружать из истории данные (например имена ПК) ?
на скриншоте пример как это выглядит.

AZJIO 24-04-2013 08:53 2138694

Да, можно.

support23 24-04-2013 11:42 2138788

отлично!)
Как это сделать, подскажи?

Creat0R 24-04-2013 12:33 2138828

Код:

#include <GUIConstantsEx.au3>
#include <GUIComboBox.au3>

$sConfig = @ScriptDir & '\Config.ini'
$sHistory = IniRead($sConfig, 'Main', 'History', '')

$hGUI = GUICreate("Test Script", 300, 200)
$iCombo = GUICtrlCreateCombo("", 20, 40, 260, 60)
GUICtrlSetData($iCombo, $sHistory)
$iAddItem_Bttn = GUICtrlCreateButton('Add', 20, 70, 70, 20)


GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            $sHistory = _GUICtrlComboBox_GetList($iCombo)
            IniWrite($sConfig, 'Main', 'History', $sHistory)

            Exit
        Case $iAddItem_Bttn
            $sItem = GUICtrlRead($iCombo)

            If $sItem <> '' Then
                _GUICtrlComboBox_AddString($iCombo, $sItem)
                _GUICtrlComboBox_SetEditText($iCombo, '')
                GUICtrlSetState($iCombo, $GUI_FOCUS)
            EndIf
    EndSwitch
WEnd


support23 24-04-2013 13:08 2138850

Мой вопрос решен, большое спасибо!

AZJIO 24-04-2013 17:20 2138970

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



Время: 03:17.

Время: 03:17.
© OSzone.net 2001-