Jump to content
Dan_555

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

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

Share this post


Link to post
Share on other sites

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

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By RAMzor
      Hello all,
      I am trying to get scrolling events for ListBox (mouse wheel and up/down arrows) but without success. The event not occured on row change but if I click on it - yes
      The ComboBox works fine even if not in focus (with mouse wheel) but I prefer visual look of ListBox. In addition to all, I can't change the height of control. Unfortunately it depends only on font size and same fonts has different heights between InputBox and ComboBox
      Is there a way to get over the issue?
      Any other ideas for unit selection realization are welcome
      #include <GuiComboBox.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <ListBoxConstants.au3> Global $idCombo, $idComboUnit, $idList, $idListUnit Global $sComboInitUnit = "pJ", $fComboVal = 7.5 Global $sListInitUnit = "nF", $fListVal = 0.15 Units_Conversion_Example() Func Units_Conversion_Example() ; Create GUI GUICreate("Units Conversion", 400, 296) $idCombo = GUICtrlCreateInput($fComboVal, 22, 20, 91, 26) GUICtrlSetFont(-1, 13, 400, 0, "MS Reference Sans Serif") $idComboUnit = GUICtrlCreateCombo("", 112, 20, 50, 30) GUICtrlSetData(-1, "uJ|nJ|pJ", $sComboInitUnit) GUICtrlSetFont(-1, 13, 400, 0, "MS Reference Sans Serif") $idList = GUICtrlCreateInput($fListVal, 22, 80, 91, 26) GUICtrlSetFont(-1, 13, 400, 0, "MS Reference Sans Serif") $idListUnit = GUICtrlCreateList("", 112, 80, 57, 26, BitOR($LBS_NOTIFY,$LBS_NOSEL,$WS_VSCROLL)) GUICtrlSetData(-1, "uF|nF|pF", $sListInitUnit) GUICtrlSetFont(-1, 13, 400, 0, "MS Reference Sans Serif") GUISetState(@SW_SHOW) GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") Do Sleep(5) Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() EndFunc ;==>Example Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $hWndFrom, $iIDFrom, $iCode, $hWndCombo, $hWndListBox If Not IsHWnd($idComboUnit) Then $hWndCombo = GUICtrlGetHandle($idComboUnit) If Not IsHWnd($idListUnit) Then $hWndListBox = GUICtrlGetHandle($idListUnit) $hWndFrom = $lParam $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word $iCode = BitShift($wParam, 16) ; Hi Word Switch $hWndFrom Case $hWndCombo Switch $iCode Case $LBN_SELCHANGE ConsoleWrite(GUICtrlRead($idComboUnit) & @CRLF) EndSwitch Case $hWndListBox Switch $iCode Case $CBN_SELCHANGE ConsoleWrite(GUICtrlRead($idListUnit) & @CRLF) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_COMMAND  
       
    • By PeterVerbeek
      This topic give you access to an AutoIt functions library I maintain which is called PAL, Peter's AutoIt Library. The latest version 1.20 contains 197 functions divided into these topics:
      window, desktop and monitor mouse and GUI GUI controls including graphical buttons (jpg, png) logics and mathematics include constants string, xml string and file string dialogues and progress bars data lists: lists, stacks, shift registers and key maps (a.ka. dictionaries) miscellaneous: logging/debugging, process and system info Change log and files section  on the PAL website (SourceForge).
      A lot of these functions were created in the development of Peace, Peter's Equalizer APO Configuration Extension, which is a user interface for the system-wide audio driver called Equalizer APO.
    • By Rabu
      I want to use the winsock overlapped/completion routine method of i/o, but how do I get the pointer to my user function.  I know it is possible because when using the old method of windows messages, the user function name was used instead of a pointer.
    • By topgundcp
      Hi, 
      This is my very first post in this forum and am also new with Autoit programming so be easy on me.
      Below is the code that I am trying to get the index of the item selected. No problem getting the text.
      Case $listEdition   ; handle of the list             local $index=0             $item=GUICTRLRead($listEdition)    ; This will return the text in the list             ; ==============   The loop below always fails  ==================             ; Meaning _GUICtrlListView_GetItemSelected($listEdition, $i) always return FALSE. WHY ???????              For $i = 0 To $editionArray[0] - 1   ; The content of the list in an array where editionArray[0] contains total count of items                 If _GUICtrlListView_GetItemSelected($listEdition, $i) Then                     $index = $i                     exitloop                 EndIf              Next              ;===================================================             ConsoleWrite( "Select Edition:     " & $item & "  index: " & $index & @CR) ....... Please look at the comments in the code & the pix attached.
      _GUICtrlListView_GetItemSelected($listEdition, $i) always returns FALSE.
      Another problem is on the list. It also populate  the total count of items from the Array. How can I skip this item from populating to the list ?.
      Please advise and thanks

    • By nacerbaaziz
      hi dears, i have a question please
      am now working for an audio player for the blind users
      and i added an option to open a file from the right click context menu.
      but here there is a small problem, i hope that you can help me to find a solution for it.
      the problem is as follow :
      when i added the problem into the context menu it work with successfuly if the user select just one file.
      but if the user selected more then one file, here the problem
      a multiple sections of the program will open.
      my question is :
      how i can detect the multiple selection from the context menu?
      i know that it so  hard, but i know also that you are harder than it
      for that dears please try to give me an solution for that problem.
      thanks in advance
×
×
  • Create New...