Switch <ex1> Case <ex2>[:] <blk> [...] [Default[:] <blk>] EndSwitch |
The Switch
statement can be used to compare the expression specified in
ex1
with all other expressions specified after the Case
identifiers.
You can use as many Case
statements as you want but there must be at least
one Case
identifier in your Switch
statement. If the expression after a
Case
matches ex1
, the code after that Case
statement is
executed. After the execution, Hollywood continues with your program after
the EndSwitch
statement. If none of the Case
expressions match ex1
, the
code following the Default
statement will be executed. Note that using the
Default
statement is optional. If you do not need it, you do not have to
use it. If you do use it, however, it always needs to be the last statement
of the Switch
statement. It isn't allowed to have additional Case
statements
after the Default
statement. The colon after the Case
and Default
statements
is optional too.
Please note that the expression following the Case
statement must always
be constant. You cannot use variables or function return values here. Also
you must not mix variable types in this statement: If ex1
is a string,
all other expressions must be strings too. If ex1
is a number, all other
expressions must be numbers as well.
Here is an example:
Switch x Case 1: DebugPrint("x = 1") Case 2: DebugPrint("x = 2") Default: DebugPrint("x <> 1 And x <> 2") EndSwitch |
The above code looks at the variable x
and enters the first Case
statement
if x
is one. The second Case
statement is entered if x
is 2. Otherwise the
Default
statement is entered.
Every Switch-Case statement can also be written as a normal If statement. The example from above would look like the following then:
If x = 1 DebugPrint("x = 1") ElseIf x = 2 DebugPrint("x = 2") Else DebugPrint("x <> 1 And x <> 2") EndIf |
C and Java programmers should note that Hollywood's Switch
statement
does not automatically fall through to the next Case
block after
reaching the end of the previous Case
block. Instead, Hollywood will
automatically jump to the end of the statement after a Case
block has
been executed. Thus, you do not have to use Break at the end of a Case
block either. But you can use it earlier to exit from the Switch
statement.
It is, however, possible to manually force a fall through using the FallThrough
statement.
Whenever Hollywood encounters this statement inside a Case
block, it
will fall through to the next Case
block (or the Default
block), i.e. it will
jump directly into this block. Therefore, FallThrough
may only be used if
there is a Case
or Default
block following. Otherwise an error will be
generated. Since the Default
block must always be the last block of a
Switch
statement, it is not allowed to use FallThrough
in the Default
block because there is no subsequent block to fall through to.
Here is an example:
Switch msg.action Case "OnKeyDown": FallThrough Case "OnKeyUp": DebugPrint("Key event:", msg.key) Default: DebugPrint("Other event") EndSwitch |
The code above will print the key that has been pressed in case msg.action
is OnKeyDown
or OnKeyUp
. If msg.action
is OnKeyDown
, the FallThrough
statement is used to jump into the OnKeyUp
block.
Alternatively, the FallThrough
statement can also be placed directly after
the expression after the Switch
statement. In that case, each Case
block will
automatically fall through to the next one, unless there is a Break
statement
forbidding falling through.
Here is an example:
Switch msg.action FallThrough Case "OnKeyDown": Case "OnKeyUp": DebugPrint("Key event:", msg.key) Break Case "OnMouseDown": Case "OnMouseUp": DebugPrint("Left mouse event") Break Case "OnRightMouseDown": Case "OnRightMouseUp": DebugPrint("Right mouse event") Break Default: DebugPrint("Other event") EndSwitch |
The code above uses FallThrough
globally to use the same code for OnKeyDown
and OnKeyUp
,
and for OnMouseDown
and OnMouseUp
, and for OnRightMouseDown
and OnRightMouseUp
. The
Break
statements are necessary because otherwise Hollywood would fall through all the
way to the very last line of code in the Default
block.