Jewtus Posted October 25, 2016 Share Posted October 25, 2016 I'm trying to build a tree view that contains a list of IPs and then when you select one, additional steps are taken with the IP. I found an example of how to read the selected text of a treeview but I keep running into a problem. Sometimes, when I hit the "select" button in my UI, it returns the last record in the list and NOT the record I have selected. The weird part about this is that I've tried this a number of times on several different computers and windows versions and I keep getting the same issue. Sometimes it will ONLY select the last record, sometimes it selects the last record the first time and then starts letting you select, and sometimes it works without issue. Can anyone advise? Here is an example code block: expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GUITreeView.au3> NetworkGUI() Func NetworkGUI($parent = 0) $MachineSelectorGUI = GUICreate("Network Check", 616, 500, Default, Default, Default, Default, $parent) $idMachineList = GUICtrlCreateTreeView(16, 16, 584, 420) $btnSelect = GUICtrlCreateButton("Select", 528, 448, 75, 25) ;Menus $mFile = GUICtrlCreateMenu("File") $mSearchForHosts = GUICtrlCreateMenuItem("Search network for hosts", $mFile) GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE GUIDelete($MachineSelectorGUI) ExitLoop Case $btnSelect $hItem=0 $hItem=_GUICtrlTreeView_GetSelection($idMachineList) If $hItem <> 0 Then $sSelected=_GUICtrlTreeView_GetText($idMachineList, $hItem) MsgBox(0,"",$sSelected) Else MsgBox(0,"Oops...","Please select a host to check") EndIf Case $mSearchForHosts Local $aMachines[244]=['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6', '192.168.1.7', '192.168.1.8', '192.168.1.9', '192.168.1.10', '192.168.1.11', '192.168.1.12', '192.168.1.13', '192.168.1.14', '192.168.1.15', '192.168.1.16', '192.168.1.17', '192.168.1.18', '192.168.1.19', '192.168.1.20', '192.168.1.21', '192.168.1.22', '192.168.1.23', '192.168.1.24', '192.168.1.25', '192.168.1.26', '192.168.1.27', '192.168.1.28', '192.168.1.29', '192.168.1.30', '192.168.1.31', '192.168.1.32', '192.168.1.33', '192.168.1.34', '192.168.1.35', '192.168.1.36', '192.168.1.37', '192.168.1.38', '192.168.1.39', '192.168.1.40', '192.168.1.41', '192.168.1.42', '192.168.1.43', '192.168.1.44', '192.168.1.45', '192.168.1.46', '192.168.1.47', '192.168.1.48', '192.168.1.49', '192.168.1.50', '192.168.1.51', '192.168.1.52', '192.168.1.53', '192.168.1.54', '192.168.1.55', '192.168.1.56', '192.168.1.57', '192.168.1.58', '192.168.1.59', '192.168.1.60', '192.168.1.61', '192.168.1.62', '192.168.1.63', '192.168.1.64', '192.168.1.65', '192.168.1.66', '192.168.1.67', '192.168.1.68', '192.168.1.69', '192.168.1.70', '192.168.1.71', '192.168.1.72', '192.168.1.73', '192.168.1.74', '192.168.1.75', '192.168.1.76', '192.168.1.77', '192.168.1.78', '192.168.1.79', '192.168.1.80', '192.168.1.81', '192.168.1.82', '192.168.1.83', '192.168.1.84', '192.168.1.85', '192.168.1.86', '192.168.1.87', '192.168.1.88', '192.168.1.89', '192.168.1.90', '192.168.1.91', '192.168.1.92', '192.168.1.93', '192.168.1.94', '192.168.1.95', '192.168.1.96', '192.168.1.97', '192.168.1.98', '192.168.1.99', '192.168.1.100', '192.168.1.101', '192.168.1.102', '192.168.1.103', '192.168.1.104', '192.168.1.105', '192.168.1.106', '192.168.1.107', '192.168.1.108', '192.168.1.109', '192.168.1.110', '192.168.1.111', '192.168.1.112', '192.168.1.113', '192.168.1.114', '192.168.1.115', '192.168.1.116', '192.168.1.117', '192.168.1.118', '192.168.1.119', '192.168.1.120', '192.168.1.121', '192.168.1.122', '192.168.1.123', '192.168.1.124', '192.168.1.125', '192.168.1.126', '192.168.1.127', '192.168.1.128', '192.168.1.129', '192.168.1.130', '192.168.1.131', '192.168.1.132', '192.168.1.133', '192.168.1.134', '192.168.1.135', '192.168.1.136', '192.168.1.137', '192.168.1.138', '192.168.1.139', '192.168.1.140', '192.168.1.141', '192.168.1.142', '192.168.1.143', '192.168.1.144', '192.168.1.145', '192.168.1.146', '192.168.1.147', '192.168.1.148', '192.168.1.149', '192.168.1.150', '192.168.1.151', '192.168.1.152', '192.168.1.153', '192.168.1.154', '192.168.1.155', '192.168.1.156', '192.168.1.157', '192.168.1.158', '192.168.1.159', '192.168.1.160', '192.168.1.161', '192.168.1.162', '192.168.1.163', '192.168.1.164', '192.168.1.165', '192.168.1.166', '192.168.1.167', '192.168.1.168', '192.168.1.169', '192.168.1.170', '192.168.1.171', '192.168.1.172', '192.168.1.173', '192.168.1.174', '192.168.1.175', '192.168.1.176', '192.168.1.177', '192.168.1.178', '192.168.1.179', '192.168.1.180', '192.168.1.181', '192.168.1.182', '192.168.1.183', '192.168.1.184', '192.168.1.185', '192.168.1.186', '192.168.1.187', '192.168.1.188', '192.168.1.189', '192.168.1.190', '192.168.1.191', '192.168.1.192', '192.168.1.193', '192.168.1.194', '192.168.1.195', '192.168.1.196', '192.168.1.197', '192.168.1.198', '192.168.1.199', '192.168.1.200', '192.168.1.201', '192.168.1.202', '192.168.1.203', '192.168.1.204', '192.168.1.205', '192.168.1.206', '192.168.1.207', '192.168.1.208', '192.168.1.209', '192.168.1.210', '192.168.1.211', '192.168.1.212', '192.168.1.213', '192.168.1.214', '192.168.1.215', '192.168.1.216', '192.168.1.217', '192.168.1.218', '192.168.1.219', '192.168.1.220', '192.168.1.221', '192.168.1.222', '192.168.1.223', '192.168.1.224', '192.168.1.225', '192.168.1.226', '192.168.1.227', '192.168.1.228', '192.168.1.229', '192.168.1.230', '192.168.1.231', '192.168.1.232', '192.168.1.233', '192.168.1.234', '192.168.1.235', '192.168.1.236', '192.168.1.237', '192.168.1.238', '192.168.1.239', '192.168.1.240', '192.168.1.241', '192.168.1.242', '192.168.1.243', '192.168.1.244'] For $x=1 to UBound($aMachines)-1 If $aMachines[$x]<>'' then GUICtrlCreateTreeViewItem($aMachines[$x], $idMachineList) GUICtrlSetImage(-1, "shell32.dll", 16) EndIf Next EndSwitch WEnd EndFunc Link to comment Share on other sites More sharing options...
spudw2k Posted October 25, 2016 Share Posted October 25, 2016 Having a hard time replicating the condition, but I did notice that providing a non-positive integer (<0) to _GetText function seems to return the last item in the list. Have you checked to make sure that the row/index returned by the _GetSelection is accurate? Spoiler Things I've Made: Always On Top Tool ◊ AU History ◊ Deck of Cards ◊ HideIt ◊ ICU ◊ Icon Freezer ◊ Ipod Ejector ◊ Junos Configuration Explorer ◊ Link Downloader ◊ MD5 Folder Enumerator ◊ PassGen ◊ Ping Tool ◊ Quick NIC ◊ Read OCR ◊ RemoteIT ◊ SchTasksGui ◊ SpyCam ◊ System Scan Report Tool ◊ System UpTime ◊ Transparency Machine ◊ VMWare ESX Builder Misc Code Snippets: ADODB Example ◊ CheckHover ◊ Detect SafeMode ◊ DynEnumArray ◊ GetNetStatData ◊ HashArray ◊ IsBetweenDates ◊ Local Admins ◊ Make Choice ◊ Recursive File List ◊ Remove Sizebox Style ◊ Retrieve PNPDeviceID ◊ Retrieve SysListView32 Contents ◊ Set IE Homepage ◊ Tickle Expired Password ◊ Transpose Array Projects: Drive Space Usage GUI ◊ LEDkIT ◊ Plasma_kIt ◊ Scan Engine Builder ◊ SpeeDBurner ◊ SubnetCalc Cool Stuff: AutoItObject UDF ◊ Extract Icon From Proc ◊ GuiCtrlFontRotate ◊ Hex Edit Funcs ◊ Run binary ◊ Service_UDF Link to comment Share on other sites More sharing options...
Jewtus Posted October 25, 2016 Author Share Posted October 25, 2016 (edited) It happens every couple times I try it, but your suggestion was a good idea. I put a console write in to see what $hItem was getting passed into the GetText function and they are in fact changing: OUTPUT: 0x0000000CDDA17620 0x0000000CDDBDA300 0x0000000CDDBDA6C0 This is 3 different values I selected, but the msgbox that showed up was still for the last IP in the list. I also tried changing: If $hItem <> 0 Then to If $hItem > 0 Then and I still am able to reproduce the issue. I'm going to keep focusing in on the GetText function because clearly that is where the issue is in my script. EDIT: I added Case $mTEST $input=InputBox("Input hItem","") $sSelected=_GUICtrlTreeView_GetText($idMachineList, $input) MsgBox(0,"",$sSelected) to validate the values that write to the console, and when I run the value through the input box... it shows the first record in the list... I've also been able to determine that if I click the Tree view before it finishes adding everything, I'm able to reproduce the issue almost every time. Edited October 25, 2016 by Jewtus Link to comment Share on other sites More sharing options...
Jewtus Posted October 25, 2016 Author Share Posted October 25, 2016 I think I might know what happened. I put in _beginupdate and _Endupdate (as well as locked the GUI) and I was still able to reproduce the issue, but when I applied images (I was trying to get the error to happen on the examples and was not able to do so) and it fixed the issue. Not exactly sure why, but when I gave the _add function an output variable the problem seemed to go away. expandcollapse popup#include <GUITreeView.au3> NetworkGUI() Func NetworkGUI($parent = 0) $MachineSelectorGUI = GUICreate("Network Check", 616, 500, Default, Default, Default, Default, $parent) $idMachineList = GUICtrlCreateTreeView(16, 16, 584, 420,BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS),$WS_EX_CLIENTEDGE) $g_hImage = _GUIImageList_Create(16, 16, 5, 3) _GUIImageList_AddIcon($g_hImage, "shell32.dll", 13) _GUIImageList_AddIcon($g_hImage, "shell32.dll", 14) _GUICtrlTreeView_SetNormalImageList($idMachineList, $g_hImage) $g_hStateImage = _GUIImageList_Create(16, 16, 5, 3) _GUIImageList_AddIcon($g_hStateImage, "shell32.dll", 15) _GUIImageList_AddIcon($g_hStateImage, "shell32.dll", 23) _GUICtrlTreeView_SetStateImageList($idMachineList, $g_hStateImage) $btnSelect = GUICtrlCreateButton("Select", 528, 448, 75, 25) ;Menus $mFile = GUICtrlCreateMenu("File") $mSearchForHosts = GUICtrlCreateMenuItem("Search network for hosts", $mFile) GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE GUIDelete($MachineSelectorGUI) ExitLoop Case $btnSelect local $sSelected='',$hItem=0 $hItem=_GUICtrlTreeView_GetSelection($idMachineList) ConsoleWrite($hItem&@CRLF) If $hItem <> 0 Then $sSelected=_GUICtrlTreeView_GetText($idMachineList, $hItem) MsgBox(0,"",$sSelected) Else MsgBox(0,"Oops...","Please select a host to check") EndIf Case $mSearchForHosts Local $aMachines[244]=['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6', '192.168.1.7', '192.168.1.8', '192.168.1.9', '192.168.1.10', '192.168.1.11', '192.168.1.12', '192.168.1.13', '192.168.1.14', '192.168.1.15', '192.168.1.16', '192.168.1.17', '192.168.1.18', '192.168.1.19', '192.168.1.20', '192.168.1.21', '192.168.1.22', '192.168.1.23', '192.168.1.24', '192.168.1.25', '192.168.1.26', '192.168.1.27', '192.168.1.28', '192.168.1.29', '192.168.1.30', '192.168.1.31', '192.168.1.32', '192.168.1.33', '192.168.1.34', '192.168.1.35', '192.168.1.36', '192.168.1.37', '192.168.1.38', '192.168.1.39', '192.168.1.40', '192.168.1.41', '192.168.1.42', '192.168.1.43', '192.168.1.44', '192.168.1.45', '192.168.1.46', '192.168.1.47', '192.168.1.48', '192.168.1.49', '192.168.1.50', '192.168.1.51', '192.168.1.52', '192.168.1.53', '192.168.1.54', '192.168.1.55', '192.168.1.56', '192.168.1.57', '192.168.1.58', '192.168.1.59', '192.168.1.60', '192.168.1.61', '192.168.1.62', '192.168.1.63', '192.168.1.64', '192.168.1.65', '192.168.1.66', '192.168.1.67', '192.168.1.68', '192.168.1.69', '192.168.1.70', '192.168.1.71', '192.168.1.72', '192.168.1.73', '192.168.1.74', '192.168.1.75', '192.168.1.76', '192.168.1.77', '192.168.1.78', '192.168.1.79', '192.168.1.80', '192.168.1.81', '192.168.1.82', '192.168.1.83', '192.168.1.84', '192.168.1.85', '192.168.1.86', '192.168.1.87', '192.168.1.88', '192.168.1.89', '192.168.1.90', '192.168.1.91', '192.168.1.92', '192.168.1.93', '192.168.1.94', '192.168.1.95', '192.168.1.96', '192.168.1.97', '192.168.1.98', '192.168.1.99', '192.168.1.100', '192.168.1.101', '192.168.1.102', '192.168.1.103', '192.168.1.104', '192.168.1.105', '192.168.1.106', '192.168.1.107', '192.168.1.108', '192.168.1.109', '192.168.1.110', '192.168.1.111', '192.168.1.112', '192.168.1.113', '192.168.1.114', '192.168.1.115', '192.168.1.116', '192.168.1.117', '192.168.1.118', '192.168.1.119', '192.168.1.120', '192.168.1.121', '192.168.1.122', '192.168.1.123', '192.168.1.124', '192.168.1.125', '192.168.1.126', '192.168.1.127', '192.168.1.128', '192.168.1.129', '192.168.1.130', '192.168.1.131', '192.168.1.132', '192.168.1.133', '192.168.1.134', '192.168.1.135', '192.168.1.136', '192.168.1.137', '192.168.1.138', '192.168.1.139', '192.168.1.140', '192.168.1.141', '192.168.1.142', '192.168.1.143', '192.168.1.144', '192.168.1.145', '192.168.1.146', '192.168.1.147', '192.168.1.148', '192.168.1.149', '192.168.1.150', '192.168.1.151', '192.168.1.152', '192.168.1.153', '192.168.1.154', '192.168.1.155', '192.168.1.156', '192.168.1.157', '192.168.1.158', '192.168.1.159', '192.168.1.160', '192.168.1.161', '192.168.1.162', '192.168.1.163', '192.168.1.164', '192.168.1.165', '192.168.1.166', '192.168.1.167', '192.168.1.168', '192.168.1.169', '192.168.1.170', '192.168.1.171', '192.168.1.172', '192.168.1.173', '192.168.1.174', '192.168.1.175', '192.168.1.176', '192.168.1.177', '192.168.1.178', '192.168.1.179', '192.168.1.180', '192.168.1.181', '192.168.1.182', '192.168.1.183', '192.168.1.184', '192.168.1.185', '192.168.1.186', '192.168.1.187', '192.168.1.188', '192.168.1.189', '192.168.1.190', '192.168.1.191', '192.168.1.192', '192.168.1.193', '192.168.1.194', '192.168.1.195', '192.168.1.196', '192.168.1.197', '192.168.1.198', '192.168.1.199', '192.168.1.200', '192.168.1.201', '192.168.1.202', '192.168.1.203', '192.168.1.204', '192.168.1.205', '192.168.1.206', '192.168.1.207', '192.168.1.208', '192.168.1.209', '192.168.1.210', '192.168.1.211', '192.168.1.212', '192.168.1.213', '192.168.1.214', '192.168.1.215', '192.168.1.216', '192.168.1.217', '192.168.1.218', '192.168.1.219', '192.168.1.220', '192.168.1.221', '192.168.1.222', '192.168.1.223', '192.168.1.224', '192.168.1.225', '192.168.1.226', '192.168.1.227', '192.168.1.228', '192.168.1.229', '192.168.1.230', '192.168.1.231', '192.168.1.232', '192.168.1.233', '192.168.1.234', '192.168.1.235', '192.168.1.236', '192.168.1.237', '192.168.1.238', '192.168.1.239', '192.168.1.240', '192.168.1.241', '192.168.1.242', '192.168.1.243', '192.168.1.244'] GUISetState(@SW_LOCK) local $ahItem[UBound($aMachines)] _GUICtrlTreeView_BeginUpdate($idMachineList) For $x=1 to UBound($aMachines)-1 If $aMachines[$x]<>'' then $ahItem[$x]=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1) _GUICtrlTreeView_SetStateImageIndex($idMachineList, $ahItem[$x], 1) Else $ahItem[$x]=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1) _GUICtrlTreeView_SetStateImageIndex($idMachineList, $ahItem[$x], 2) EndIf Next _GUICtrlTreeView_EndUpdate($idMachineList) GUISetState(@SW_UNLOCK) EndSwitch WEnd EndFunc Link to comment Share on other sites More sharing options...
spudw2k Posted October 25, 2016 Share Posted October 25, 2016 I wonder if it was a weird AutoIt Internal control ID versus Control Handle issue (return from GUICtrlCreateTreeViewItem versus _GUICTrlTreeView_Add). Not sure what it would be...especially because _GetSelection should've returned the right handle. Either way...I still couldn't reproduce on my machine. Just curirous. If you remove the $ahItem array does the script still work? Might be erroneous, unless you plan to reference the items later via this array. ;From This GUISetState(@SW_LOCK) local $ahItem[UBound($aMachines)] _GUICtrlTreeView_BeginUpdate($idMachineList) For $x=1 to UBound($aMachines)-1 If $aMachines[$x]<>'' then $ahItem[$x]=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1) _GUICtrlTreeView_SetStateImageIndex($idMachineList, $ahItem[$x], 1) Else $ahItem[$x]=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1) _GUICtrlTreeView_SetStateImageIndex($idMachineList, $ahItem[$x], 2) EndIf Next _GUICtrlTreeView_EndUpdate($idMachineList) GUISetState(@SW_UNLOCK) ;To This GUISetState(@SW_LOCK) ;local $ahItem[UBound($aMachines)] _GUICtrlTreeView_BeginUpdate($idMachineList) For $x=1 to UBound($aMachines)-1 If $aMachines[$x]<>'' then $hItem=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1) _GUICtrlTreeView_SetStateImageIndex($idMachineList, $hItem, 1) Else $hItem=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1) _GUICtrlTreeView_SetStateImageIndex($idMachineList, $hItem, 2) EndIf Next _GUICtrlTreeView_EndUpdate($idMachineList) GUISetState(@SW_UNLOCK) Spoiler Things I've Made: Always On Top Tool ◊ AU History ◊ Deck of Cards ◊ HideIt ◊ ICU ◊ Icon Freezer ◊ Ipod Ejector ◊ Junos Configuration Explorer ◊ Link Downloader ◊ MD5 Folder Enumerator ◊ PassGen ◊ Ping Tool ◊ Quick NIC ◊ Read OCR ◊ RemoteIT ◊ SchTasksGui ◊ SpyCam ◊ System Scan Report Tool ◊ System UpTime ◊ Transparency Machine ◊ VMWare ESX Builder Misc Code Snippets: ADODB Example ◊ CheckHover ◊ Detect SafeMode ◊ DynEnumArray ◊ GetNetStatData ◊ HashArray ◊ IsBetweenDates ◊ Local Admins ◊ Make Choice ◊ Recursive File List ◊ Remove Sizebox Style ◊ Retrieve PNPDeviceID ◊ Retrieve SysListView32 Contents ◊ Set IE Homepage ◊ Tickle Expired Password ◊ Transpose Array Projects: Drive Space Usage GUI ◊ LEDkIT ◊ Plasma_kIt ◊ Scan Engine Builder ◊ SpeeDBurner ◊ SubnetCalc Cool Stuff: AutoItObject UDF ◊ Extract Icon From Proc ◊ GuiCtrlFontRotate ◊ Hex Edit Funcs ◊ Run binary ◊ Service_UDF Link to comment Share on other sites More sharing options...
Jewtus Posted October 26, 2016 Author Share Posted October 26, 2016 That too appears to work. I'm going to use that instead. 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