Options often use a single letter prefix before a "binding"
For example, controls that store the value of the control on submit into a variable, will accept the name of the variable prefixed by v.
So, if you want to store the result into MyVar, you would actually pass vMyVar.
Gui Controls also accept routines to be called via g-label
To call MyFunc(), you would use gMyFunc
Try to avoid calling Click, Down or Send {LButton down} early - try to call it last in a given thread / routine
In my experience, AHK basically stopped execution of the current routine / thread until the an Up event was sent - either by my script or the user performing a mouse click.
I could not find any documentation that might explain this behavior
FAQ
Easiest way to debug
Add OutputDebug lines, and keep SysInternals DebugView open!
Why aren't my variables receiving updated values from the GUI controls?
Assuming you bound a variable, such as MyVarName to a GUI control, by using the vMyVarName option, there could still be several reasons why MyVarName does not contain an up-to-date value
You forgot to submit the GUI form
Every time that you want to update your "bound" variables with fresh values from the GUI, you need to call Gui, Submit
To make things easier, you can create a wrapper function that calls Submit, such as SubmitForm(){ Gui, Submit, NoHide}, and then bind that function to be called on the control with gSubmitForm.
The wrong syntax was used
Remember v prefix - bind with vMyVarName, not MyVarName
There are multiple GUIs
If you have multiple GUIs floating around, you have tell AHK which GUI you are trying to get fresh values for when submitting.
If your GUI is named MainForm, you would get fresh values by first calling: Gui, MainForm:Submit
How to refer to named GUIs?
Add name: before the subcommand
Example: change Gui, Show to Gui, MyGui:Show
How to package as an EXE
Use right click and "compile script" option, or dedicated compiler program (%ProgramFiles%\AutoHotkey\Compiler\Ahk2Exe.exe)