Jump to content
Sign in to follow this  

SOLVED - Popup Menu on ListView Problems

Recommended Posts


I have encountered a problem which I am struggling to overcome. My ListView Popup menu was working fine until I altered the number of rows in the test data. I started out with 3000 rows and had several working functions, all accessible from the menu which appears when you click on the column header. I didn't notice anything wrong until I tried 300 rows at which point clicking the the menu items stopped sending messages.

The Help File example for _GUICtrlMenu_CreatePopup() uses WM_COMMAND messages and the menu appears as a context menu. I have altered that. The functions called from the menu all have multiple array parameters mainly status, undo/redo buffer action, occurence and type etc... I don't want to have to declare all these variables in the Global scope. For this reproducer I have replaced these functions with message boxes.

To understand the problem I am experiencing, alter the 11th line by changing the For Loop repeat value to 300 instead of 1000. You will find the menu stops working. If anyone knows what I am doing wrong, please tell me because I have no idea!

#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
;#include <Array.au3>
#Include <GuiMenu.au3>
;#include <StaticConstants.au3>


Func _SetData($hListView)
    For $i = 0 To 1000 ; <== Change this value to 300
        GUICtrlCreateListViewItem( _
        $i + 1 &"|"& _
        "B_" & $i+Random(100,700, 1) &"|"& _
        "C_" & $i+Random(100,700, 1) &"|"& _
        "D_" & $i+Random(100,700, 1) &"|"& _
        "M_" & $i+Random(100,700, 1) , $hListView)

Func _Run()
    Local $hDataBuzz = GUICreate(" AU3 Databuzz", @DesktopWidth*.9,@DesktopHeight*.8, Default, Default, $bStyle)

    Local $sHeadings = "Index"
    For $i = 1 To 4
        $sHeadings &= "| "

    $hListView = GUICtrlCreateListView($sHeadings, 0, 0, @DesktopWidth*.9, @DesktopHeight*.8 -38, _
    _GUICtrlListView_SetExtendedListViewStyle($hListView, _
    GUICtrlSetResizing ($hListView, $GUI_DOCKBOTTOM)
    _GUICtrlListView_HideColumn($hListView, 0)

    _SetData($hListView) ; For Testing

    Local $iSelectedCol = 0


    Local $ahLVMenu[5] = [1000,1001,1002,1003,1004] ; Column popup menu

    While 1
        $msg = GUIGetMsg()
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop

        If $msg = $hListView Then
            $iSelectedCol = GUICtrlGetState($hListView)
            If $iSelectedCol > 0 Then _LV_PopUpMenu($hDataBuzz, $hListView, $iSelectedCol, $ahLVMenu)

        Switch $msg
            Case $ahLVMenu[0]
                MsgBox(0, "","Rename")
            Case $ahLVMenu[1]
                MsgBox(0, "", "Align")
            Case $ahLVMenu[2]
                MsgBox(0, "", "Sort")
            Case $ahLVMenu[3]
                MsgBox(0, "", "Move")
            Case $ahLVMenu[4]
                MsgBox(0, "", "Delete")

Func _LV_PopUpMenu($hDataBuzz, $hListView, $iSelectedCol, $ahLVMenu)
    Local $aLVData = _GUICtrlListView_GetColumn($hListView, $iSelectedCol)
    Local $hMenu, $sHeader = $aLVData[5]
    If $sHeader = " " Then $sHeader = "Col " & $iSelectedCol

    $hMenu = _GUICtrlMenu_CreatePopup (40)
    _GUICtrlMenu_InsertMenuItem ($hMenu, 0, "Renane " & $sHeader, $ahLVMenu[0])
    _GUICtrlMenu_InsertMenuItem ($hMenu, 1, "Align Right", $ahLVMenu[1])
    _GUICtrlMenu_InsertMenuItem ($hMenu, 2, "Sort By " & $sHeader, $ahLVMenu[2])
    _GUICtrlMenu_InsertMenuItem ($hMenu, 3, "Move " & $sHeader, $ahLVMenu[3])
    _GUICtrlMenu_InsertMenuItem ($hMenu, 4, "Delete " & $sHeader, $ahLVMenu[4])
    _GUICtrlMenu_TrackPopupMenu ($hMenu, $hDataBuzz)
    _GUICtrlMenu_DestroyMenu ($hMenu)
    Return True
EndFunc  ;==>_LV_PopUpMenu
Edited by czardas

Share this post

Link to post
Share on other sites


I believe I have solved this myself. The mistake I made was copying the Enum values in the example for _GUICtrlMenu_CreatePopup(). Instead of that I have changed $ahLVMenu to an array of Dummy Controls and it appears to have worked. :)

If you wish to try the changes, replace the following line

Local $ahLVMenu[5] = [1000,1001,1002,1003,1004] ; Column popup menu

With these lines

Local $ahLVMenu[5] ; Column popup menu
For $i = 0 To 4
    $ahLVMenu[$i] = GUICtrlCreateDummy()
Edited by czardas

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
Sign in to follow this  


Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.