Jump to content

second optional var in my udf


Recommended Posts

HotKeySet("!a", "funca")

func funca($a=20,$b=100000)

$b=$b-1

Error! when hotkeyed, var used without being declared!

func funca($a=20,$b=100000)

local $b

Error! when f5 go, already declared as a parameter

var and func names changed

Edited by undefinedspace
Link to comment
Share on other sites

You can't use a function with parameters with HotKeys (or OnEvent, or Adlib for that matter), the parameter variables aren't accessible so they cause an undeclared error message.

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

  • Moderators

undefinedspace,

First, welcome to the AutoIt forums. :)

From the Help file page for HotKeySet:

 

The called function can not be given parameters. They will be ignored.

So it is hardly surprising you get those errors. ;)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

Initiate global variables as your default at the start of your script...you can then subtract from them, or whatever (not passed as a param to the function)

$var=1234

hotkeyset...

func yourfunction()

$var -=1
...

endfunc
IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.
Link to comment
Share on other sites

 

Using globals would require 2 vars. I could call the real function from a different one that sets the parameters.

That would be the ONLY way to use the parameters in the function. As stated previously, a function with parameters won't be able to use the parameters if you use HotKeySet, or AdlibRegister, or OnEvent mode.

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

  • Moderators

undefinedspace,

 

$a causes no errors

That is because you do not try to access $a in the script. Add a line which does and you will see that the error happens on that line: ;)

HotKeySet("!a", "funca")

While 1
    Sleep(10)
WEnd

Func funca($a = 20, $b = 100000)
    $a += 1
    $b = $b - 1
EndFunc   ;==>funca
M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

What about using @NumParams ?

Func funca($a=20,$b=100000)
    If @NumParams = 0 Then Local $a=20, $b=100000
    $b = $b-1
    ConsoleWrite($b & @CRLF)
EndFunc

I will try it before posting, next time...

Edited by jguinch
Link to comment
Share on other sites

@jguinch,

Those parameters are already defined, no need for Local there.

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 parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

As stated previously, the parameters in a function that is called by a hotkey, or other methods already explained, will not be accessible, but AutoIt will see them as already defined and throw an error.

EDIT: here's an example to show you what I mean.

#AutoIt3Wrapper_Run_AU3Check=n
HotKeySet("a", "Funca")
HotKeySet("{esc}", "_Exit")
Funca()
While 1
    sleep(10)
WEnd

Func _Exit()
    Exit
EndFunc   ;==>_Exit

Func funca($a = 20, $b = 100000)
    If @NumParams = 0 Then Local $a = 10, $b = 1000
    $b = $b - 1
    ConsoleWrite($b & @CRLF)
EndFunc   ;==>funca

If you remove the Funca() line after the hotkeysets, the function works perfectly. When you call the function directly though, you get an error about redeclaring a declared parameter. So, don't use any functions with parameters with a function that can't use them, such as HotKeySet.

Edited by BrewManNH

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

You could use Assign() to get around the error check though I would not recommend using functions with parameters like that as it can get quite complicated, depending on the function and whether it is called by onevent or a direct call from the code.

Example using Assign() based from BrewManNHs last code.

HotKeySet("a", "Funca")
HotKeySet("{esc}", "_Exit")
Funca()
While 1
    sleep(10)
WEnd

Func _Exit()
    Exit
EndFunc

Func funca($a = 20, $b = 100000)
    If @NumParams = 0 Then
        If Not Assign('a', 20, 1) Then Return 0
        If Not Assign('b', 100000, 1) Then Return 0
    EndIf
    $b = $b - 1
    ConsoleWrite($b & @CRLF)
EndFunc

Sure it works, for a simple function, but it is being fixed by a work around. Functions that accept parameters as arrays, objects etc will probably be unworkable.

.

Another way is to use a function as a event handler for all HotKeySet events.

Example with _Event_HotKeySet() handling all hotkeys and thus able to call conditionally functions with parameters or what ever desired. It is a flexible concept.

HotKeySet("a",     "_Event_HotKeySet")
HotKeySet("b",     "_Event_HotKeySet")
HotKeySet("{ESC}", "_Event_HotKeySet")

While 1
    Sleep(10)
WEnd

Exit

Func _Event_HotKeySet()
    ; manage all hotkey events
    ConsoleWrite(@HotKeyPressed & @CRLF)
    Switch @HotKeyPressed
        Case 'a'
            _FuncA()
        Case 'b'
            _FuncB('title')
        Case '{ESC}'
            Exit
        Case Else
            MsgBox(0x40000, '_Event_HotKeySet()', 'No assigned for this event' & @CRLF & @HotKeyPressed)
    EndSwitch
EndFunc

Func _FuncA($a = 20, $b = 100000)
    $b = $b - 1
    MsgBox(0x40000, $a, $b)
EndFunc

Func _FuncB($a = '')
    MsgBox(0x40000, $a, 'You pressed the hotkey ' & @HotKeyPressed)
EndFunc

It adds a little more complication of more functions in the script but it is more manageable and does no work around to get past the checks of Au3Check or AutoIt.

Link to comment
Share on other sites

Or you can call the function ifself :

HotKeySet("a", "funca")
HotKeySet("{ESC}", "_Quit")

While 1
    Sleep(10)
WEnd


Func funca($a = 20, $b = 100000)
    If NOT IsDeclared("a") OR NOT IsDeclared("b") Then Return funca()

    $b -= 1
    ConsoleWrite($b & @CRLF)
EndFunc


Func _Quit()
    Exit
EndFunc
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...