Sign in to follow this  
Followers 0
grakker

GUICtrlRead issue

8 posts in this topic

OK, I've been away from AutoIt3 for several months (Away from Windows in general, yeah!) and I'm rusty. I use a bash script to create a series of flash cards for use in class. I wanted to create a little AutoIt3 script to do the same thing that I could use on the computers at work, and give to a couple of my fellow teachers.

Anyway, the script should open a Window with three input panes. They are ANSWER, QUESTION, and ANSWER. The top answer is the answer to the last question asked, just for reference. It defaults to the first card.

For some reason, the following script is reading $Question and $TempAnswer, but not $Answer. Please someone tell me what an idiot I am.

By the way, this is using Abiword, just change the "Abi" to "Word" and it should work the same. Thanks.

#include <GUIConstants.au3>
Opt ("WinTitleMatchMode", 2)

Global $Answer = "  "
Global $Question = "  "
Global $TempAnswer = "I have the first card."

While 1
   EnterAQ($TempAnswer)
   Looping()
WEnd


Func EnterAQ($Answer)
   
   GUICreate('Type "END" in ANSWER to exit', 320, 240, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES
   
   GUICtrlCreateLabel("Answer:", 10, 5)
   $Answer_C = GUICtrlCreateInput($TempAnswer, 10, 25, 300, 40)
   
   GUICtrlCreateLabel("Question:", 10, 70)
   $Question_C = GUICtrlCreateInput("", 10, 90, 300, 40)
   GUICtrlCreateLabel("Answer:", 10, 135)
   $TempAnswer_C = GUICtrlCreateInput("", 10, 150, 300, 40)
   
   $btn = GUICtrlCreateButton("Ok", 10, 200, 60, 20)
   
   GUISetState()
   
   $msg = 0
   While $msg <> $GUI_EVENT_CLOSE
      $msg = GUIGetMsg()
      Select
         Case $msg = $btn
            $Question = GUICtrlRead($Question_C)
            $Answer = GUICtrlRead($Answer_C)
            $TempAnswer = GUICtrlRead($TempAnswer_C)
            GUIDelete()
            ExitLoop
      EndSelect
   WEnd
   
   If $Answer = 'END' Then
      Exit
   EndIf
   
EndFunc  ;==>EnterAQ

Func Looping()
   
   WinActivate("Abi")
   WinWaitActive("Abi")
   Send($Answer)
   Send("Answer: {ENTER}" & $Answer & "{ENTER 2}" & "Question: {ENTER}" & $Question & "!i{ENTER}")
   WinWaitActive("Insert")
   Send("{ENTER}")
   
EndFunc  ;==>Looping

I know the code is ugly, as mine usually is. If anyone wants to point out my style gaffs, feel free I won't be offended.

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

OK, I've been away from AutoIt3 for several months (Away from Windows in general, yeah!) and I'm rusty.  I use a bash script to create a series of flash cards for use in class.  I wanted to create a little AutoIt3 script to do the same thing that I could use on the computers at work, and give to a couple of my fellow teachers.

Anyway, the script should open a Window with three input panes.  They are ANSWER, QUESTION, and ANSWER.  The top answer is the answer to the last question asked, just for reference.  It defaults to the first card.

For some reason, the following script is reading $Question and $TempAnswer, but not $Answer.  Please someone tell me what an idiot I am.

By the way, this is using Abiword, just change the "Abi" to "Word" and it should work the same.  Thanks.

#include <GUIConstants.au3>

Opt ("WinTitleMatchMode", 2)

Global $Answer = "  "

Global $Question = "  "

Global $TempAnswer = "I have the first card."

While 1

   EnterAQ($TempAnswer)

   Looping()

WEnd

Func EnterAQ($Answer)

  

   GUICreate('Type "END" in ANSWER to exit', 320, 240, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES

  

   GUICtrlCreateLabel("Answer:", 10, 5)

   $Answer_C = GUICtrlCreateInput($TempAnswer, 10, 25, 300, 40)

  

   GUICtrlCreateLabel("Question:", 10, 70)

   $Question_C = GUICtrlCreateInput("", 10, 90, 300, 40)

   GUICtrlCreateLabel("Answer:", 10, 135)

   $TempAnswer_C = GUICtrlCreateInput("", 10, 150, 300, 40)

  

   $btn = GUICtrlCreateButton("Ok", 10, 200, 60, 20)

  

   GUISetState()

  

   $msg = 0

   While $msg <> $GUI_EVENT_CLOSE

      $msg = GUIGetMsg()

      Select

         Case $msg = $btn

            $Question = GUICtrlRead($Question_C)

            $Answer = GUICtrlRead($Answer_C)

            $TempAnswer = GUICtrlRead($TempAnswer_C)

            GUIDelete()

            ExitLoop

      EndSelect

   WEnd

  

   If $Answer = 'END' Then

      Exit

   EndIf

   Return $answer

EndFunc  ;==>EnterAQ

Func Looping()

  

   WinActivate("Abi")

   WinWaitActive("Abi")

   Send($Answer)

   Send("Answer: {ENTER}" & $Answer & "{ENTER 2}" & "Question: {ENTER}" & $Question & "!i{ENTER}")

   WinWaitActive("Insert")

   Send("{ENTER}")

  

EndFunc  ;==>Looping

I know the code is ugly, as mine usually is.  If anyone wants to point out my style gaffs, feel free I won't be offended.

<{POST_SNAPBACK}>

not sure...but I think the func needs to "return" the value of $answer Edited by quaizywabbit

[u]Do more with pre-existing apps![/u]ANYGUIv2.8

Share this post


Link to post
Share on other sites

not sure...but I think the func needs to "return" the value of $answer

<{POST_SNAPBACK}>

Thanks, but no. $Answer is a global, so that doesn't matter, I believe. Aside from that, my other two variables which are initialized and read in the same blocks are coming out fine.

Share this post


Link to post
Share on other sites

For some reason, the following script is reading $Question and $TempAnswer, but not $Answer.  Please someone tell me what an idiot I am.

By the way, this is using Abiword, just change the "Abi" to "Word" and it should work the same.  Thanks.

Global $Answer = "  "
Global $TempAnswer = "I have the first card."

EnterAQ($TempAnswer)

Func EnterAQ($Answer)

<{POST_SNAPBACK}>

The global variable $Answer is not being set because you are using $Answer as a parameter in the EnterAQ function. Since the parameter is not ByRef, it becomes local within the function, and does not escape the function.

Food for thought:

1. Why call the function with one variable, and use another variable for the function parameter? Perhaps you just have the variables mixed-up?

2. Since you are using Globals, why have a parameter for the function?

3. Why use Return in the function if you are not capturing the returned value in the function call? And since the variables are global why return a value?


Phillip

Share this post


Link to post
Share on other sites

The global variable $Answer is not being set because you are using $Answer as a parameter in the EnterAQ function.  Since the parameter is not ByRef, it becomes local within the function, and does not escape the function.

Food for thought:

1.  Why call the function with one variable, and use another variable for the function parameter?  Perhaps you just have the variables mixed-up?

2.  Since you are using Globals, why have a parameter for the function?

3.  Why use Return in the function if you are not capturing the returned value in the function call?  And since the variables are global why return a value?

<{POST_SNAPBACK}>

The answer to all 3 = because I'm a pretty crappy programmer. Thank you for the answer, obvious after fixing it.

Share this post


Link to post
Share on other sites

If $Answer = 'END' Then

Shouldn't that be

If $Answer = "END" Then

.

Share this post


Link to post
Share on other sites

The answer to all 3 = because I'm a pretty crappy programmer.  Thank you for the answer, obvious after fixing it.

<{POST_SNAPBACK}>

Oh, okay! That clarifies things!

And, you're welcome. I'm happy it helped.


Phillip

Share this post


Link to post
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
Sign in to follow this  
Followers 0