Jump to content

Listbox functions (Clear, Delete, Invert, Move Selection)


Dan_555
 Share

Recommended Posts

Hi, here are few functions for the ListBox.

I have searched the forum, but most of the functions are for listview, so i took one example code from melba23 (clear selection) and

wrote few more functions. (Because my current project needs them).

 

These functions work only on a Multi-selection ListBox . 

Edit: Only 1 function does not work with single selection box.

The functions do: Clear Selection, Delete Selected items, Invert Selection, Move selected items up and down.

 The example code has 2 Listboxes. The selected items on the left ListBox can be moved up and down. The right Listbox has buttons for the other functions.

#include <GUIConstantsEx.au3>
#include <GuiListBox.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

Local $singlesel = 0, $iMsgBoxAnswer = 0

;MsgBox features: Title=Yes, Text=Yes, Buttons=Yes and No, Icon=Question, Modality=Task Modal

$iMsgBoxAnswer = MsgBox(8228, "Choose Listbox selecton type", "Yes for single, No for multi selection box")
If $iMsgBoxAnswer = 6 Then $singlesel = 1 ;Yes

Local $BL_1,$BL_2,$BR_1,$BR_2,$BR_3,$BR_4,$BR_5,$BR_6

Global $hForm1 = GUICreate("Listbox test", 349, 287)
$LB_1 = GUICtrlCreateList("", 6, 40, 157, 244, BitOR($LBS_NOTIFY, $LBS_MULTIPLESEL, $WS_HSCROLL, $WS_VSCROLL, $LBS_DISABLENOSCROLL))

If $singlesel = 1 Then
    $LB_2 = GUICtrlCreateList("", 179, 40, 157, 244, BitOR($LBS_NOTIFY, $WS_HSCROLL, $WS_VSCROLL, $LBS_DISABLENOSCROLL))
Else
    $LB_2 = GUICtrlCreateList("", 179, 40, 157, 244, BitOR($LBS_NOTIFY, $LBS_MULTIPLESEL, $WS_HSCROLL, $WS_VSCROLL, $LBS_DISABLENOSCROLL))
    $BR_3 = GUICtrlCreateButton("Reverse Sel", 272, 22, 68, 17)
EndIf

$BL_1 = GUICtrlCreateButton("Up", 20, 3, 35, 18)
$BL_2 = GUICtrlCreateButton("Down", 60, 3, 35, 18)
$BR_1 = GUICtrlCreateButton("Up", 200, 3, 35, 18)
$BR_2 = GUICtrlCreateButton("Down", 240, 3, 35, 18)

$BR_4 = GUICtrlCreateButton("Clear Sel", 217, 22, 52, 17)
$BR_5 = GUICtrlCreateButton("Delete", 175, 22, 40, 17)
$BR_6 = GUICtrlCreateButton("Populate", 290, 3, 50, 18)
GUISetState(@SW_SHOW)

For $x = 0 To 50
    If $x <= 10 Then GUICtrlSetData($LB_1, $x & " test", 0)
    GUICtrlSetData($LB_2, $x & " Test", 0)
Next


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $BL_1
            $a = Listbox_ItemMoveUD($LB_1, -1)
            If $a > -1 Then WinSetTitle($hForm1, "", "Moved items: " & $a)
        Case $BL_2
            $a = Listbox_ItemMoveUD($LB_1, 1)
            If $a > -1 Then WinSetTitle($hForm1, "", "Moved items: " & $a)
        Case $BR_1
            Listbox_ItemMoveUD($LB_2, -1)
        Case $BR_2
            Listbox_ItemMoveUD($LB_2, 1)
        Case $BR_3
            Listbox_ReverseSelection($LB_2)
        Case $BR_4
            Listbox_ClearSelection($LB_2)
        Case $BR_5
            Listbox_DeleteSelectedItems($LB_2)
        Case $BR_6                                  ;Populate
            GUICtrlSetData($LB_2, "") ; Clears the listbox
            For $x = 0 To 50
                GUICtrlSetData($LB_2, $x & " Test", 0)
            Next
    EndSwitch
WEnd


;note $hLB_ID - is the Listbox id

Func Listbox_DeleteSelectedItems($hLB_ID)
    Local $aSel = _GUICtrlListBox_GetSelItems($hLB_ID)        ;Get selected items
    Local $i, $slb = 0, $y, $x
    If $aSel[0] = 0 Then            ;If the array is empty, there is no selection, or it is a single selection listbox
        For $x = 0 To _GUICtrlListBox_GetCount($hLB_ID) - 1
            $y = _GUICtrlListBox_GetSel($hLB_ID, $x)
            If $y = True Then
                $slb = 1
                _GUICtrlListBox_DeleteString($hLB_ID, $x) ;Perform a delete on single sel. LB
                ExitLoop
            EndIf
        Next
    EndIf

    If $slb = 0 Then
        _GUICtrlListBox_BeginUpdate($hLB_ID)
        For $i = $aSel[0] To 1 Step -1                    ;Loop backwards and delete the selected items
            _GUICtrlListBox_DeleteString($hLB_ID, $aSel[$i])
        Next
        _GUICtrlListBox_EndUpdate($hLB_ID)
    EndIf
EndFunc   ;==>Listbox_DeleteSelectedItems

Func Listbox_ClearSelection($hLB_ID)
    ;Removes the selection from multi and single selection ListBox
    Local $aSel = _GUICtrlListBox_GetSelItems($hLB_ID)            ;Code from Melba23 - Autoit Forum
    Local $slb, $x, $y
    If $aSel[0] = 0 Then
        _GUICtrlListBox_SetCurSel($hLB_ID, -1)
        $slb = 1
    EndIf

    If $slb = 0 Then
        _GUICtrlListBox_BeginUpdate($hLB_ID)
        For $i = 1 To $aSel[0]
            _GUICtrlListBox_SetSel($hLB_ID, $aSel[$i], False)
        Next
        _GUICtrlListBox_EndUpdate($hLB_ID)
    EndIf
EndFunc   ;==>Listbox_ClearSelection

Func Listbox_ReverseSelection($hLB_ID)
    ;Logically, this function works only on multi-selection listboxes
    Local $i
    Local $aCou = _GUICtrlListBox_GetCount($hLB_ID)
    Local $cSel = _GUICtrlListBox_GetCaretIndex($hLB_ID)    ;Save the caret
    _GUICtrlListBox_BeginUpdate($hLB_ID)
    For $i = 0 To $aCou
        _GUICtrlListBox_SetSel($hLB_ID, $i, Not (_GUICtrlListBox_GetSel($hLB_ID, $i)))
    Next
    _GUICtrlListBox_SetCaretIndex($hLB_ID, $cSel)            ;Restore the caret
    _GUICtrlListBox_EndUpdate($hLB_ID)
EndFunc   ;==>Listbox_ReverseSelection


Func Listbox_ItemMoveUD($hLB_ID, $iDir = -1)
    ;Listbox_ItemMoveUD - Up/Down  Move Multi/Single item in a ListBox
    ;$iDir: -1 up, 1 down
    ;Return values -1 nothing to do, 0 nothing moved, >0 performed moves
    Local $iCur, $iNxt, $aCou, $aSel, $i, $m = 0, $y, $slb = 0 ;Current, next, Count, Selection, loop , movecount

    $aSel = _GUICtrlListBox_GetSelItems($hLB_ID) ;Put selected items in an array
    $aCou = _GUICtrlListBox_GetCount($hLB_ID) ;Get total item count of the listbox

    If $aSel[0] = 0 Then
        $y = _GUICtrlListBox_GetCurSel($hLB_ID)
        If $y > -1 Then
            _ArrayAdd($aSel, $y)
            $aSel[0] = 1
            $slb = 1
        EndIf
    EndIf

    ;WinSetTitle($hGUI, "", $aSel[0])                   ;Debugging info

    Select
        Case $iDir = -1 ;Move Up
            For $i = 1 To $aSel[0]
                If $aSel[$i] > 0 Then
                    $iNxt = _GUICtrlListBox_GetText($hLB_ID, $aSel[$i] - 1) ;Save the selection index - 1 text
                    _GUICtrlListBox_ReplaceString($hLB_ID, $aSel[$i] - 1, _GUICtrlListBox_GetText($hLB_ID, $aSel[$i])) ;Replace the index-1 text with the index text
                    _GUICtrlListBox_ReplaceString($hLB_ID, $aSel[$i], $iNxt) ;Replace the selection with the saved var
                    $m = $m + 1
                EndIf
            Next
            For $i = 1 To $aSel[0] ;Restore the selections after moving
                If $aSel[$i] > 0 Then
                    If $slb = 0 Then
                        _GUICtrlListBox_SetSel($hLB_ID, $aSel[$i] - 1, 1)
                    Else
                        _GUICtrlListBox_SetCurSel($hLB_ID, $aSel[$i] - 1)
                    EndIf
                EndIf
            Next
            Return $m
        Case $iDir = 1 ;Move Down
            If $aSel[0] > 0 Then
                For $i = $aSel[0] To 1 Step -1
                    If $aSel[$i] < $aCou - 1 Then
                        $iNxt = _GUICtrlListBox_GetText($hLB_ID, $aSel[$i] + 1)
                        _GUICtrlListBox_ReplaceString($hLB_ID, $aSel[$i] + 1, _GUICtrlListBox_GetText($hLB_ID, $aSel[$i]))
                        _GUICtrlListBox_ReplaceString($hLB_ID, $aSel[$i], $iNxt)
                        $m = $m + 1
                    EndIf
                Next
            EndIf
            For $i = $aSel[0] To 1 Step -1 ;Restore the selections after moving
                If $aSel[$i] < $aCou - 1 Then
                    If $slb = 0 Then
                        _GUICtrlListBox_SetSel($hLB_ID, $aSel[$i] + 1, 1)
                    Else
                        _GUICtrlListBox_SetCurSel($hLB_ID, $aSel[$i] + 1)
                    EndIf
                EndIf
            Next
            Return $m
    EndSelect
    Return -1
EndFunc   ;==>Listbox_ItemMoveUD

 

Edited by Dan_555
Updated code, now working with single selection boxes too

Some of my script sourcecode

Link to comment
Share on other sites

  • Dan_555 changed the title to Listbox functions (Clear, Delete, Invert, Move Selection)

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...