Coding Problem

BlitzPlus Forums/BlitzPlus Beginners Area/Coding Problem

Siopses(Posted 2007) [#1]
I have been screwing around with this function far too long,
I've used it in other programs and in this one the problem
is that it says "End Select without Select". Here's my code
Function StartEruP()
MainMenu=CreateWindow("Main Menu",300,300,400,500,main,15)
Ev=WaitEvent()
Es=EventSource()
Repeat
Select Es
Case MainMenu
If Ev=$803 Then
Blah=Proceed("Do you really want to quit?")
If Blah=1 Then
End 
Else
If Blah<>1 Then
Notify("Find out what you want next time")
EndIf
EndIf
End Select 
Until KeyDown(1)
End 
End Function
StartERuP()
End 

On the other program it works, but when ever I attempt
to move the window it moves, but the program starts to
go on strike.


CS_TBL(Posted 2007) [#2]
Arf, my eyes :S .. first indent your code, then ask. Chances are that once you've indented it you'll see it yourself already.


CS_TBL(Posted 2007) [#3]
I mean, I took 1 minute to indent your code, and the mistake became as clear as the night. Now it's your turn.. :P


Siopses(Posted 2007) [#4]
Function StartEruP()
MainMenu=CreateWindow("Main Menu,300,300,400,500,main,15)                  
Ev=WaitEvent()
Es=EventSource()
Repeat
       Select Es
         Case MainMenu
         If Ev=$803 Then
         Blah=Proceed("Do you really want to quit?")
         If Blah=1 Then
         End 
        Else
        If Blah<>1 Then
        Notify("Find out what you want next time")
        EndIf
        EndIf
        End Select 
Until KeyDown(1)
End 
End Function
StartERuP()
End

You mean something like this?
I seriously have no idea not even an inkling to what you speak of.
Oh, and by the way my other program uses the same function-and it works, like I said before.


Andy_A(Posted 2007) [#5]
I would suggest you take a look at the code posted in the code archives.

Most entries (not all) are properly indented for clarity. Not only for the person who posted the code but for anyone else that looks at that code. Code readability is of utmost importance when communicating via code snippets as you have done to start this thread.

Don't take this as a rant or flame, just letting you know that others will expect you to present code in a readable form before they will be willing to help you.


b32(Posted 2007) [#6]
It needs an extra End If after the line: Notify("find out what you want next time").


CS_TBL(Posted 2007) [#7]
Ok, crashcourse on indenting:

In Blitz there are single commands, and commands that define a scope. Examples of a single command are Print, End, Plot, Rect, Line, LoadImage etc.
Examples of scope commands are:
For-Next
If(-Else)-Endif
Select-End Select
Function-End Function

etc.

Key rule: you should indent the scope/area of each scope-command. As an extra bonus you might want to have an empty line around scopes.

Based on personal taste: I also indent drawing/actions on a canvas or image between changing the drawing buffer and the flipping, but that's personal.

One might even indent creating menuitems in a menu.

As long as things belong together for a limited area in your code, you may indent them.

So, to apply this on your function:
Function StartEruP()

  MainMenu=CreateWindow("Main Menu",300,300,400,500,main,15)

  Ev=WaitEvent()
  Es=EventSource()

  Repeat

    Select Es

      Case MainMenu

        If Ev=$803 Then

          Blah=Proceed("Do you really want to quit?")

          If Blah=1 Then
            End 
          Else
            If Blah<>1 Then
              Notify("Find out what you want next time")
            (EndIf ; according to b32)
          EndIf

        EndIf

    End Select 

  Until KeyDown(1)

  End 

End Function



StartERuP()
End 



and with dots to show how an end-scope matches a begin-scope:

Function StartEruP()
.
. MainMenu=CreateWindow("Main Menu",300,300,400,500,main,15)
.
. Ev=WaitEvent()
. Es=EventSource()
.
. Repeat
. :
. : Select Es
. : .
. : . Case MainMenu
. : .
. : .   If Ev=$803 Then
. : .   :
. : .   : Blah=Proceed("Do you really want to quit?")
. : .   : 
. : .   : If Blah=1 Then
. : .   : . End 
. : .   : Else
. : .   : . If Blah<>1 Then
. : .   : . : Notify("Find out what you want next time")
. : .   : . (EndIf ; according to b32)
. : .   : EndIf
. : .   :
. : .   EndIf
. : .
. : End Select 
. :
. Until KeyDown(1)
.
. End 
.
End Function



StartERuP()
End 


Note that the Case command defines a scope, but since it doesn't have an 'End Case' command, I couldn't really draw dots here, or at least: it would look a bit weird compared to the rest.

btw, while we're checking code anyway:

Function StartEruP()

  MainMenu=CreateWindow("Main Menu",300,300,400,500,main,15)

  Ev=WaitEvent()
  Es=EventSource()

  Repeat

    Select Es

      Case MainMenu

        If Ev=$803 Then

          If Proceed("Do you really want to quit?") Then End 
          Notify("Find out what you want next time")

        EndIf

    End Select 

  Until KeyDown(1)

  End 

End Function


Wiped a few lines. If your blah would've been 1 then it would've ended, if not it would notify, and you wouldn't need an 'Else' nor would you need to check on blah<>1 because it HAS to be <>1 in order to get at the line in the first place. (if it was 1, then the program would've ended!)
It's like a factory where they make blue and red paint. At one point/junction one sends blue paint to hall 1 and red paint to hall 2, would it be practical to have other employees standing in halls 1 & 2 to check whether the colors are correctly chosen, after it was already correctly re-routed at that first junction?


Siopses(Posted 2007) [#8]
I think I did that so it would be more readable and understandable for me; or some other reason. Anyway,
thanks for the help guy's. Now I'm back to were I started
the window will move but the function will not work. Test
it out yourselves. Also, when I do all these ridiculous dot
formations it says I need an 'End Function'.
Here's my code, it doesn't work and it looks absurd.
Function StartEruP()
.  MainMenu=CreateWindow("Main Menu",300,300,400,500,main,15)
.  Ev=WaitEvent()
.  Es=EventSource()
.    Repeat
.     .  Select Es
.     .  .         Case MainMenu
.     .  .           If Ev=$803 Then
.     .  .            .            Blah=Proceed("Do you really want to quit?")
.     .  .            .   If Blah=1 Then
.     .  .            .   .                    End 
.     .  .            .   .                       Else
.     .  .            .   . If Blah<>1 Then
.     .  .            .   . .              Notify("Find out what you want next time")
.     .  .          EndIf . .
.     .  .       EndIf..... .   
.     .  .  EndIf............ 
.     . End Select 
.    Until KeyDown(1)
End Function
StartERuP()
End 


This only happened when I used indenting.


CS_TBL(Posted 2007) [#9]
Of course those dots aren't meant for the actual source eh.., they're purely to visualize the idea of scopes here on the forum.


Siopses(Posted 2007) [#10]
Oh... oops sorry take a look though, test it it doesn't work
correctly- the function I mean.


CS_TBL(Posted 2007) [#11]
Dunno, I dunno what your intentions are for this code, but I'd flush it. I'm also not much of a fan of using KeyDown().

Do you want one application window, or do you want a popup window within another application?

For mainloops, why not use this:
window=CreateWindow("..",0,0,640,480)

Repeat
	WaitEvent()
	
	If EventID()=$803 And EventSource()=window ; if you only have one window in total, this eventsource check is not required
		If Proceed("sure?")	quit=1 Else Notify "oO"
	EndIf
	
Until quit
End



tonyg(Posted 2007) [#12]
Shouldn't you be checking for events within the loop?


Siopses(Posted 2007) [#13]
I'm trying to make a main menu for a program I'm making.
The main menu will have buttons to press to acess the
program. Once a button is pressed the main menu will
disapear and the program will come up to show what ever
the user wanted. For example, if the user pressed the 'create' button then it would loop to the create part of the
application. I'm just not sure how to loop it.


CS_TBL(Posted 2007) [#14]
well, as tonyg mentioned: you need to include the Waitevent within the loop in which you check for events.

Your idea sounds like a popup btw.

In your main source it would look like:
choice=RequestMenu()

Select choice
  Case 0
    DoThis
  Case 1
    DoThat
  Case 2
    DoM33p
  Case 3
    DoM00p
  Case 4
    GoGetAMacBurger
  Case 5 ' quit
    End
End Select

Function DoThis()
End Function

..etc.


This RequestMenu() function could even be a function with one arguement: a string containing all menu items, semi-colon seperated.


b32(Posted 2007) [#15]

Function StartEruP()
.  MainMenu=CreateWindow("Main Menu",300,300,400,500,main,15)
.  Ev=WaitEvent()
.  Es=EventSource()
.    Repeat
.     .  Select Es
.     .  .         Case MainMenu
.     .  .           If Ev=$803 Then
.     .  .            .            Blah=Proceed("Do you really want to quit?")
.     .  .            .   If Blah=1 Then
.     .  .            .   .                    End 
.     .  .            .   .                       Else
.     .  .            .   . If Blah<>1 Then
.     .  .            .   . .              Notify("Find out what you want next time")
.     .  .          EndIf . .
.     .  .       EndIf..... .   
.     .  .  EndIf............ 
.     . End Select 
.    Until KeyDown(1)
End Function
StartERuP()
End 



"EndIf" of "End If" (the same) closes only the last If block, so the lines you were drawing here aren't correct.

If (test1) Then
If (test2) Then
If (test3) Then
End If ;closes If (test3)
End If ;closes If (test2)
End If ;closes If (test1)

Indention is only handy to remind yourself what If block the EndIf is closing. The PC doesn't respond to indention.


Siopses(Posted 2007) [#16]
Thanks for all the help