jrumbaug 0 Posted November 9, 2012 I am working on a popup picklist based on code samples from HELP. I am having trouble understanding GUIRegisterMsg(). The code posted works OK. I am concerned because I am getting my return value from the function named by GUIRegisterMsg() by setting a value to a GLOBAL variable. Is there a better way to do this, a way that does not use a GLOBAL variable? Thanks in advance Jim Rumbaugh expandcollapse popup;;; _PickList ;;; send an array of items to choose ;;; one item returned via DOUBLE CLICK with mouse or pressing ENTER key ;;; size of window automatically adjusts HEIGHT and WIDTH ;;; to number of items in list and width of text used in list or title #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <ListBoxConstants.au3> #include <Array.au3> #include <Math.au3> #Include <Misc.au3> Global $glExitMyList = 0 Local $aList[5] = [ 'Test1','Test2','Test3','Test4','Test123456789123456789' ] MsgBox(1,"selected", _PickList( $aList,"My Pick List",'Test3',100 , 100 )) Func _PickList($aList = "",$cTitle="My List",$cDefault="",$nLeft=100,$nTop=100 ) Local $nTitleWidth, $nListWidth, $i Local $Form1, $mylist ;;;;;;;; determine window height per number of elements in list $nHeight = (UBound($aList) * 12) + 30 ;;;;;;; determine window width per maximum width of elements in LIST or TITLE $nTitleWidth = StringLen($cTitle )*6 + 100 For $i = 0 To UBound($aList)-1 $nListWidth = _Max( $nListWidth , StringLen( $aList[$i])*7 ) Next $nWidth = _Max( $nTitleWidth , $nListWidth ) $Form1 = GUICreate( $cTitle , $nWidth , $nHeight , $nLeft , $nTop ) $mylist = GUICtrlCreateList( "" ,10,10,$nWidth - 20,$nHeight - 20, $cDefault ) GUICtrlSetData( $mylist , _ArrayToString( $aList,"|") , $cDefault ) GUISetState(@SW_SHOW) ;;; command to start DBL CLICK detection function GUIRegisterMsg($WM_COMMAND, "_IF_LIST_DBLCLICK") While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch ;;;; if ENTER KEY or LEFT ARROW or RIGHT ARROW pressed, Exit If _IsPressed( "0D" ) Or _IsPressed( "25" ) Or _IsPressed( "27" ) Then ExitLoop EndIf ;; See if _IF_LIST_DBLCLICK() detected a DBLCLICK from the list If $glExitMyList = $mylist Then ExitLoop EndIf WEnd Return GUICtrlRead($mylist) EndFunc Func _IF_LIST_DBLCLICK($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $lParam $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word $iCode = BitShift($wParam, 16) ; Hi Word Switch $iCode Case $LBN_DBLCLK ;; set global variable to ID of form $glExitMyList = $iIDFrom EndSwitch EndFunc Share this post Link to post Share on other sites
guinness 1,518 Posted November 9, 2012 (edited) No, unfortunately with certain AutoIt functions you're forced to a use a Global variable. GUIRegisterMsg is one of those functions. Some advice, I would use this instead in GUIRegisterMsg for readability. $iIDFrom = _WinAPI_LoWord($wParam) ; Low Word $iCode = _WinAPI_HiWord($wParam) ; Hi Word Edited November 9, 2012 by guinness UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Share this post Link to post Share on other sites
Melba23 3,407 Posted November 9, 2012 jrumbaug,Just to offer a contrary opinion, I would keep the Bit* operations - then you do not need to #include <WinAPI.au3>. But do also keep the Lo/Hi comments so that you know what the operations are doing! 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 Share this post Link to post Share on other sites
jrumbaug 0 Posted November 9, 2012 Thank you both. I consider my question solved. Jim Rumbaugh Share this post Link to post Share on other sites