jrumbaug Posted November 9, 2012 Share 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 Link to comment Share on other sites More sharing options...
guinness Posted November 9, 2012 Share 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 Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted November 9, 2012 Moderators Share 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 Link to comment Share on other sites More sharing options...
jrumbaug Posted November 9, 2012 Author Share Posted November 9, 2012 Thank you both. I consider my question solved. Jim Rumbaugh 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