DavProg Posted July 6, 2022 Share Posted July 6, 2022 Hi everyone, I'm a newbie on this forum, so please be considerate. Thank you. I've been reading a lot on it, though, and am very grateful for the many useful tips/snippets found. I've been developing an AutoIT script that handles Excel data to be inserted in SAP. In between, there is a GUI that, among others, uses a ListView. In the ListView the data is colored green if the value in BCE/RRN is identical to UpValue, but red if it is not. Upon double-clicking in BCE/RRN certain values get copied into UpValue. This means the value in BCE/RRN and UpValue becomes identical, so the color of the row should turn green... it does not however, and I know it will not by itself, and I have been experimenting with _GUICtrlListView_RedrawItems as well as with $CDDS_POSTPAINT and co, but to no avail. I prefer not the use a virtual listview or overly stuffed UDF's as that is beyond the scope of what I want to reach. I have also noticed the coloring flickers and the colors disappear (turn white) when clicking on a button (functionality removed), so I guess I may have an ordering problem in my code. I would be very happy if someone could have a look at my code and maybe point out where the error/solution could be. Most likely in the "Region ### _COLOR_ARRAY() function" and/or the "Region ### WM_NOTIFY function" Thanks in advance. Davy Partial script, stripped of all unnecessary parts : expandcollapse popup; Standard includes #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <StaticConstants.au3> #include <Constants.au3> #include <ColorConstants.au3> #include <GuiListView.au3> #include <GuiRichEdit.au3> #Region ### FED categories ### Const $sFED1 = "FED1" Const $sFED2 = "FED2" Const $sFED3 = "FED3" Const $sFED4 = "FED4" Const $sFED5 = "FED5" Const $sFED6 = "FED6" Const $sFED7 = "FED7" #EndRegion ### FED categories ### Global $g_hListView ; Global handler for ListView for the comparison pane ; Create the GUI Global $hPaneGUI ; GUI handler for the pane window Local $hWidth = 1340, $hHeight = 600 ; Initial window size $hPaneGUI = GUICreate("Client Validation", $hWidth, $hHeight, -1, -1, -1) ; 1. BCE/RRN INFO WINDOW ; Determine positions, width and height of Info window Local $iX_Info = 2 Local $iY_Info = 2 Local $iInfo_Wd = Int(($hWidth / 2) - 4) Local $iInfo_Ht = $hHeight - 4 ; Create BCE/RRN Info window Global $hInfo = _GUICtrlRichEdit_Create($hPaneGUI, "", $iX_Info, $iY_Info, $iInfo_Wd, $iInfo_Ht, BitOR($ES_MULTILINE, $ES_READONLY, $WS_VSCROLL)) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ; Register WM_NOTIFY function for Windows Message ID $WM_NOTIFY to open URLS _GUICtrlRichEdit_SetEventMask($hInfo, $ENM_LINK) ; Look for notification of link clicks _GUICtrlRichEdit_AutoDetectURL($hInfo, True) ; Enable automatic detection of URLS ; 2. LISTVIEW WINDOW ; Determine positions, width and height of ListView window Local $iX_LV = Int(($hWidth / 2) + 2) Local $iY_LV = 2 Local $iLV_Wd = Int(($hWidth / 2) - 4) Local $iLV_Ht = Int((($hHeight / 3) * 2) - 22) ; Create the ListView window Global $g_hListView = _GUICtrlListView_Create($hPaneGUI, "", $iX_LV, $iY_LV, $iLV_Wd, $iLV_Ht) _GUICtrlListView_SetExtendedListViewStyle($g_hListView, BitOR($LVS_EX_BORDERSELECT, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_ONECLICKACTIVATE, $LVS_EX_TWOCLICKACTIVATE)) _GUICtrlListView_SetItemPosition($g_hListView, 0, $iX_LV, $iY_LV) ; Determine width and positions of the array columns Local $iColumn_Wd = Int($iLV_Wd / 4) $iX_Column_1 = $iX_LV $iX_Column_2 = $iX_LV + $iColumn_Wd $iX_Column_3 = $iX_LV + ($iColumn_Wd * 2) $iX_Column_4 = $iX_LV + ($iColumn_Wd * 3) ; Add columns Global $hColumn_1 = _GUICtrlListView_InsertColumn($g_hListView, 0, "Label", $iColumn_Wd) Global $hColumn_2 = _GUICtrlListView_InsertColumn($g_hListView, 1, "UpValue", $iColumn_Wd) Global $hColumn_3 = _GUICtrlListView_InsertColumn($g_hListView, 2, "BCE/RRB", $iColumn_Wd) Global $hColumn_4 = _GUICtrlListView_InsertColumn($g_hListView, 3, "Excel", $iColumn_Wd) ; Set array limit _GUICtrlListView_SetItemCount($g_hListView, 16) ; 3. BUTTONS ; Determine positions, width and height of 3 buttons Local $Xi_Button_1 = Int(($hWidth / 2) + 7) Local $iX_Button_2 = Int(($hWidth / 2) + 92) Local $iX_Button_3 = Int(($hWidth / 2) + 177) Local $iY_Button = Int((($hHeight / 3) * 2) - 15) Local $iButton_Ht = 30 Local $iButton_Wd = 80 ; Create 3 buttons Global $hButton_1_Validate = GUICtrlCreateButton("Validate", $Xi_Button_1, $iY_Button, $iButton_Wd, $iButton_Ht) ; Validate the data in the UpValue part of the comparison pane GUICtrlSetResizing($hButton_1_Validate, $GUI_DOCKAUTO) Global $hButton_2_Reset = GUICtrlCreateButton("Reset", $iX_Button_2, $iY_Button, $iButton_Wd, $iButton_Ht) ; Reset the data in the UpValue part of the comparison pane GUICtrlSetResizing($hButton_2_Reset, $GUI_DOCKAUTO) Global $hButton_3_Refresh = GUICtrlCreateButton("Refresh", $iX_Button_3, $iY_Button, $iButton_Wd, $iButton_Ht) ; Reset the data in the UpValue part of the comparison pane GUICtrlSetResizing($hButton_3_Refresh, $GUI_DOCKAUTO) ; 4. EDIT SECTION ; Determine positions, width and height of the Edit section Local $iX_Edit = Int(($hWidth / 2) + 2) Local $iY_Edit = Int((($hHeight / 3) * 2) + 20) Local $iEdit_Wd = Int(($hWidth / 2) - 6) Local $iEdit_Ht = Int((($hHeight / 3) * 1) - 24) ; Create the Edit section Local $hEdit = GUICtrlCreateEdit("", $iX_Edit, $iY_Edit, $iEdit_Wd, $iEdit_Ht) GUICtrlSetResizing($hEdit, $GUI_DOCKAUTO) ; Fill the array for the ListView with data based on the IDType ; TEST DATA******************************************************* Global $sIDTypeFromExcel = "Person" ; Global $sIDTypeFromExcel = "Company_BCE" ; Global $sIDTypeFromExcel = "Company_ESTA" Global $userLanguage = "NL" ; Global $userLanguage = "FR" Global $sFed Global $sFirstName Global $sLastName Global $sCompanyName Global $sBCEFromExcel Global $sEstaFromExcel Global $sRRNFromExcel Global $sLangFromExcel Global $sNameFromExcel Global $sLegalFormFromExcel Global $sVATFromExcel Global $sStreetFromExcel Global $sHouseFromExcel Global $sAptFromExcel Global $sPostcodeFromExcel Global $sCityFromExcel Global $sCountryFromExcel Global $sSearchFromExcel Global $sIBANFromExcel Global $sBICFromExcel Global $sBankKeyFromExcel Global $sBankCountryFromExcel Global $sContactFirstNameFromExcel Global $sContactLastNameFromExcel Global $sContactEmailFromExcel Global $sStatusFromJson = "" Global $sFedFromJson = "" Global $sRRNFromJson = "" Global $sFirstNameFromJson = "" Global $sLastNameFromJson = "" Global $sStreetFromJson = "" Global $sHouseFromJson = "" Global $sAptFromJson = "" Global $sPostcodeFromJson = "" Global $sCityFromJson = "" Global $sBCEFromJson = "" Global $sCompanyNameFromJson = "" Global $sLegalFormFromJson = "" Global $sVATFromJson = "" Global $sEstaFromJson = "" If $sIDTypeFromExcel = "Person" Then $sFed = "Fed3" $sLangFromExcel = "FR" $sRRNFromExcel = "88081100000" $sFirstName = "Christel" $sLastName = "Test" $sStreetFromExcel = "Rue du Loin" $sHouseFromExcel = "10" $sAptFromExcel = "1" $sPostcodeFromExcel = "4200" $sCityFromExcel = "Seraing" $sCountryFromExcel = "BE" $sIBANFromExcel = "" $sBICFromExcel = "" $sStatusFromJson = "Levend" $sFedFromJson = "" $sRRNFromJson = "88081100000" $sFirstNameFromJson = "Christel Alison Hubert" $sLastNameFromJson = "Test" $sStreetFromJson = "Rue des Prez" $sHouseFromJson = "22" $sAptFromJson = "" $sPostcodeFromJson = "4500" $sCityFromJson = "Huy" ElseIf $sIDTypeFromExcel = "Company_BCE" Or $sIDTypeFromExcel = "Company_ESTA" Then $sFed = "Fed1" $sLangFromExcel = "NL" $sBCEFromExcel = "0000033333" $sCompanyName = "OFFICE VAN ADVOCATEN" $sLegalFormFromExcel = "Commanditaire vennootschap" $sVATFromExcel = "BE0000033333" $sEstaFromExcel = "2222002222" $sStreetFromExcel = "Dorpstraat" $sHouseFromExcel = "10" $sAptFromExcel = "" $sPostcodeFromExcel = "2800" $sCityFromExcel = "Mechelen" $sCountryFromExcel = "BE" $sIBANFromExcel = "BE11166622233344" $sBICFromExcel = "BBRUBEBB" $sStatusFromJson = "Actief" $sFedFromJson = "Rechtspersoon" $sBCEFromJson = "0000033333" $sCompanyNameFromJson = "ADJUDENTEA" $sLegalFormFromJson = "CommV" $sVATFromJson = "Sinds 1 januari 2019" $sEstaFromJson = "22220022221" $sStreetFromJson = "Dorpstraat" $sHouseFromJson = "15" $sAptFromJson = "" $sPostcodeFromJson = "2800" $sCityFromJson = "Mechelen" EndIf ; END TEST DATA***************************************************** Select Case $sIDTypeFromExcel = "Person" ; Items to be added as an array to the ListView in case of a physical person Local $aItems[14][4] ; Create an array with 14 rows and 4 columns ; First column of array: labels $aItems[0][0] = "Status" $aItems[1][0] = "fedGroup" $aItems[2][0] = "supplierLang" $aItems[3][0] = "rnNumber" $aItems[4][0] = "firstName" $aItems[5][0] = "name" $aItems[6][0] = "streetName" $aItems[7][0] = "houseNumber" $aItems[8][0] = "boxNumber" $aItems[9][0] = "postalCode" $aItems[10][0] = "city" $aItems[11][0] = "country" $aItems[12][0] = "bankAccount" $aItems[13][0] = "bic" ; Second column of array: UpValue ; Data chosen from RRN/BCE data and Excel file to be copied back to Excel and to SAP $aItems[0][1] = "Data received" $aItems[1][1] = $sFed $aItems[2][1] = $sLangFromExcel $aItems[3][1] = $sRRNFromExcel $aItems[4][1] = $sFirstName $aItems[5][1] = $sLastName $aItems[6][1] = $sStreetFromExcel $aItems[7][1] = $sHouseFromExcel $aItems[8][1] = $sAptFromExcel $aItems[9][1] = $sPostcodeFromExcel $aItems[10][1] = $sCityFromExcel $aItems[11][1] = $sCountryFromExcel $aItems[12][1] = $sIBANFromExcel $aItems[13][1] = $sBICFromExcel ; Third column of array: RRN data $aItems[0][2] = $sStatusFromJson $aItems[1][2] = "" $aItems[2][2] = "" $aItems[3][2] = $sRRNFromJson $aItems[4][2] = $sFirstNameFromJson $aItems[5][2] = $sLastNameFromJson $aItems[6][2] = $sStreetFromJson $aItems[7][2] = $sHouseFromJson $aItems[8][2] = "" $aItems[9][2] = $sPostcodeFromJson $aItems[10][2] = $sCityFromJson $aItems[11][2] = "" $aItems[12][2] = "" $aItems[13][2] = "" ; Fourth column of array: Excel data $aItems[0][3] = "Data received" $aItems[1][3] = $sFed $aItems[2][3] = $sLangFromExcel $aItems[3][3] = $sRRNFromExcel $aItems[4][3] = $sFirstName $aItems[5][3] = $sLastName $aItems[6][3] = $sStreetFromExcel $aItems[7][3] = $sHouseFromExcel $aItems[8][3] = $sAptFromExcel $aItems[9][3] = $sPostcodeFromExcel $aItems[10][3] = $sCityFromExcel $aItems[11][3] = $sCountryFromExcel $aItems[12][3] = $sIBANFromExcel $aItems[13][3] = $sBICFromExcel Case $sIDTypeFromExcel = "Company_BCE" Or $sIDTypeFromExcel = "Company_ESTA" ; Items to be added as an array to the ListView in case of a legal person Local $aItems[16][4] ; Create an array with 16 rows and 4 columns ; First column of array: labels $aItems[0][0] = "Status" $aItems[1][0] = "fedGroup" $aItems[2][0] = "supplierLang" $aItems[3][0] = "bceNumber" $aItems[4][0] = "companyName" $aItems[5][0] = "legalForm" $aItems[6][0] = "vatNumber" $aItems[7][0] = "estaNumber" $aItems[8][0] = "streetName" $aItems[9][0] = "houseNumber" $aItems[10][0] = "boxNumber" $aItems[11][0] = "postalCode" $aItems[12][0] = "city" $aItems[13][0] = "country" $aItems[14][0] = "bankAccount" $aItems[15][0] = "bic" ; Second column of array: UpValue ; Data chosen from RRN/BCE data and Excel file to be copied back to Excel and to SAP $aItems[0][1] = "Data received" $aItems[1][1] = $sFed $aItems[2][1] = $sLangFromExcel $aItems[3][1] = $sBCEFromExcel $aItems[4][1] = $sCompanyName $aItems[5][1] = $sLegalFormFromExcel $aItems[6][1] = $sVATFromExcel $aItems[7][1] = $sEstaFromExcel $aItems[8][1] = $sStreetFromExcel $aItems[9][1] = $sHouseFromExcel $aItems[10][1] = $sAptFromExcel $aItems[11][1] = $sPostcodeFromExcel $aItems[12][1] = $sCityFromExcel $aItems[13][1] = $sCountryFromExcel $aItems[14][1] = $sIBANFromExcel $aItems[15][1] = $sBICFromExcel ; Third column of array: BCE data $aItems[0][2] = $sStatusFromJson $aItems[1][2] = $sFedFromJson $aItems[2][2] = "" $aItems[3][2] = $sBCEFromJson $aItems[4][2] = $sCompanyNameFromJson $aItems[5][2] = $sLegalFormFromJson $aItems[6][2] = $sVATFromJson $aItems[7][2] = $sEstaFromJson $aItems[8][2] = $sStreetFromJson $aItems[9][2] = $sHouseFromJson $aItems[10][2] = $sAptFromJson $aItems[11][2] = $sPostcodeFromJson $aItems[12][2] = $sCityFromJson $aItems[13][2] = "" $aItems[14][2] = "" $aItems[15][2] = "" ; Fourth column of array: Excel data $aItems[0][3] = "Data received" $aItems[1][3] = $sFed $aItems[2][3] = $sLangFromExcel $aItems[3][3] = $sBCEFromExcel $aItems[4][3] = $sCompanyName $aItems[5][3] = $sLegalFormFromExcel $aItems[6][3] = $sVATFromExcel $aItems[7][3] = $sEstaFromExcel $aItems[8][3] = $sStreetFromExcel $aItems[9][3] = $sHouseFromExcel $aItems[10][3] = $sAptFromExcel $aItems[11][3] = $sPostcodeFromExcel $aItems[12][3] = $sCityFromExcel $aItems[13][3] = $sCountryFromExcel $aItems[14][3] = $sIBANFromExcel $aItems[15][3] = $sBICFromExcel EndSelect ; Show the GUI GUISetState() #Region ### _COLOR_ARRAY() Function for coloring subitems ### Func _COLOR_ARRAY() ; All colors in BGR Global $iWhite = 0xFFFFFF, $iRed = 0x674EFF, $iGreen = 0x32CD32, $iGray = 0xC0C0C0 ; Color array $iRows = UBound($aItems) $iCols = UBound($aItems, 2) Global $aColors[$iRows][$iCols] ; Fill color array For $i = 0 To $iRows - 1 ; Fill the whole array with the color white (i.e. make everything visible) For $j = 1 To $iCols - 1 $aColors[$i][$j] = $iWhite Next ; Fill the left column, i.e. Label column, with the color gray $aColors[$i][0] = $iGray Next ; Fill the first row, i.e. Status, with the color green if alive or active, else color red For $j = 1 To $iCols - 1 If StringInStr($aItems[0][2], "Levend") Or StringInStr($aItems[0][2], "Vivant") Or StringInStr($aItems[0][2], "Actief") Or StringInStr($aItems[0][2], "Actif") = Not 0 Then $aColors[0][$j] = $iGreen Else $aColors[0][$j] = $iRed EndIf Next ; Fill rows 5 through 11, with the color green if value in BCE/RRN is identical to UpValue, else color red For $j = 1 To $iCols - 1 For $i = 3 To 10 $aColors[$i][$j] = StringCompare($aItems[$i][1], $aItems[$i][2], 1) = Not 0 ? $iRed : $iGreen Next Next EndFunc ;==>_COLOR_ARRAY #EndRegion ### _COLOR_ARRAY() Function for coloring subitems ### _COLOR_ARRAY() ; Add the Array to the ListView _GUICtrlListView_AddArray($g_hListView, $aItems) ; _WRITEMESSAGETOLOG("GUI Functions - Create Pane GUI - Array added to ListView." & " | " & @ScriptLineNumber) #Region ### WM_NOTIFY function for click handling ### Global $iDoubleClickSpeed = DllCall('user32.dll', 'uint', 'GetDoubleClickTime')[0] ; Variable to check the clickspeed and determine a doubleclick Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) ; Windows Control: sent by a common control to its parent window when an event has occurred (https://docs.microsoft.com/en-us/windows/win32/controls/wm-notify) #forceref $hWnd, $iMsg, $wParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tEnLink, $iCpMin, $iCpMax, $tMsgFilter, $tInfo $tNMHDR = DllStructCreate($tagNMHDR, $lParam) ; Contains information about a notification message (https://docs.microsoft.com/en-us/windows/win32/api/richedit/ns-richedit-nmhdr) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) ; A window handle to the control sending the message $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") ; An identifier of the control sending the message $iCode = DllStructGetData($tNMHDR, "Code") ; A notification code Switch $hWndFrom ; Check which window sends the message Case $hInfo ; Message from the Info Pane Select Case $iCode = $EN_LINK ; When a URL gets clicked $tMsgFilter = DllStructCreate($tagMSGFILTER, $lParam) If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then $tEnLink = DllStructCreate($tagENLINK, $lParam) $iCpMin = DllStructGetData($tEnLink, "cpMin") $iCpMax = DllStructGetData($tEnLink, "cpMax") $sGetLink = _GUICtrlRichEdit_GetTextInRange($hInfo, $iCpMin, $iCpMax) ; Get the URL $sCreateParameter = $sGetLink & " --new-tab" ; Make sure the URL will open in a new tab ShellExecute("chrome.exe", $sCreateParameter) ; Open the URL in Google Chrome ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - Link " & $sGetLink & " clicked" & " | " & @ScriptLineNumber) EndIf EndSelect Case $g_hListView ; Message from the ListView in the comparison pane Switch $iCode ; When an Item/Subitem gets clicked in the ListView Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Global $iIndex = DllStructGetData($tInfo, "Index") Global $iSubItem = DllStructGetData($tInfo, "SubItem") AdlibRegister('LeftClickEvent', $iDoubleClickSpeed) ; Verify it was not a double-click event, if not go to the Function 'LeftClickEvent' ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent" & " | " & @ScriptLineNumber) Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Global $iIndex = DllStructGetData($tInfo, "Index") Global $iSubItem = DllStructGetData($tInfo, "SubItem") DoubleLeftClickEvent() ; Go to the Function 'DoubleLeftClickEvent' ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent" & " | " & @ScriptLineNumber) Case $NM_CUSTOMDRAW Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam) Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage") Switch $dwDrawStage ; Holds a value that specifies the drawing stage Case $CDDS_PREPAINT ; Before the paint cycle begins Return $CDRF_NOTIFYITEMDRAW ; Notify the parent window of any item-related drawing operations Case $CDDS_ITEMPREPAINT ; Before painting an item Return $CDRF_NOTIFYSUBITEMDRAW ; Notify the parent window of any subitem-related drawing operations Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before painting a subitem ;Local $iItem = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index ;Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index ;DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", $aColors[$iItem][$iSubItem] ) ; Backcolor of item/subitem DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", $aColors[DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec")][DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem")]) Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors EndSwitch EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func LeftClickEvent() ; Interpret a single click with the left mouse button on an Item/Subitem AdlibUnRegister('LeftClickEvent') Local $sItemSingleClicked = "" $sItemSingleClicked = _GUICtrlListView_GetItemText($g_hListView, $iIndex, $iSubItem) ; Get the text of what was clicked on Switch $iSubItem ; Action based on a column Case 0 ; Do nothing in 1st column ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 1 ; Select the indexes from the ListView based on the IDType Select Case $sIDTypeFromExcel = "Person" ; If the ID Type is a physical person (smaller array with data) Switch $iIndex ; Action based on a row Case 0 ; Do nothing for 1st row ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 1 ; Select a FED category SelectFedCategory() ; Go to the Function 'SelectFedCategory' (drop down choice) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 2 To 10 ; Allow edit data from rows 2 to 10 in separate window EditSecondColumn($sItemSingleClicked) ; Go to the Function 'EditSecondColumn' (open input box to edit the text) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 11 To 13 ; Do nothing for last 3 rows ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) EndSwitch Case $sIDTypeFromExcel = "Company_BCE" Or $sIDTypeFromExcel = "Company_ESTA" ; If the ID Type is a company (larger array with data) Switch $iIndex ; Action based on a row Case 0 ; Do nothing for first 3 rows ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 1 ; Select a FED category SelectFedCategory() ; Go to the Function 'SelectFedCategory' (dropdown list) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 2 To 12 ; Allow edit data from rows 2 to 12 in separate window EditSecondColumn($sItemSingleClicked) ; Go to the Function 'EditSecondColumn' (open input box to edit the text) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 13 To 15 ; Do nothing for last 3 rows ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) EndSwitch EndSelect Case 2 ; Do nothing in 3rd column ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 3 ; Do nothing in 4th column ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - LeftClickEvent on " & $sItemSingleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) EndSwitch EndFunc ;==>LeftClickEvent Func SelectFedCategory() ; Select a FED category ; Create a GUI with various controls. Local $hFEDGUI = GUICreate("FED category", 300, 50) ; Create a combobox control. Local $idComboBox = GUICtrlCreateCombo("", 10, 10, 250, 20) ; Switch languages to Add items to the combobox in the form of a dropdown list Switch $userLanguage Case "NL" GUICtrlSetData($idComboBox, "FED1 - Onderworpen Belgische BTW|FED2 - Onderworpen Buitenlandse BTW|FED3 - Natuurlijke persoon in België" & _ "|FED4 - Natuurlijke persoon in buitenland|FED5 - Dienstverlener zonder BTW|FED6 - Federale administratie" & _ "|FED7 - Andere overheidsdienst", "FED1 - Onderworpen Belgische BTW") Case "FR" GUICtrlSetData($idComboBox, "FED1 - Asujetti à la TVA belge|FED2 - Asujetti à la TVA étrangère|FED3 - Pers. Physique Résidente" & _ "|FED4 - Pers. Physique Non-résidente|FED5 - Prestataire services sans TVA|FED6 - Administration Fédérale (PCG)" & _ "|FED7 - Autre Admin. Publique", "FED1 - Asujetti à la TVA belge") EndSwitch ; Display the GUI. GUISetState(@SW_SHOW, $hFEDGUI) If @error = 0 Then ; Disable and subsequently re-enable the combobox if the window freezes WinSetState("FED category", "", @SW_DISABLE) Sleep(250) WinSetState("FED category", "", @SW_ENABLE) EndIf Local $sComboRead = "" ; Variable to read the user's choice from the combobox While 1 ; Endless loop until the user exits the combobox or makes a choice Switch GUIGetMsg() ; Use simple parameter () to interpret the variable Case $GUI_EVENT_CLOSE ; If we get the CLOSE message from $hFEDGUI ExitLoop ; Exit the loop and thus exit the program Case $idComboBox ; Combobox to display a dropdown list with FED choices $sFed = "" ; Reset the $sFed variable that was previously used to add a tentative FED category $sComboRead = GUICtrlRead($idComboBox) ; Read the user's choice ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - SelectFedCategory - Selected " & $sComboRead & " | " & @ScriptLineNumber) ; Switch languages to read the combobox Switch $userLanguage Case "NL" Switch $sComboRead Case "FED1 - Onderworpen Belgische BTW" _GUICtrlListView_SetItem($g_hListView, "FED1", $iIndex, $iSubItem) $sFed = $sFED1 Case "FED2 - Onderworpen Buitenlandse BTW" _GUICtrlListView_SetItem($g_hListView, "FED2", $iIndex, $iSubItem) $sFed = $sFED2 Case "FED3 - Natuurlijke persoon in België" _GUICtrlListView_SetItem($g_hListView, "FED3", $iIndex, $iSubItem) $sFed = $sFED3 Case "FED4 - Natuurlijke persoon in buitenland" _GUICtrlListView_SetItem($g_hListView, "FED4", $iIndex, $iSubItem) $sFed = $sFED4 Case "FED5 - Dienstverlener zonder BTW" _GUICtrlListView_SetItem($g_hListView, "FED5", $iIndex, $iSubItem) $sFed = $sFED5 Case "FED6 - Federale administratie" _GUICtrlListView_SetItem($g_hListView, "FED6", $iIndex, $iSubItem) $sFed = $sFED6 Case "FED7 - Andere overheidsdienst" _GUICtrlListView_SetItem($g_hListView, "FED7", $iIndex, $iSubItem) $sFed = $sFED7 EndSwitch Case "FR" Switch $sComboRead Case "FED1 - Asujetti à la TVA belge" _GUICtrlListView_SetItem($g_hListView, "FED1", $iIndex, $iSubItem) $sFed = $sFED1 Case "FED2 - Asujetti à la TVA étrangère" _GUICtrlListView_SetItem($g_hListView, "FED2", $iIndex, $iSubItem) $sFed = $sFED2 Case "FED3 - Pers. Physique Résidente" _GUICtrlListView_SetItem($g_hListView, "FED3", $iIndex, $iSubItem) $sFed = $sFED3 Case "FED4 - Pers. Physique Non-résidente" _GUICtrlListView_SetItem($g_hListView, "FED4", $iIndex, $iSubItem) $sFed = $sFED4 Case "FED5 - Prestataire services sans TVA" _GUICtrlListView_SetItem($g_hListView, "FED5", $iIndex, $iSubItem) $sFed = $sFED5 Case "FED6 - Administration Fédérale (PCG)" _GUICtrlListView_SetItem($g_hListView, "FED6", $iIndex, $iSubItem) $sFed = $sFED6 Case "FED7 - Autre Admin. Publique" _GUICtrlListView_SetItem($g_hListView, "FED7", $iIndex, $iSubItem) $sFed = $sFED7 EndSwitch EndSwitch ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - SelectFedCategory - FED set to: " & $sFed & " | " & @ScriptLineNumber) ExitLoop EndSwitch WEnd ; Delete the FED selection GUI and all controls. GUIDelete($hFEDGUI) EndFunc ;==>SelectFedCategory Func EditSecondColumn(ByRef $sItemClicked) ; Open an input box to edit the text that was clicked on in the 2nd column Global $sEditedSubItem = "" ; Variable to store the edited text $sEditedSubItem = InputBox("Edit", "Manual Edit", $sItemClicked, "", 300, 130) ; Show input box with the text that was clicked on in the 2nd column ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - EditSecondColumn - Text for manual editing: " & $sItemClicked & " | " & @ScriptLineNumber) If @error = 1 Then ; If the cancel button is pressed ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - EditSecondColumn - Editing cancelled" & " | " & @ScriptLineNumber) _GUICtrlListView_SetItem($g_hListView, $sItemClicked, $iIndex, $iSubItem) ; Put the original text back in the ListView ElseIf @error = 0 Then ; If OK was pressed If StringCompare($sEditedSubItem, $sItemClicked, $STR_CASESENSE) = Not 0 Then ; If the text was changed (Case sensitive) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - EditSecondColumn - Text changed to: " & $sEditedSubItem & " | " & @ScriptLineNumber) _GUICtrlListView_SetItem($g_hListView, $sEditedSubItem, $iIndex, $iSubItem) ; Put the variable in the ListView Else ; If the text remained unchanged ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - EditSecondColumn - Text left unchanged: " & $sItemClicked & " | " & @ScriptLineNumber) _GUICtrlListView_SetItem($g_hListView, $sItemClicked, $iIndex, $iSubItem) ; Put the original text back in the ListView EndIf EndIf EndFunc ;==>EditSecondColumn Func DoubleLeftClickEvent() ; Interpret a double click with the left mouse button on an Item/Subitem AdlibUnRegister('LeftClickEvent') Local $sItemDoubleClicked = "" $sItemDoubleClicked = _GUICtrlListView_GetItemText($g_hListView, $iIndex, $iSubItem) ; Get the text of what was clicked on Switch $iSubItem ; Action based on a column Case 0 ; Do nothing in 1st column ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 1 ; Do nothing in 2nd column ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 2 ; Select the indexes from the ListView based on the IDType Select Case $sIDTypeFromExcel = "Person" ; If the ID Type is a physical person (smaller array with data) Switch $iIndex ; Action based on a row Case 0 To 2 ; Do nothing for first 3 rows ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 3 To 10 ; Copy from 3rd column to 2nd column _GUICtrlListView_SetItem($g_hListView, $sItemDoubleClicked, $iIndex, $iSubItem - 1) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - " & $sItemDoubleClicked & " copied from column: " & $iSubItem & " to: " & $iSubItem - 1 & " | " & @ScriptLineNumber) Case 11 To 13 ; Do nothing for last 3 rows ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) EndSwitch Case $sIDTypeFromExcel = "Company_BCE" Or $sIDTypeFromExcel = "Company_ESTA" ; If the ID Type is a company (larger array with data) Switch $iIndex ; Action based on a row Case 0 To 2 ; Do nothing for first 3 rows ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Case 3 To 5 ; Copy from 3rd column to 2nd column _GUICtrlListView_SetItem($g_hListView, $sItemDoubleClicked, $iIndex, $iSubItem - 1) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - " & $sItemDoubleClicked & " copied from column: " & $iSubItem & " to: " & $iSubItem - 1 & " | " & @ScriptLineNumber) Case 6 ; Set VAT number if exists in BCE ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) Local $sVATSubItem = "" $sVATSubItem = $sItemDoubleClicked If $sVATSubItem = "" Then ; If nothing is mentioned under VAT at BCE remove VAT _GUICtrlListView_SetItem($g_hListView, $sVATSubItem, $iIndex, $iSubItem - 1) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - VAT removed" & " | " & @ScriptLineNumber) Else ; If VAT 'since...' is mentioned under VAT at BCE add VAT based on BCE number + 'BE' $sVATSubItem = "BE" & $sBCEFromExcel _GUICtrlListView_SetItem($g_hListView, $sVATSubItem, $iIndex, $iSubItem - 1) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - VAT added: " & $sVATSubItem & " | " & @ScriptLineNumber) EndIf Case 7 To 12 ; Copy from 3rd column to 2nd column _GUICtrlListView_SetItem($g_hListView, $sItemDoubleClicked, $iIndex, $iSubItem - 1) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - " & $sItemDoubleClicked & " copied from column: " & $iSubItem & " to: " & $iSubItem - 1 & " | " & @ScriptLineNumber) Case 13 To 15 ; Do nothing for last 3 rows ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) EndSwitch EndSelect Case 3 ; Copy from 4th column to 2nd column _GUICtrlListView_SetItem($g_hListView, $sItemDoubleClicked, $iIndex, $iSubItem - 2) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent on " & $sItemDoubleClicked & " column: " & $iSubItem & " row: " & $iIndex & " | " & @ScriptLineNumber) ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - " & $sItemDoubleClicked & " copied from column: " & $iSubItem & " to: " & $iSubItem - 2 & " | " & @ScriptLineNumber) EndSwitch EndFunc ;==>DoubleLeftClickEvent #EndRegion ### WM_NOTIFY function for click handling ### While 1 $idMsg = GUIGetMsg() Select Case $idMsg = $GUI_EVENT_CLOSE MsgBox($MB_SYSTEMMODAL, "", "Dialog was closed") ExitLoop Case $idMsg = $hButton_1_Validate MsgBox($MB_SYSTEMMODAL, "", "Validate pressed", 2) Case $idMsg = $hButton_2_Reset MsgBox($MB_SYSTEMMODAL, "", "Reset pressed", 2) Case $idMsg = $hButton_3_Refresh MsgBox($MB_SYSTEMMODAL, "", "Refresh pressed", 2) EndSelect WEnd Link to comment Share on other sites More sharing options...
Nine Posted July 6, 2022 Share Posted July 6, 2022 1 hour ago, DavProg said: Partial script, stripped of all unnecessary parts Sorry to say but there is a lot of unnecessary parts in your code. It would greatly help us if you could reduce it to its very strict minimum (should be about 40-50 lines of code). You could use this example to start with and to show us your issue. “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy Link to comment Share on other sites More sharing options...
LarsJ Posted July 6, 2022 Share Posted July 6, 2022 The problem with red/green subitems is trivial. The listview background colors in $aColors are not updated when the listview subitem texts are updated. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
DavProg Posted July 7, 2022 Author Share Posted July 7, 2022 10 hours ago, LarsJ said: The problem with red/green subitems is trivial. The listview background colors in $aColors are not updated when the listview subitem texts are updated. Hi Lars, thanks for mentionning that. Having looked at your ListView UDF's, I can say you're an expert in this matter and I greatly appreciate your input. The UDF's are over my head, though, at this point. I've been using AutoIT for only a few months and I try to keep things as simple as possible. I have been trying to figure out at what point and in which way I should be doing updates of the coloring. I've been inserting the _COLOR_ARRAY function at different stages, adding Redraw with Winapi, but I don't seem to capture exactly when and where it should happen. Link to comment Share on other sites More sharing options...
LarsJ Posted July 7, 2022 Share Posted July 7, 2022 Test initially with simple code like this: Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Global $iIndex = DllStructGetData($tInfo, "Index") Global $iSubItem = DllStructGetData($tInfo, "SubItem") DoubleLeftClickEvent() ; Go to the Function 'DoubleLeftClickEvent' $aColors[$iIndex][1] = $iGreen $aColors[$iIndex][2] = $iGreen $aColors[$iIndex][3] = $iGreen Then try to find out why the _COLOR_ARRAY() function does not work automatically. It's connected to $aItems array. When arrays are used in this way, they must be updated when the listview subitem texts are updated. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
DavProg Posted July 7, 2022 Author Share Posted July 7, 2022 57 minutes ago, LarsJ said: Test initially with simple code like this: Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Global $iIndex = DllStructGetData($tInfo, "Index") Global $iSubItem = DllStructGetData($tInfo, "SubItem") DoubleLeftClickEvent() ; Go to the Function 'DoubleLeftClickEvent' $aColors[$iIndex][1] = $iGreen $aColors[$iIndex][2] = $iGreen $aColors[$iIndex][3] = $iGreen Then try to find out why the _COLOR_ARRAY() function does not work automatically. It's connected to $aItems array. When arrays are used in this way, they must be updated when the listview subitem texts are updated. Thanks Lars, I'll check that out tomorrow. Had been adding a lot of SAP related script today (quite tough when you hit unexpected character limitations in filters). I tried adding coloring indications to $NM_DBLCLK before, but not in the way you suggest. Quite interesting. But yes, because I use gets and sets for the subitem texts I may have an issue at that level. Link to comment Share on other sites More sharing options...
Solution DavProg Posted July 11, 2022 Author Solution Share Posted July 11, 2022 On 7/7/2022 at 4:42 PM, LarsJ said: Test initially with simple code like this: Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Global $iIndex = DllStructGetData($tInfo, "Index") Global $iSubItem = DllStructGetData($tInfo, "SubItem") DoubleLeftClickEvent() ; Go to the Function 'DoubleLeftClickEvent' $aColors[$iIndex][1] = $iGreen $aColors[$iIndex][2] = $iGreen $aColors[$iIndex][3] = $iGreen Then try to find out why the _COLOR_ARRAY() function does not work automatically. It's connected to $aItems array. When arrays are used in this way, they must be updated when the listview subitem texts are updated. Taking into account @LarsJ suggestion about inserting color changes at the level of $NM_DBLCLK and using _GUICtrlListView_GetItemText() to compare the contents of the changed ListView (since the actual array doesn't change, so comparing the $iIndex/$iSubitem values of $aItems didn't show any changes), delivered a pretty simple solution that works to set the colors after a change with double-click. Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Global $iIndex = DllStructGetData($tInfo, "Index") Global $iSubItem = DllStructGetData($tInfo, "SubItem") DoubleLeftClickEvent() ; Go to the Function 'DoubleLeftClickEvent' ; _WRITEMESSAGETOLOG("GUI Functions - WM_NOTIFY - DoubleLeftClickEvent" & " | " & @ScriptLineNumber) $sUpValue = StringStripWS(_GUICtrlListView_GetItemText($g_hListView, $iIndex, 1), 1+2+4) $sBCE_RRN = StringStripWS(_GUICtrlListView_GetItemText($g_hListView, $iIndex, 2), 1+2+4) If StringCompare($sUpValue, $sBCE_RRN, 1) = 0 Then $aColors[$iIndex][1] = $iGreen $aColors[$iIndex][2] = $iGreen $aColors[$iIndex][3] = $iGreen Else $aColors[$iIndex][1] = $iRed $aColors[$iIndex][2] = $iRed $aColors[$iIndex][3] = $iRed EndIf Thanks again @LarsJ for the practical suggestion. The full version I'll be implementing will of course use Selects and Switches to make precise comparisons/choices possible. Link to comment Share on other sites More sharing options...
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