robertocm Posted July 25, 2018 Posted July 25, 2018 Dear Melba23, In the context of reloading the ListView, it seems that if we first click some row (select a row), then _GUICtrlListView_DeleteAllItems function seems to make the _EventMonitor to return 9 with a row value of -1, and also column -1 But this is observed only first time (first reloding). This are the steps to reproduce: - We first click on some row - Then reloads the ListView: first time we get 9 wit a -1 row Better to explain with this example (click the button for reloading to reproduce): expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include "GUIListViewEx.au3" $hGUI = GUICreate("", 500, 340) $cReLoad = GUICtrlCreateButton("Reload ListView", 150, 300, 150, 30) $cExit = GUICtrlCreateButton("Exit", 350, 300, 110, 30) ; Create ListView $cLV = GUICtrlCreateListView("Zero Column|One Column|Two Column|Three Column", 10, 30, 480, 260, BitOR($LVS_SINGLESEL, $LVS_SHOWSELALWAYS)) For $i = 0 To 3 _GUICtrlListView_SetColumnWidth($cLV, $i, 100) Next ;Add data For $i = 0 To 5 GUICtrlCreateListViewItem("Item 0-" & $i & "|SubItem 1-" & $i & "|SubItem 2-" & $i & "|SubItem 3-" & $i, $cLV) Next ;Read the current ListView content $aLV = _GUIListViewEx_ReadToArray($cLV) ; Inititate the ListView using that content $iLV = _GUIListViewEx_Init($cLV, $aLV) ;Set all column editable _GUIListViewEx_SetEditStatus($iLV, "*") ;Register for sorting, dragging and editing _GUIListViewEx_MsgRegister() GUISetState() ;Send a mouse click to the listview ControlClick($hGUI, "", $cLV) While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $GUI_EVENT_CLOSE, $cExit Exit Case $cReLoad Reload_ListView() EndSwitch $vRet = _GUIListViewEx_EventMonitor() If @error Then MsgBox($MB_SYSTEMMODAL, "Error", "Event error: " & @error) EndIf Switch @extended Case 1 ; This is returned after an edit attempt If $vRet = "" Then MsgBox($MB_SYSTEMMODAL, "Edit", "Edit aborted" & @CRLF) Else MsgBox($MB_SYSTEMMODAL, "Edit", "Successful edit" & @CRLF) EndIf Case 9 ; This is returned after a selection change If $vRet[1] = -1 Then MsgBox($MB_SYSTEMMODAL, "Selection changed", "New selection:" & @CRLF & "Row: " & $vRet[1] & @CRLF & "Col: " & $vRet[2]) EndSwitch WEnd Func Reload_ListView() ;first clear the current content _GUICtrlListView_DeleteAllItems($cLV) ;close it within the UDF _GUIListViewEx_Close(0) ;reload the ListView with the same data _GUICtrlListView_AddArray($cLV, $aLV) ;Initiate LVEx - using same filling array _GUIListViewEx_Init($cLV, $aLV) ;Set all columns editable _GUIListViewEx_SetEditStatus($iLV, "*") EndFunc Please also let me comment a little doubt, ¿is it possible not returning 9 just after an edit? It seems that editing always make the _EventMonitor to return 9 Many Thanks for your time!
Moderators Melba23 Posted July 25, 2018 Author Moderators Posted July 25, 2018 robertocm, I have discovered a few other cases where the UDF returns 9 when it should not. I was trying to prevent these exceptions from firing the "user selection" event, but as there are so many I am now looking to limit the event return to when the user has clicked the mouse or used the arrow keys. The real world is a bit complicated and taking up my time at the moment, but I hope to have something for you to try and break soon. M23 robertocm 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
robertocm Posted July 25, 2018 Posted July 25, 2018 Dear Melba23, Many Thanks again, and don't worry to reply soon, for me is fully functional, I'm always sincerely impressioned by your work in the forum. Let me share an idea for the future: it should not be difficult to get a transparent label actioning as a highlighting frame that moves following the selected subitem (in short: similar to the visual effect of a selected cell in a excel sheet) Here a first try: expandcollapse popup#include <GuiConstantsEx.au3> #include <MsgBoxConstants.au3> #include <StaticConstants.au3> #include "GUIListViewEx.au3" ;Create GUI $hGUI = GUICreate("LVEx Example GetLastSel", 640, 510) $FrameLabel = GUICtrlCreateLabel("", -1, -1, 150, 40, $SS_BLACKFRAME) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) ; Create ListView Global $cListView_Left = GUICtrlCreateListView("Tom|Dick|Harry", 10, 40, 300, 300, $LVS_SHOWSELALWAYS) _GUICtrlListView_SetExtendedListViewStyle($cListView_Left, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES)) _GUICtrlListView_SetColumnWidth($cListView_Left, 0, 93) _GUICtrlListView_SetColumnWidth($cListView_Left, 1, 93) _GUICtrlListView_SetColumnWidth($cListView_Left, 2, 93) ; Create ListView Global $cListView_Right = GUICtrlCreateListView("Tom|Dick|Harry", 310, 40, 300, 300, $LVS_SHOWSELALWAYS) _GUICtrlListView_SetExtendedListViewStyle($cListView_Right, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES)) _GUICtrlListView_SetColumnWidth($cListView_Right, 0, 93) _GUICtrlListView_SetColumnWidth($cListView_Right, 1, 93) _GUICtrlListView_SetColumnWidth($cListView_Right, 2, 93) ; Create array and fill Left listview Global $aLV_List[10] For $i = 0 To UBound($aLV_List) - 1 $aLV_List[$i] = "Tom " & $i & "|Dick " & $i & "|Harry " & $i GUICtrlCreateListViewItem($aLV_List[$i], $cListView_Left) GUICtrlCreateListViewItem($aLV_List[$i], $cListView_Right) Next ; Initiate LVEx Global $iLV_Index_Left = _GUIListViewEx_Init($cListView_Left, $aLV_List) _GUIListViewEx_SetEditStatus($iLV_Index_Left, "*") $iLV_Index_Right = _GUIListViewEx_Init($cListView_Right, $aLV_List) _GUIListViewEx_SetEditStatus($iLV_Index_Right, "*") $cExit_Button = GUICtrlCreateButton("Exit", 430, 390, 200, 110) _GUIListViewEx_SetActive($iLV_Index_Left) ; Register for sorting, dragging and editing _GUIListViewEx_MsgRegister() GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $cExit_Button Exit EndSwitch $vRet = _GUIListViewEx_EventMonitor() If @error Then MsgBox($MB_SYSTEMMODAL, "Error", "Event error: " & @error) EndIf Switch @extended Case 1 ; This is returned after an edit attempt If $vRet = "" Then MsgBox($MB_SYSTEMMODAL, "Edit", "Edit aborted" & @CRLF) Else MsgBox($MB_SYSTEMMODAL, "Edit", "Successful edit" & @CRLF) EndIf Case 9 ; This is returned after a selection change ;MsgBox($MB_SYSTEMMODAL, "Selection changed", "New selection:" & @CRLF & "Row: " & $vRet[1] & @CRLF & "Col: " & $vRet[2]) $aRect = _GUICtrlListView_GetSubItemRect($cListView_Left, $vRet[1], $vRet[2]) ControlMove($hGUI, "", $FrameLabel, $aRect[0], $aRect[1] + 40, $aRect[2] - $aRect[0], $aRect[3] - $aRect[1]) ;GUICtrlSetPos($FrameLabel, $aRect[0], $aRect[1], $aRect[2] - $aRect[0], $aRect[3] - $aRect[1]) ;<< does not work EndSwitch WEnd
Moderators Melba23 Posted July 28, 2018 Author Moderators Posted July 28, 2018 (edited) robertocm, Here is the new version - please try and break it. Note that using the left/right keys only returns a "selection change" message if the ListView has been set up to allow single cell highlighting: As to the "highlight" idea - it is a complete non-starter. Adding the outline as an overlay is easy, but as soon as the ListView is scrolled everything goes pear-shaped very quickly. That is why scrolling the ListView during an edit operation aborts the edit as it was too difficult to keep the input correctly positioned. And you can already get single cell highlighting (see Example 6) so the whole idea is moot in my eyes. M23 Edited October 3, 2018 by Melba23 Beta code removed Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
robertocm Posted July 29, 2018 Posted July 29, 2018 Dear Melba23, Solved, Many Thanks! I'll study Example 6 for the single cell highlighting "idea"
Moderators Melba23 Posted August 1, 2018 Author Moderators Posted August 1, 2018 (edited) [NEW VERSION] - 1 Aug18 Added: - Adding items to a native ListView resizes the column to fit the data - the UDF can now retain the original size - look for the $fRetainWidth parameter in _GUIListViewEx_Insert & _GUIListViewEx_InsertSpec. - _GUIListViewEx_EventMonitor now returns 9 when the user changes the ListView selection - the function returns an array contain the ListView index and the row and column selected. New version, examples and guide in the first post. M23 Edited August 1, 2018 by Melba23 10 years today!! mLipok 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
jcpetu Posted August 2, 2018 Posted August 2, 2018 Hi Melba, thanks a lot for your hard work and for sharing. Do you know if it is any way to automatically arrange row number after you sort a Listview by clicking on a column? Thanks in advance.
faustf Posted August 2, 2018 Posted August 2, 2018 hi @Melba23 thanks for this UDF , i try to understund , but for my poor mind is very complex UDF ,i have a request , is possible create with this UDF another simplify UDF ? for example somthing like this , (the example not work ofcourse (otherwise i got understood :D)) expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <AutoItConstants.au3> #include <StaticConstants.au3> #include <UpDownConstants.au3> #include <EditConstants.au3> #include <File.au3> #include <Misc.au3> #include <String.au3> #include <Array.au3> #include "GUIListViewEx.au3" Global $iGreen = "0xCCFFCC" Global $cLV_1,$iLVIndex_1 Global $aLVArray_1[6][4] _main() Func _main() Local $sLcolumn="Zero Column|One Column|Two Column|Three Column" Local $aLDimensPstn="10, 30, 480, 260" Local $sLBitOR ="BitOR($LVS_SINGLESEL, $LVS_SHOWSELALWAYS)" Local $sLExBitOR = "BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_HEADERDRAGDROP)" _ListviewPlus($sLcolumn,$aLDimensPstn,$sLBitOR,$sLExBitOR) $iLVIndex_1 = _GUIListViewEx_Init($cLV_1, $aLVArray_1, 0, 0, True, 1 + 8 + 32) ; + 16 ; Create array and fill listview For $i = 0 To 5 $sData = "Item " & $i & "-0" $aLVArray_1[$i][0] = $sData For $j = 1 To 3 $sData &= "|SubItem " & $i & "-" & $j $aLVArray_1[$i][$j] = "SubItem " & $i & "-" & $j Next GUICtrlCreateListViewItem($sData, $cLV_1) Next GUISetState() EndFunc Func _ListviewPlus($Column,$DimPst,$BitOr,$BitExOR) $cLV_1 = GUICtrlCreateListView($Column,$DimPst ,$BitOr) _GUICtrlListView_SetExtendedListViewStyle($cLV_1,$BitExOR) For $i = 0 To 3 _GUICtrlListView_SetColumnWidth($cLV_1, $i, 100) Next ; Initiate ListView = sort on column click - editable headers - header colours - user colours $iLVIndex_1 = _GUIListViewEx_Init($cLV_1, $aLVArray_1, 0, 0, True, 1 + 8 + 32) ; + 16 ; Set column edit status _GUIListViewEx_SetEditStatus($iLVIndex_1, 1) ; Default = standard text edit ;_GUIListViewEx_SetEditStatus($iLVIndex_1, 2, 2, "1|2|3", True) ; 2 = Read-only combo ;_GUIListViewEx_SetEditStatus($iLVIndex_1, 3, 3) ; 3 = DTP ; Create colour array - 0-based to fit ListView content Global $aLVCol_1[6][4] = [["" & ";" & ""], _ ; Format TxtCol;BkCol [";" & $iGreen, ";" & $iGreen, ";" & $iGreen,";" & $iGreen], _ ; Use leading/trailing ; to indicate if single colour is TxtCol or BkCol [";", "", "" & ";" & ""]] ; Default (or no change) can be ";" or "" ; Load colour array into ListView _GUIListViewEx_LoadColour($iLVIndex_1, $aLVCol_1) _ArrayDisplay($aLVCol_1) Global $aHdrData[][] = [[Default, "", "", ""], _ ["", Default, "", ""], _ ["", "", "", Default], _ [0, 0, Default, 0]] _ArrayDisplay($aLVCol_1) _GUIListViewEx_LoadHdrData($iLVIndex_1, $aHdrData) ; If colours used then this function must be run BEFORE GUISetState _GUIListViewEx_MsgRegister() EndFunc while 1 WEnd
Moderators Melba23 Posted August 2, 2018 Author Moderators Posted August 2, 2018 jcpetu, I am afraid do not understand your question - the row numbers are automatically reset when the ListView is sorted. Can you please post a short script showing the problem you are encountering. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Moderators Melba23 Posted August 2, 2018 Author Moderators Posted August 2, 2018 faustf, What do you want your script to do? If you explain the required end-state I will see if I can get the UDF to do it. Just providing a non-working script with no explanation is not a lot of help. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
UEZ Posted August 2, 2018 Posted August 2, 2018 10 years anniversary update. Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
faustf Posted August 2, 2018 Posted August 2, 2018 hi Thankz for reply , i try to understund this UDF (beast ) but i try to simplify much the example 7 , in practice the final result i want , is a listviewe with foto in left , and possibility color line and sort when a click in top of listview so the 1 questions is how is possible insert a foto a this point ? for example ? P.S. i belive i finded a buf of scite in last comment #ce #cs not colored all green but i think work correctly expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <AutoItConstants.au3> #include <StaticConstants.au3> #include <UpDownConstants.au3> #include <EditConstants.au3> #include <File.au3> #include <Misc.au3> #include <String.au3> #include <Array.au3> #include "GUIListViewEx.au3" Global $iYellow = "0xFFFF00", _ $iLtBlue = "0xCCCCFF", _ $iGreen = "0xCCFFCC", _ $iBlack = "0x000000", _ $iRed = "0xFF0000", _ $iBlue = "0x0000FF", _ $iWhite = "0xFFFFFF" Global $sRet $hGUI = GUICreate("Coloured ListView Example", 1000, 510) ; Create ListView GUICtrlCreateLabel("Full row select - right click item for colour options", 10, 10, 400, 20) $cLV_1 = GUICtrlCreateListView("Zero Column|One Column|Two Column|Three Column", 10, 30, 480, 260, BitOR($LVS_SINGLESEL, $LVS_SHOWSELALWAYS)) _GUICtrlListView_SetExtendedListViewStyle($cLV_1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_HEADERDRAGDROP)) For $i = 0 To 3 _GUICtrlListView_SetColumnWidth($cLV_1, $i, 100) Next ; Create array and fill listview Global $aLVArray_1[6][4] For $i = 0 To 5 $sData = "Item " & $i & "-0" $aLVArray_1[$i][0] = $sData For $j = 1 To 3 $sData &= "|SubItem " & $i & "-" & $j $aLVArray_1[$i][$j] = "SubItem " & $i & "-" & $j Next GUICtrlCreateListViewItem($sData, $cLV_1) Next ; Initiate ListView = sort on column click - editable headers - header colours - user colours $iLVIndex_1 = _GUIListViewEx_Init($cLV_1, $aLVArray_1, 0, 0, True, 1 + 8 + 32) ; + 16 ; Set column edit status _GUIListViewEx_SetEditStatus($iLVIndex_1, 1) ; Default = standard text edit ;_GUIListViewEx_SetEditStatus($iLVIndex_1, 2, 2, "1|2|3", True) ; 2 = Read-only combo ;_GUIListViewEx_SetEditStatus($iLVIndex_1, 3, 3) ; 3 = DTP ; Create colour array - 0-based to fit ListView content Global $aLVCol_1[6][4] = [["" & ";" & ""], _ ; Format TxtCol;BkCol [";" & $iGreen, ";" & $iGreen, ";" & $iGreen,";" & $iGreen], _ ; Use leading/trailing ; to indicate if single colour is TxtCol or BkCol [";", "", "" & ";" & ""]] ; Default (or no change) can be ";" or "" ; Load colour array into ListView _GUIListViewEx_LoadColour($iLVIndex_1, $aLVCol_1) _ArrayDisplay($aLVCol_1) ;_GUIListViewEx_LoadColour($iLVIndex_1, '0xCCFFCC') ; Set header data ;Global $aHdrData[][] = [["Tom", "Dick", "Harry", "Fred"], _ ; As colour is enabled, these will replace original titles ; ["0xFF8080;0x8888FF", "0xFEFEFE;0x000000", "", "0xFFFF00;0x00FF80"], _ ; Col 2 will use default colours ; ["", "", @TAB & "H1|H2|H3", ""], _ ; Col 2 readonly combo; Col 1 & 3 text ; [0, 0, 100, 0]] ; Col 2 not resizeable - fixed 100 pixel width Global $aHdrData[][] = [[Default, "", "", ""], _ ["", Default, "", ""], _ ["", "", "", Default], _ [0, 0, Default, 0]] _ArrayDisplay($aLVCol_1) _GUIListViewEx_LoadHdrData($iLVIndex_1, $aHdrData) #cs ; Create context menu for native ListView $mContextmenu = GUICtrlCreateContextMenu($cLV_1) $mWhtTxt = GUICtrlCreateMenuItem("White text", $mContextmenu) $mYelTxt = GUICtrlCreateMenuItem("Yellow text", $mContextmenu) $mBluTxt = GUICtrlCreateMenuItem("Cyan text", $mContextmenu) $mGrnTxt = GUICtrlCreateMenuItem("Green text", $mContextmenu) $mBlkTxt = GUICtrlCreateMenuItem("Black text", $mContextmenu) GUICtrlCreateMenuItem("", $mContextmenu) $mWhtFld = GUICtrlCreateMenuItem("White field", $mContextmenu) $mRedFld = GUICtrlCreateMenuItem("Red field", $mContextmenu) $mBluFld = GUICtrlCreateMenuItem("Blue field", $mContextmenu) $mGrnFld = GUICtrlCreateMenuItem("Green field", $mContextmenu) $mBlkFld = GUICtrlCreateMenuItem("Black field", $mContextmenu) GUICtrlCreateMenuItem("", $mContextmenu) $mDefTxt = GUICtrlCreateMenuItem("Default txt", $mContextmenu) $mDefFld = GUICtrlCreateMenuItem("Default field", $mContextmenu) $mDefBoth = GUICtrlCreateMenuItem("Default both", $mContextmenu) #ce #cs ; Create empty UDF ListView GUICtrlCreateLabel("Single cell select - use controls below for colour options", 510, 10, 400, 20) $cLV_2 = _GUICtrlListView_Create($hGUI, "", 510, 30, 480, 260, BitOr($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $WS_BORDER)) _GUICtrlListView_SetExtendedListViewStyle($cLV_2, $LVS_EX_FULLROWSELECT) ; Initiate to get index - empty array passed with no cols so initially set for 1D return array - user coloured items and headers + single cell select $iLVIndex_2 = _GUIListViewEx_Init($cLV_2, "", 0, 0, True, 32 + 1024) ; 16 + ; Set required colours for ListView elements - change = pink field Local $aSelCol[4] = [Default, "0xFFCCCC", Default, Default] _GUIListViewEx_SetDefColours($iLVIndex_2, $aSelCol) #ce ; Create buttons for LH ListView #cs GUICtrlCreateGroup("", 10, 300, 480, 160) GUICtrlCreateLabel("Up/Down", 25, 320, 80, 20, $SS_CENTER) $cUp = GUICtrlCreateButton("Up", 25, 340, 80, 30) $cDown = GUICtrlCreateButton("Down", 25, 380, 80, 30) GUICtrlCreateLabel("Ins/Del", 150, 320, 80, 20, $SS_CENTER) $cIns = GUICtrlCreateButton("Ins", 150, 340, 80, 30) $cDel = GUICtrlCreateButton("Del", 150, 380, 80, 30) GUICtrlCreateLabel("Ins/Del Spec", 275, 320, 80, 20, $SS_CENTER) $cInsSpec = GUICtrlCreateButton("Insert Spec", 275, 340, 80, 30) $cDelSpec = GUICtrlCreateButton("Delete Spec", 275, 380, 80, 30) GUIStartGroup() $cRad_Row = GUICtrlCreateRadio(" Row", 160, 425, 40, 20) GUICtrlSetState($cRad_Row, $GUI_CHECKED) $cRad_Col = GUICtrlCreateRadio(" Col", 220, 425, 40, 20) $cSpecChoose = GUICtrlCreateInput(0, 275, 420, 80, 30) GUICtrlSetFont($cSpecChoose, 18) GUICtrlCreateUpdown($cSpecChoose, BitOr($UDS_WRAP, $UDS_ALIGNRIGHT)) GUICtrlSetLimit(-1, 9, 0) GUICtrlCreateLabel("Read", 400, 320, 80, 20, $SS_CENTER) $cContent = GUICtrlCreateButton("Content", 400, 340, 80, 30) $cColour = GUICtrlCreateButton("Colour", 400, 380, 80, 30) $cHeaders = GUICtrlCreateButton("Headers", 400, 420, 80, 30) ; Create colour controls for UDF ListView GUICtrlCreateGroup("", 510, 300, 480, 160) GUICtrlCreateLabel("Row", 525, 320, 80, 20, $SS_CENTER) $cColRow = GUICtrlCreateInput(0, 525, 340, 80, 30, $ES_READONLY) GUICtrlSetFont($cColRow, 18) GUICtrlCreateUpdown($cColRow, BitOr($UDS_WRAP, $UDS_ALIGNRIGHT)) GUICtrlSetLimit(-1, 9, 0) GUICtrlCreateLabel("Column", 640, 320, 80, 20, $SS_CENTER) $cColCol = GUICtrlCreateInput(0, 640, 340, 80, 30, $ES_READONLY) GUICtrlSetFont($cColCol, 18) GUICtrlCreateUpdown($cColCol, BitOr($UDS_WRAP, $UDS_ALIGNRIGHT)) GUICtrlSetLimit(-1, 9, 0) GUICtrlCreateLabel("Colour", 770, 320, 80, 20, $SS_CENTER) $cColVal = GUICtrlCreateInput("0x000000", 770, 340, 80, 30, $ES_READONLY) GUICtrlSetFont($cColVal, 11) $cColChoose = GUICtrlCreateButton("Select Colour", 770, 380, 80, 30) GUICtrlCreateLabel("Text/Field", 900, 320, 80, 20) GUIStartGroup() $cRad_Txt = GUICtrlCreateRadio(" Text", 900, 340, 80, 20) GUICtrlSetState($cRad_Txt, $GUI_CHECKED) $cRad_Fld = GUICtrlCreateRadio(" Field", 900, 380, 80, 20) GUIStartGroup() $cSetCol = GUICtrlCreateButton("Set Colour", 525, 380, 195, 30) $cNewSel = GUICtrlCreateButton("Selected Cell in Orange", 525, 420, 150, 30) $cDefSel = GUICtrlCreateButton("Selected Cell in Blue", 700, 420, 150, 30) ; Create additional buttons $cSave = GUICtrlCreateButton("Save LH ListView", 340, 470, 150, 30) $cLoad = GUICtrlCreateButton("Load RH ListView", 510, 470, 150, 30) GUICtrlSetState($cLoad, $GUI_DISABLE) $cExit = GUICtrlCreateButton("Exit", 880, 470, 110, 30) #ce ; If colours used then this function must be run BEFORE GUISetState _GUIListViewEx_MsgRegister() GUISetState() ;_GUIListViewEx_SetEditKey("^2D") ;MsgBox(0, "Dragging", "You can drag and reorder the headers on the left-hand ListView" & @CRLF & "<----------------------------") While 1 $iMsg = GUIGetMsg() #cs Switch $iMsg Case $GUI_EVENT_CLOSE, $cExit Exit Case $cSave _GUIListViewEx_SaveListView($iLVIndex_1, "Save.lvs") GUICtrlSetState($cLoad, $GUI_ENABLE) Case $cLoad _GUIListViewEx_LoadListView($iLVIndex_2, "Save.lvs") ; But return now forced to 2D Case $cUp _GUIListViewEx_SetActive($iLVIndex_1) _GUIListViewEx_Up() Case $cDown _GUIListViewEx_SetActive($iLVIndex_1) _GUIListViewEx_Down() Case $cIns ; Insert row/col _GUIListViewEx_SetActive($iLVIndex_1) If GUICtrlRead($cRad_Row) = $GUI_CHECKED Then _GUIListViewEx_Insert("New Row") Else _GUIListViewEx_InsertCol("New Col") EndIf Case $cDel ; Delete row/col _GUIListViewEx_SetActive($iLVIndex_1) If GUICtrlRead($cRad_Row) = $GUI_CHECKED Then _GUIListViewEx_Delete() Else _GUIListViewEx_DeleteCol() EndIf Case $cInsSpec ; Insert spec row/col $iValue = GUICtrlRead($cSpecChoose) If GUICtrlRead($cRad_Row) = $GUI_CHECKED Then _GUIListViewEx_InsertSpec($iLVIndex_1, $iValue, "") Else _GUIListViewEx_InsertColSpec($iLVIndex_1, $iValue, "New Col") EndIf Case $cDelSpec ; Delete spec row/col $iValue = GUICtrlRead($cSpecChoose) If GUICtrlRead($cRad_Row) = $GUI_CHECKED Then _GUIListViewEx_DeleteSpec($iLVIndex_1, $iValue) Else _GUIListViewEx_DeleteColSpec($iLVIndex_1, $iValue) EndIf Case $cContent $aRet = _GUIListViewEx_ReturnArray($iLVIndex_1) _ArrayDisplay($aRet, "", Default, 8) Case $cColour $aRet = _GUIListViewEx_ReturnArray($iLVIndex_1, 2) _ArrayDisplay($aRet, "", Default, 8) Case $cHeaders $aRet = _GUIListViewEx_ReturnArray($iLVIndex_1, 4) _ArrayDisplay($aRet, "", Default, 8) Case $cColChoose $sRet = _ChooseColor(2 , 0, 0, $hGUI) GUICtrlSetData($cColVal, $sRet) Case $cSetCol ; Read colour $sColSet = GUICtrlRead($cColVal) ; Set as text or field If GUICtrlRead($cRad_Txt) = $GUI_CHECKED Then $sColSet &= ";" Else $sColSet = ";" & $sColSet EndIf ; Read location $iRow = GUICtrlRead($cColRow) $iCol = GUICtrlRead($cColCol) ; Set colour _GUIListViewEx_SetColour($iLVIndex_2, $sColSet, $iRow, $iCol) Case $cNewSel ; Set orange field & black text for single cell selection = other colours unchanged Local $aSelCol[4] = ["", "", "0x000000", "0xFF8000"] _GUIListViewEx_SetDefColours($iLVIndex_2, $aSelCol) Case $cDefSel ; Reset default white on blue for single cell selection - other colours unchanged Local $aSelCol[4] = ["", "", Default, Default] _GUIListViewEx_SetDefColours($iLVIndex_2, $aSelCol) ; Case $mWhtTxt To $mDefBoth ; Check context menu items ; _SetColour($iMsg) EndSwitch #ce ;#cs $vRet = _GUIListViewEx_EventMonitor() If @error Then MsgBox($MB_SYSTEMMODAL, "Error", "Event error: " & @error) EndIf Switch @extended Case 0 ; No event detected Case 1 If $vRet = "" Then MsgBox($MB_SYSTEMMODAL, "Edit", "Edit aborted" & @CRLF) Else _ArrayDisplay($vRet, "ListView " & _GUIListViewEx_GetActive() & " content edited", Default, 8) EndIf Case 2 If $vRet = "" Then MsgBox($MB_SYSTEMMODAL, "Header edit", "Header edit aborted" & @CRLF) Else _ArrayDisplay($vRet, "ListView " & _GUIListViewEx_GetActive() & " header edited", Default, 8) EndIf Case 3 MsgBox($MB_SYSTEMMODAL, "Sorted", "ListView: " & $vRet & @CRLF) Case 4 Local $aRet = StringSplit($vRet, ":") MsgBox($MB_SYSTEMMODAL, "Dragged", "From ListView " & $aRet[1] & @CRLF & "To ListView " & $aRet[2]) EndSwitch ; #ce WEnd #cs Func _SetColour($iCID) ; Get information on where last right click occurred within ListView Local $aContext = _GUIListViewEx_ContextPos() ; Set new colour required Local $sColSet = "", $aColArray, $aSplit, $fDef = False #cs Switch $iCID Case $mWhtTxt $sColSet = $iWhite & ";" ; Text colour followed by ";" Case $mYelTxt $sColSet = $iYellow & ";" Case $mBluTxt $sColSet = $iLtBlue & ";" Case $mGrnTxt $sColSet = $iGreen & ";" Case $mBlkTxt $sColSet = $iBlack & ";" Case $mWhtFld $sColSet = ";" & $iWhite ; Field colour preceded by ";" Case $mRedFld $sColSet = ";" & $iRed Case $mBluFld $sColSet = ";" & $iBlue Case $mGrnFld $sColSet = ";" & $iGreen Case $mBlkFld $sColSet = ";" & $iBlack Case $mDefTxt ; Get current colours $aColArray = _GUIListViewEx_ReturnArray($aContext[0], 2) ; Extract current colours $aSplit = StringSplit($aColArray[$aContext[1]][$aContext[2]], ";") ; Create required setting $sColSet = ";" & $aSplit[2] ; Set default flag $fDef = True Case $mDefFld $aColArray = _GUIListViewEx_ReturnArray($aContext[0], 2) $aSplit = StringSplit($aColArray[$aContext[1]][$aContext[2]], ";") $sColSet = $aSplit[1] & ";" $fDef = True Case $mDefBoth $sColSet = ";" EndSwitch #ce If $sColSet Then ; Reset to default if needed If $fDef Then _GUIListViewEx_SetColour($aContext[0], ";", $aContext[1], $aContext[2]) EndIf ; Set required item colour _GUIListViewEx_SetColour($aContext[0], $sColSet, $aContext[1], $aContext[2]) EndIf EndFunc #ce
Moderators Melba23 Posted August 2, 2018 Author Moderators Posted August 2, 2018 faustf, If you require icons and photos in your ListView then this UDF is of no use to you as it does not work when they are enabled - sorry. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
faustf Posted August 2, 2018 Posted August 2, 2018 (edited) thankz , so i meet this problem with listviews in autoit , (correct me if i mistake), with GUICtrlCreateListViewItem you can colored but not can set bmp image , only icon with family of this functions _GUICtrlListView we can insert bmp image but can't insert a line colored or column or single cell, right? i understund ? Edited August 2, 2018 by faustf
Moderators Melba23 Posted August 2, 2018 Author Moderators Posted August 2, 2018 faustf, This thread is for questions related to the UDF - please ask general ListView question in the GH&S forum. And I do not know if your understanding is correct as I do not use ListViews with either icons or images. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
robertocm Posted August 25, 2018 Posted August 25, 2018 (edited) Dear Melba23, At the end of the post there is a new version of the example with an access database. I've been studying hard from your code, and managed to incorporate single cell selection, colours, checkboxes. All the editing of the access table is done directly from the listview. But first let me suggest another 'idea', I would like a more direct access to the edit mode: - any alphanumeric character would start editing + write the same character in the inputbox + don't select all (place the cursor at the end) From your documentation: this cannot be done in the user script because the UDF suspends the script when starting edit mode. I suppose that this feature could be included as a new parameter, perhaps in _GUIListViewEx_SetEditKey function I made some test only to see if this would be possible, and seems to be relatively simple EDITED: code removed (see next post) And finally the example of a listview connected with an access database (does not have any relation whit the previous 'idea') expandcollapse popup#include <GuiConstants.au3> ;GUIListViewEx from Melba23 https://www.autoitscript.com/forum/topic/182492-guilistviewex-new-version-27-may-16 #include "GUIListViewEx.au3" Opt("MustDeclareVars", 1) OnAutoItExitRegister("OnAutoItExit") ;Help: COM Error Handling Global $errADODB = ObjEvent("AutoIt.Error","_ErrADODB") ;https://www.autoitscript.com/forum/topic/182492-guilistviewex-bugfix-version-25-sep-17/?do=findComment&comment=1370017 ;Melba 23, Oct 2017 ;... and a right-click menu to select the colour of another column (1) of the selected row. Global $iYellow = "0xFFFF00", _ $iLtBlue = "0xCCCCFF", _ $iGreen = "0x00FF00", _ $iBlack = "0x000000", _ $iRed = "0xFF0000", _ $iBlue = "0x0000FF", _ $iWhite = "0xFFFFFF" ;_ErrADODB From spudw2k ;https://www.autoitscript.com/forum/topic/105875-adodb-example/ Global $errADODB = ObjEvent("AutoIt.Error","_ErrADODB") Local $sFilePath = @ScriptDir & "\db.mdb" Local $sFilePath2 = @ScriptDir & "\SomeFolder" Global $sSQL, $w, $Top='', $rstArray, $tblname = "Tel" ;For using fix positions in sql UPDATE Local $aPosField[9] = ["FieldName1", "FieldName2", "FieldName3", "FieldName4", "FieldName5", "FieldName6", "FieldName7", "FieldName8", "FieldName9"] Global Const $iCursorType = 0 ; adOpenForwardOnly, 3 adOpenStatic Global Const $iLockType = 3 ;1 adLockReadOnly, 3 adLockOptimistic Global Const $iOptions = 1 ; Options, 1 Evaluates as a textual definition of a command or stored procedure call ; 2 adCmdTable Global $cn = ObjCreate("ADODB.Connection") ; Create a connection object Global $rst = ObjCreate("ADODB.Recordset") ; Create a recordset object ;Global $sADOConnectionString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & $sFilePath ;Global $sADOConnectionString = 'DRIVER={Microsoft Access Driver (*.mdb)};Dbq=' & $sFilePath & ';uid=;pwd=MyPassword;' Global $sADOConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & $sFilePath & ";Jet OLEDB:Database Password=123" $cn.CursorLocation = 3 ; adUseClient $cn.Open($sADOConnectionString) ; Open the connection Global $GuiWidth = @DesktopWidth-2, $GuiHight = @DesktopHeight-77 ;Create GUI Global $hGui = GUICreate("Example with access database", $GuiWidth, $GuiHight) GUISetBkColor(0xA9A9A9) GUISetIcon("icons\local_gray.ico", 0) GUISetFont(11, Default, Default, "Segoe UI") GUICtrlCreateLabel("Activate Edition: [DOUBLE CLICK] or [SPACE BAR]. In Edit Mode: [ENTER] confirm, [ESCAPE] cancel. In Edit Mode, next cell: [TAB] or [CTRL + ARROWS]", 4, 790, $GuiWidth-10, 31, BitOR($SS_SIMPLE, $SS_SUNKEN)) ;GUICtrlSetFont(-1, 11), Default, Default, "Segoe UI") Global $KeyW = GUICtrlCreateInput("", 4, 1, 205, 33) GUICtrlSetBkColor(-1, 0xD3D3D3) GUICtrlSetFont(-1, 11) Local $cmdRefresh = GUICtrlCreateButton("", $GuiWidth - 315, 1, 60, 34, $BS_ICON) GUICtrlSetImage(-1, "shell32.dll", 290, 0) ;GUICtrlSetImage(-1, "icons\saved.ico") Local $Label1 = GUICtrlCreateLabel("Download data >", $GuiWidth - 440, 0, 120, 33) GUICtrlSetFont(-1, 10) Global $Label2 = GUICtrlCreateLabel("Next Update " & _HoraProxAct(), $GuiWidth - 230, 1, 245, 33) GUICtrlSetFont(-1, 10) ;Check if user is not active (for updating from database while user is not active) ;https://stackoverflow.com/questions/3867584/autoit-how-to-get-system-idle-time-or-if-screensaver-is-active ;AutoIt: How to get system idle time, or if screensaver is active? ;The _Timer_GetIdleTime() function uses GetLastInputInfo from user32.dll. #include <Timers.au3> Global $iLimit = 15 ; idle limit in seconds AdlibRegister("_CheckIdleTime", 600000) ;Actualizar datos cada 10 minutos (1000ms/s * 60s/m * 10m), si usuario estuvo inactivo nos últimos 15 segundos (cando se vai facer actualización) Global $idCheckbox = GUICtrlCreateCheckbox("Filter condition", 212, 1, 259, 33) GUICtrlSetFont(-1, 9) GUICtrlSetState(-1, 1) ; checked Local $cmdFolderTempl = GUICtrlCreateButton("OpenFold", 762, 1, 92, 33, 0) GUICtrlSetFont(-1, 9) ;This is from Melba23 GUIListViewEx Local $vRet, $aLV, $iRow, $iCheckState = True Global $cLV, $iLV, $iEditMode = 22 $cLV = GUICtrlCreateListView("F|Field2|Field3|Field4|Field5|Field6|Field7|Field8|Field9", 2, 35, $GuiWidth-4, 752) _GUICtrlListView_SetExtendedListViewStyle($cLV, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER)) ;Set font GUICtrlSetFont($cLV, 15, Default, Default, "Segoe UI") ; Note edit control will use same font _GUICtrlListView_SetColumnWidth($cLV, 0, 27) _GUICtrlListView_SetColumnWidth($cLV, 1, 300) _GUICtrlListView_SetColumnWidth($cLV, 2, 200) _GUICtrlListView_SetColumnWidth($cLV, 3, 120) _GUICtrlListView_SetColumnWidth($cLV, 4, 150) _GUICtrlListView_SetColumnWidth($cLV, 5, 80) _GUICtrlListView_SetColumnWidth($cLV, 6, 170) _GUICtrlListView_SetColumnWidth($cLV, 7, 180) _GUICtrlListView_SetColumnWidth($cLV, 8, 130) ;Create context menu for native ListView Local $mContextmenu = GUICtrlCreateContextMenu($cLV) Local $mWhtFld = GUICtrlCreateMenuItem("White field", $mContextmenu) Local $mRedFld = GUICtrlCreateMenuItem("Red field", $mContextmenu) Local $mBluFld = GUICtrlCreateMenuItem("Blue field", $mContextmenu) Local $mGrnFld = GUICtrlCreateMenuItem("Green field", $mContextmenu) Local $mBlkFld = GUICtrlCreateMenuItem("Black field", $mContextmenu) GUICtrlCreateMenuItem("", $mContextmenu) Local $mDefFld = GUICtrlCreateMenuItem("Default field", $mContextmenu) $sSQL = "SELECT FieldName1, FieldName2, FieldName3, FieldName4, FieldName5, FieldName6, FieldName7, FieldName8, FieldName9 FROM " & $tblname & " ORDER BY FieldName2" $rst.Open($sSQL, $cn, $iCursorType, $iLockType, $iOptions) ;Issue the SQL query If Not $rst.EOF = True Then $rstArray = $rst.GetRows() $rst.Close ;Load the ListView with data _GUICtrlListView_AddArray($cLV, $rstArray) ;Melba23 ;Set array to give alternate line colouring Global $rstCount_1 = Ubound($rstArray) Global $rstCount_2 = Ubound($rstArray, 2) Global $aColArBand[$rstCount_1][$rstCount_2] For $i = 0 To $rstCount_1 - 1 If Mod($i,2) = 0 Then For $j = 0 To $rstCount_2 - 1 $aColArBand[$i][$j] = ";0xFFFFFF" Next Else For $j = 0 To $rstCount_2 - 1 $aColArBand[$i][$j] = ";0xE6E6E6" Next EndIf ;Check all items, see examples: ;https://www.autoitscript.com/wiki/Snippets_(_Checkboxes_) _GUICtrlListView_SetItemChecked($cLV, $i, True) Next ;Initiate LVEx - using filling array - user colours ;Note that using the left/right keys only returns a "selection change" message if the ListView has been set up to allow single cell highlighting $iLV = _GUIListViewEx_Init($cLV, $rstArray, 0, 0, False, 1 + 4 + 32 + 1024) ;Prevents ListView redrawing during looped Insert/Delete/Change calls ;_GUIListViewEx_BlockReDraw($iLV, True) ;Load the required ListView colour array Local $aTempColBand = $aColArBand ReDim $aTempColBand[UBound($rstArray)][9] _GUIListViewEx_LoadColour($iLV, $aTempColBand) ;Read the current ListView content $aLV = _GUIListViewEx_ReturnArray($iLV, 3) ;_ArrayDisplay($aLV, "current content", Default, 8) $aLV = $rstArray ;Comprobando que coinciden ;_ArrayDisplay($rstArray, "recordset content", Default, 8) ;Set all columns editable _GUIListViewEx_SetEditStatus($iLV, "3-7") ;If @error Then Exit MsgBox(0, "", @error) ;Initialise tooltip to display 0 column item content for 2 secs when clicked _GUIListViewEx_ToolTipInit($iLV, "1", 2000) Else $rst.Close ;MsgBox(262144, "", "Non encontrados datos" , 5) EndIf ;SPACEBAR (but then we have to prevent to change the checbox state) _GUIListViewEx_SetEditKey("20") ;If @error Then Exit MsgBox(0, "", @error) ;Register required message BEFORE any colour actions (register for sorting, dragging and editing) ;If colours used then this function must be run BEFORE GUISetState _GUIListViewEx_MsgRegister() ;Set deafult colours to use Global $aDefCols[4] = ["0x000000", "0xFEFEFE", "0xFFFFFF", "0x778899"] ;Sets default colours for user colour/single cell select enabled ListViews _GUIListViewEx_SetDefColours($iLV, $aDefCols) ;_GUIListViewEx_BlockReDraw($iLV, False) GUISetState(@SW_SHOW) ;GUICtrlSetState($cLV, $GUI_FOCUS) ControlFocus($hGui, "", $cLV) ;ConsoleWrite(ControlGetFocus($hGui)) Local $iMsg ;Help: a bit mask to strip the high word bits from the return of the _WinAPI_GetAsyncKeyState function. Local Const $iBitMask = 0x8000 While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $GUI_EVENT_CLOSE $rst = 0 ; Release the recordset object $cn.Close ; Close the connection $cn = 0 ; Release the connection object Exit Case $KeyW, $cmdRefresh OnFilt() Case $cmdFolderTempl ShellExecute($sPathPlantillas) Case $mWhtFld To $mDefFld ;Check context menu items _SetColour($iMsg) EndSwitch $vRet = _GUIListViewEx_EventMonitor($iEditMode) ;If @error Then ;MsgBox($MB_SYSTEMMODAL, "Error", "Event error: " & @error) ;EndIf Switch @extended Case 1 ; This is returned after an edit attempt ;Restore checked state (because using spacebar for starting the edit mode has the 'disadvantage' of also changing the checked state) _GUICtrlListView_SetItemChecked($cLV, $iRow, $iCheckState) ;GUICtrlSetState($cLV, $GUI_FOCUS) ControlFocus($hGui, "", $cLV) If $vRet = "" Then ;MsgBox($MB_SYSTEMMODAL, "Edit", "Edit aborted" & @CRLF) Else ;_ArrayDisplay($vRet, "ListView " & _GUIListViewEx_GetActive() & " content edited", Default, 8) ;MsgBox($MB_SYSTEMMODAL, "", $vRet[1][3]) ;MsgBox($MB_SYSTEMMODAL, "", _GUIListViewEx_GetLastSelItem()) ;ListViewIndex|Row|Col ;updating the access table from the listview $sSQL = '' For $i = 1 To $vRet[0][0] If $sSQL <> '' Then $sSQL = $sSQL & ", " ;Treat different text fields and number fields (only for editable columns: 3 to 7) Switch $vRet[$i][1] Case 3, 4, 6 To 8 If $vRet[$i][3] <> '' Then $sSQL = $sSQL & $aPosField[$vRet[$i][1]] & " = '" & $vRet[$i][3] & "'" Else $sSQL = $sSQL & $aPosField[$vRet[$i][1]] & " = ''" EndIF Case 5 If $vRet[$i][3] <> '' Then $sSQL = $sSQL & $aPosField[$vRet[$i][1]] & " = " & $vRet[$i][3] Else $sSQL = $sSQL & $aPosField[$vRet[$i][1]] & " = 0" EndIf EndSwitch Next ;deduct 1 in the row of $aLV because of the different design of both arrays: ;_GUIListViewEx_EventMonitor: Total number of edits in [0][0] element --> primeiro valor en F1C0 ;_GUIListViewEx_ReturnArray ...For mode 2/3: Always 0-based 2D array --> primeiro valor en F0C0 $sSQL = "UPDATE " & $tblname & " SET " & $sSQL & " WHERE FieldName1 = " & $aLV[$i-1][0] $cn.Execute($sSQL, Default, 1 + 0x80) ;adCmdText = 1 , adExecuteNoRecords = 0x80 ;ConsoleWrite($sSQL) EndIf Case 9 ; This is returned after a selection change ;MsgBox($MB_SYSTEMMODAL, "Selection changed", "New selection:" & @CRLF & "Row: " & $vRet[1] & @CRLF & "Col: " & $vRet[2]) $iCheckState = _GUICtrlListView_GetItemChecked($cLV, $vRet[1]) $iRow = $vRet[1] If $vRet[2] = 0 Then If $iCheckState = True Then ToolTip("To Do") Sleep(1000) ToolTip("") $sSQL = "UPDATE " & $tblname & " SET ToDoField = True WHERE FieldName1 = " & $aLV[$iRow][0] $cn.Execute($sSQL, Default, 1 + 0x80) ;adCmdText = 1 , adExecuteNoRecords = 0x80 EndIf ;this is also possible: ;$aLV_Check = _GUIListViewEx_ReturnArray($iLV, 1) ;If Not @error Then ;_ArrayDisplay($aLV_Check, "ListView " & _GUIListViewEx_GetActive() & " State of the checkboxes", Default, 8) ;For $i = 0 To Ubound($aLV_Check) - 1 ;If $aLV_Check[$i]= True Then Msgbox(0, "Checked", $i) ;Next ;If $aLV_Check[$vRet[1]] = True Then ;Msgbox(0, "", $vRet[1]) ;EndIf ;Else ;MsgBox(0, "Left", "Empty Check Array") ;EndIf EndIf EndSwitch WEnd Func OnFilt() Local $ToDo ;(checked value is 1 and unchecked value is 4) ;If GUICtrlRead($idCheckbox) = 1 If GUICtrlRead($idCheckbox) = $GUI_CHECKED Then $w = " WHERE ToDoField = False" $Top = " TOP 100" Else $w = " WHERE ToDoField = True" $Top = "" $ToDo = True EndIf $w = $w & " AND Field2 LIKE '%" & GUICtrlRead($KeyW) & "%' OR Field3 LIKE '%" & GUICtrlRead($KeyW) & "%'" $sSQL = "SELECT" & $Top & " FieldName1, FieldName2, FieldName3, FieldName4, FieldName5, FieldName6, FieldName7, FieldName8, FieldName9 FROM " & $tblname & $w & " ORDER BY FieldName2" $rst.Open($sSQL, $cn, $iCursorType, $iLockType, $iOptions) ;Issue the SQL query If Not @error Then If Not $rst.EOF Then $rstArray = $rst.GetRows() $rst.Close ;This seems to cause more flicker ;GUISetState(@SW_LOCK) ;_GUIListViewEx_BlockReDraw($iLV, True) ;reload the ListView with new data, first clear the current content _GUICtrlListView_DeleteAllItems($cLV) ;close it within the UDF _GUIListViewEx_Close(0) ;reload the ListView with the new data _GUICtrlListView_AddArray($cLV, $rstArray) ;Initiate LVEx - using filling array - user colours $iLV = _GUIListViewEx_Init($cLV, $rstArray, 0, 0, False, 1 + 4 + 32 + 1024) ;Load the required ListView colour array Local $rst2Count_1 = UBound($rstArray) If $rst2Count_1 <= $rstCount_1 Then Local $aTempColBand = $aColArBand If $rst2Count_1 < $rstCount_1 Then ReDim $aTempColBand[$rst2Count_1][$rstCount_2] For $i = 0 To $rst2Count_1 - 1 If $ToDo = True Then _GUICtrlListView_SetItemChecked($cLV, $i, True) EndIf Next Else Local $aTempColBand[$rst2Count_1][$rstCount_2] For $i = 0 To $rst2Count_1 - 1 If Mod($i,2) = 0 Then For $j = 0 To $rstCount_2 - 1 $aTempColBand[$i][$j] = ";0xFFFFFF" Next Else For $j = 0 To $rstCount_2 - 1 $aTempColBand[$i][$j] = ";0xE6E6E6" Next EndIf If $ToDo = True Then _GUICtrlListView_SetItemChecked($cLV, $i, True) EndIf Next EndIf _GUIListViewEx_LoadColour($iLV, $aTempColBand) _GUIListViewEx_SetDefColours($iLV, $aDefCols) ;Read the current ListView content ;$aLV = _GUIListViewEx_ReturnArray($iLV, 3) $aLV = $rstArray ;_ArrayDisplay($aLV, "current content", Default, 8) ;Set all columns editable _GUIListViewEx_SetEditStatus($iLV, "3-7") ;Initialise tooltip to display 0 column item content for 2 secs when clicked _GUIListViewEx_ToolTipInit($iLV, "1", 2000) ;_GUIListViewEx_BlockReDraw($iLV, False) ;GUISetState(@SW_UNLOCK) Else $rst.Close SplashTextOn("", "Empty Recordset", 900, -1, -1, -1, 1, "", 24) Sleep(4000) SplashOff() EndIf EndIf GUICtrlSetData($KeyW, "") ;GUICtrlSetState($idCheckbox, $GUI_UNCHECKED) EndFunc Func _CheckIdleTime() If _Timer_GetIdleTime() > $iLimit * 1000 Then ;AdLib functions don't run while a blocking function is shown e.g. MsgBox, InputBox, WinWait, WinWaitClose etc. ;MsgBox(16, "Timeout", "You haven't done anything in " & $iLimit & " seconds... Get busy!") OnFilt() GUICtrlSetData($Label2, "Next Update: " & _HoraProxAct()) EndIf EndFunc ;Author: SmOke_N, _Time() ;https://www.autoitscript.com/wiki/Snippets_(_Time_%26_Date_) Func _HoraProxAct() Local $AMPM, $hour = @HOUR, $min = @MIN + 10 If $min > 60 Then $hour = $hour + 1 $min = $min - 60 EndIf If $hour > 12 Then $hour = $hour - 12 $AMPM = "PM" Else $AMPM = "AM" EndIf Return StringFormat("%02i", $hour) & ":" & StringFormat("%02i", $min) & " " & $AMPM EndFunc Func OnAutoItExit() ;think this would not be neccesary on exit the script ;Unregister the function _CheckIdleTime() from being called every 10 min. ;AdlibUnRegister("_CheckIdleTime") EndFunc #cs ---------------------------------------------------------------------------- https://www.autoitscript.com/forum/topic/182492-guilistviewex-bugfix-version-25-sep-17/?do=findComment&comment=1370017 Melba 23, Oct 2017 But here is how you can use the UDF to have a column (2) which uses a combo to limit user edit options and a right-click menu to select the colour of another column (1) of the selected row. #ce ---------------------------------------------------------------------------- Func _SetColour($iCID) ; Get information on where last right click occurred within ListView Local $aContext = _GUIListViewEx_ContextPos() ; Set new colour required Local $sColSet = "", $aColArray, $aSplit, $fDef = False Switch $iCID Case $mWhtFld $sColSet = $iYellow & ";" & $iWhite ; Text colour followed by ";" Field colour preceded by ";" Case $mRedFld $sColSet = ";" & $iRed Case $mBluFld $sColSet = ";" & $iBlue Case $mGrnFld $sColSet = ";" & $iGreen Case $mBlkFld ;$sColSet = $iWhite & ";" ; Text colour followed by ";" $sColSet = $iWhite & ";" & $iBlack Case $mDefFld ;Get current colours $aColArray = _GUIListViewEx_ReturnArray($aContext[0], 2) $aSplit = StringSplit($aColArray[$aContext[1]][$aContext[2]], ";") ;Create required setting ;Text $sColSet = ";" & $aSplit[2] ; Set default flag $fDef = True ;Field $sColSet = $aSplit[1] & ";" $fDef = True EndSwitch If $sColSet Then ; Reset to default if needed If $fDef Then _GUIListViewEx_SetColour($aContext[0], ";", $aContext[1], 1) EndIf ; Set required item colour _GUIListViewEx_SetColour($aContext[0], $sColSet, $aContext[1], 1) EndIf EndFunc Func _ErrADODB() Msgbox(0,"ADODB COM Error","We intercepted a COM Error !" & @CRLF & @CRLF & _ "err.description is: " & @TAB & $errADODB.description & @CRLF & _ "err.windescription:" & @TAB & $errADODB.windescription & @CRLF & _ "err.number is: " & @TAB & hex($errADODB.number,8) & @CRLF & _ "err.lastdllerror is: " & @TAB & $errADODB.lastdllerror & @CRLF & _ "err.scriptline is: " & @TAB & $errADODB.scriptline & @CRLF & _ "err.source is: " & @TAB & $errADODB.source & @CRLF & _ "err.helpfile is: " & @TAB & $errADODB.helpfile & @CRLF & _ "err.helpcontext is: " & @TAB & $errADODB.helpcontext _ , 2) Local $err = $errADODB.number If $err = 0 Then $err = -1 ;$rst = 0 ;$cn.Close ;$cn = 0 ;Exit EndFunc A final note: i think there's a little mistake in this sentence of the header _GUIListViewEx_EditItem Remarks: Once edit started, all other script activity is suspended as explained for _GUIListViewEx_EditOnClick This function is not in the new version of the UDF, as explained in your guide Many Thanks! Edited August 26, 2018 by robertocm
Moderators Melba23 Posted August 26, 2018 Author Moderators Posted August 26, 2018 robertocm, Quote any alphanumeric character would start editing Please read this announcement to see why your idea is a complete non-starter as it would mean checking for the entire keyboard. You can add such a functionality to your own version if you so wish, but I will not be adding anything like this to the main release. And do you realise that you can set a HotKey to start editing the selected cell via the _GUIListViewEx_SetEditKey function? Is that not sufficient for your purposes? Quote don't select all (place the cursor at the end) Thisi functionality is already incorporated: ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIListViewEx_Init ;[...] ; $iAdded ;[...] ; + 2 - Do not "select all" when editing item text Quote there's a little mistake in this sentence of the header _GUIListViewEx_EditItem Fixed to read _GUIListViewEx_EventMonitor - thanks. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
robertocm Posted August 26, 2018 Posted August 26, 2018 Dear Melba23, Many Thanks for your comments, Understood, and deleted the code in previous post 1 hour ago, Melba23 said: do you realise that you can set a HotKey to start editing the selected cell via the _GUIListViewEx_SetEditKey function? Yes, in fact i'm using this funcion and changed the key to SPACEBAR (reseting the checkbox state after editing) For me is perfect, but my tool is for users very reluctant to computers (for several reasons you can imagine). They are great proffesionals but avoid computers. In this context, is easy for them: 'start editing writting any key or number' like in excel sheets. One sentence, all explained. The 'cursor at the end' was only in this situation (start editing writting the first character) Many Thanks
Tersion Posted August 26, 2018 Posted August 26, 2018 Melba23, Hello. I want to ask, how can I change background color of full row using your GUIListViewEx UDF? I know that change background color for items added to native ListView control using _GUICtrlListView_AddItem() method is requires some manipulations using WM_NOTIFY or something like that. It's a bit complicated for me right now, so I found that if you using GUICtrlCreateListViewItem() than you can change background color by GUICtrlSetBkColor(). But it's silly in my opinion if i have dynamic flow of row items and if I use some standard UDF functions for manipulating them. So I checked some examples of your GUIListViewEx and came up with simple script (see below in spoiler), where I have only one ListView control with some data, which I initialized with ability to edit and change colors. But in my case I need change color for full row (not for specific item). Can I did it with GUIListViewEx? Spoiler #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include "GUIListViewEx.au3" $hMainWindow = GUICreate("Main Form", 500, 400, 242, 137) $cIDEditableListView = GUICtrlCreateListView("", 5, 5, 490, 390, $LVS_REPORT) _GUIListViewEx_MsgRegister() GUISetState(@SW_SHOW) _GUICtrlListView_AddColumn($cIDEditableListView, "#", 30) _GUICtrlListView_AddColumn($cIDEditableListView, "Name", 150) _GUICtrlListView_AddColumn($cIDEditableListView, "Version", 100) _GUICtrlListView_AddItem($cIDEditableListView, "1") _GUICtrlListView_AddSubItem($cIDEditableListView, 0, "Campaign 1", 1) _GUICtrlListView_AddSubItem($cIDEditableListView, 0, "1.0", 2) _GUICtrlListView_AddItem($cIDEditableListView, "2") _GUICtrlListView_AddSubItem($cIDEditableListView, 1, "Campaign 2", 1) _GUICtrlListView_AddSubItem($cIDEditableListView, 1, "2.0", 2) $aLV_Array = _GUIListViewEx_ReadToArray($cIDEditableListView) $iLV_Index = _GUIListViewEx_Init($cIDEditableListView, $aLV_Array, 0, 0, False, 1 + 32) _GUIListViewEx_SetEditStatus($iLV_Index, "1-2") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch _GUIListViewEx_EventMonitor() WEnd
robertocm Posted August 26, 2018 Posted August 26, 2018 (edited) Dear Melba23, Let me suggest a different approach to the 'idea', using only UDF functions and HotKeySet standard function This would be the scheme: Global $cLV, $iLV, $iRow, $iCol, $iEditMode = 22 ... $vRet = _GUIListViewEx_EventMonitor($iEditMode) ... Case 9 ; This is returned after a selection change by the user, then listview is active HotKeySet("a", "HotKeyPressed") HotKeySet("b", "HotKeyPressed") HotKeySet("c", "HotKeyPressed") $iRow = $vRet[1] $iCol = $vRet[2] ... Func HotKeyPressed() ;unregister all (will be registered again in selection change) HotKeySet("a") HotKeySet("b") HotKeySet("c") Local $Chr = @HotKeyPressed _GUIListViewEx_ChangeItem($iLV, $iRow, $iCol, $Chr) _GUIListViewEx_EditItem($iLV, $iRow, $iCol, $iEditMode) EndFunc I made some tests and the only issue i'm finding is losing the focus of listview after editing Many Thanks, @Tersion: see in my example in the previous post, lines from these: ;Melba23 ;Set array to give alternate line colouring Global $rstCount_1 = Ubound($rstArray) Global $rstCount_2 = Ubound($rstArray, 2) Global $aColArBand[$rstCount_1][$rstCount_2] For $i = 0 To $rstCount_1 - 1 If Mod($i,2) = 0 Then For $j = 0 To $rstCount_2 - 1 $aColArBand[$i][$j] = ";0xFFFFFF" Next Else For $j = 0 To $rstCount_2 - 1 $aColArBand[$i][$j] = ";0xE6E6E6" Next EndIf Edited August 26, 2018 by robertocm
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now