Android Tutorial Converting VB6 to B4A

Below is a table listing features of Visual Basic 6 and their equivalents in B4A.

If you find errors or wish to add other features, post a reply here to have your input integrated into the table (which will be updated as needed).

B4X:
This file is primarily for reference when converting Visual Basic 6 source code to B4A.
  VB6                  B4A
  ===                  ===
controls            Views  (button, edittext, label, etc.)
In the VB6 code window, the top left drop-down list contains all
the controls you have placed in the current form and the right list
contains all the events for each control.  The equivalent in B4A can
be found by clicking on Designer - Tools - Generate Members. Once
you have created Subs in the program coding window, the tab "Modules"
on the right side will list each of the Subs.
In B4A, you start by typing "Sub [viewName]" followed by a space and
follow the prompts, pressing Enter after each selection until B4A
ends with "EventName" highlighted. This is where you would type in
the name of the Sub.
editBox = string      editBox.Text = string
In VB6, you can leave ".Text" off the names of controls when assigning
text to them, but this is not allowed in B4A.

Dim/ReDim:
---------
Dim Array(n)        Dim Array(n+1)
While "n" is the last index number in VB6, it indicates the number
of array elements when used in B4A. For example, to Dim an array
with 0-32 elements in VB6, you would say Dim A(32), while to convert
this to B4A, you need to change it to Dim A(33), yet index #33 is
never used (doing so would cause an out-of-range error).
ReDim Preserve      Use a List.
ReDim Array()       Dim Array(n+1) -- to clear an array, just Dim it again.
[Dim a Int: Dim b as Boolean]
If Not b Then...    If Not(b) Then...
If b Then...        same
If b = True Then    same
If a Then...        If a > 0 Then...
                       B4A does not treat any non-zero value as True like VB6.
a = a + b           If b = True Then a = a - 1
                       Boolean's value cannot be used in a math function in B4A.
Global Const x=1    B4A does not have a Global Const function.
                       In Sub Globals, you can say   Dim x as Int: x = 1
                       but x is not a constant (it's value can be changed).

Loops, If-Then, Select Case:
---------------------------
Do [Until/While]    same
Loop [Until/While]  Loop  [Until/While not allowed.]
For - Next          same
For i... - Next i   The loop variable (i) is not allowed with Next.
Exit Do/For         Exit
If - Then - Else    same, except VB's ElseIf is "Else If" in B4A; ditto EndIf
   ---              Continue [Skips to Next in For-Next loop]
For i = 1 to 6        For i = 1 to 6
  If i <> 4 Then        If i = 4 Then Continue
    ...code...          ...code...
  End If                ...
Next                  Next
Select Case [expr]  Select [value]

Colors:
------
L1.BackColor =      L1.Color = Colors.Red
    vbRed
L1.ForeColor =      L1.TextColor = Colors.Black
    vbBlack

Calling a sub:
-------------
SubName x, y        SubName(x, y)
Sub SubName()       Sub SubName() As Int/String/etc. -- a Global variable cannot be
                       a parameter, so say that "player" is a Global variable, you
                       cannot say: PlayCard(player). Instead you have to say:
                       i=player: PlayCard(i)
Function FName()    Sub FName() As [var.type]
   As [var.type]       In B4A, any Sub can be used like a Function by adding a
                       variable type such as
                          Sub CheckX(x As Int) As Boolean
                             ...optional code...
                             If x = [desired value] Then Return True
                             ...optional code...
                          End Sub
                       If no Return is given, then zero/False/"" is returned, but
                       the IDE will give a warning, so it is better to Return 0/False/"".
                       The calling code does not have to reference the returned
                       value, so that while "If CheckX(x) = True..." is valid,
                       so is just "CheckX(x)"
Exit Sub            Return
Exit Function       Return [value]

General:
-------
CInt
DoEvents            same, except that Erel says:
                    "Calling DoEvents in a loop consumes a lot of resources and
                    it doesn't allow the system to process all waiting messages
                    properly." This was in response to my pointing out that while
                    in a Do Loop with DoEvents in it, WebView could not be loaded
                    or if loaded, would not process a hyperlink click. And Agraham
                    says: "Looping is bad practice on mobile devices. The CPU will
                    be constantly executing code and using battery power as the
                    code will never get back to the OS idle loop where the hardware
                    power saving measures are invoked."
Format()            NumberFormat & NumberFormat2 [see documentation]
InputBox($)         InputList(Items as List, Title, CheckedItem as Int) as Int
can list multiple       Shows list of choices with radio buttons. Returns index.
choices for which       CheckedItem is the default.
the user enters a   InputMultiList(Items as List, Title) As List
number to choose.       User can select multiple items via checkboxes.
                        Returns list with the indexes of boxes checked.
MsgBox "text"       MsgBox("text", "title")
i=MsgBox()          MsgBox2(Message, Title, Positive, Cancel, Negative, Icon) as Int
                        Displays three buttons with text to display for buttons
                           (Positive, Cancel, Negative)
                        Icon is displayed near the title and is specified like:
                           LoadBitmap(File.DirAssets, "[filename].gif")
   ---              ToastMessageShow(text, b) [where b=True for long duration]
Following is a Sub from Pfriemler which acts like InputBox:
Sub InputBox(Prompt As String, Title As String, Default As String, Hint As String) As String
    Dim Id As InputDialog
    Id.Hint = Hint
    Id.Input = Default
    ret = Id.Show(Prompt, Title, "OK", "","Abbrechen", Null)
    If ret = -1 Then Return Id.Input Else Return ""
End Sub

Rnd is < 1          Rnd(min, max) is integer >= min to < max
Rnd(-#)             RndSeed(#) - causes Rnd to generate the same random number series
                                 for the same # entered.
Randomize           Not needed in B4A to randomize Rnd.
Round(n)            same, or Round2(n, x) where x=number of decimal places

i = Val(string)     If IsNumber(string) Then i = string Else i = 0 --
                    An attempt to use i=string "throws an exception" if the string is
                    not numbers, even if the string starts with numbers. For example,
                    t = "10:45"
                    i = Val(t) sets i=10 but causes an error in B4A.
                    Instead,
                    i = t.SubString2(0, 2) = 10
control.SetFocus    view.RequestFocus
n / 0 : error       n / 0 = 2147483647 -- B4A does not "throw an exception" for
                       division by 0, but it does return 2147483647 no matter
                       what the value of "n" is.
x = Shell("...")    See "Intent". This is not a complete replacement, but allows
                       code such as the following from the B4A forum (by Erel):
                    Dim pi As PhoneIntents
                    StartActivity (pi.OpenBrowser("[URL]file:///sdcard/yourfile.html[/URL]"))
t = Timer           t = DateTime.Now ' Ticks are number of milliseconds since 1-1-70

TabIndex:
--------
In VB6, TabIndex can be set to control the order in which controls get focus
when Tab is pressed. According to Erel, in B4A:
   "Android handles the sequence according to their position. You can set
    EditText.ForceDone = True in all your EditTexts. Then catch the
    EditText_EnterPressed event and explicitly set the focus to the next
    view (with EditText.RequestFocus)."

Setting Label Transparency:
--------------------------
Properties - Back Style        Designer - Drawable - Alpha

Constants:
---------
""                  Quote = Chr$(34)
vbCr                CRLF = Chr$(10)
vbCrLf              none

String "Members":
----------------
VB6 uses a character position pointer starting with 1.
B4A uses a character Index pointer starting with 0.
        VB6                        B4A
Mid$("abcde", 1, 1) = "a" = letter array index 0 -- "a" = "abcde".CharAt(0)
Mid$("abcde", 2, 1) = "b" = letter array index 1
Mid$("abcde", 3, 1) = "c" = letter array index 2
Mid$("abcde", 4, 1) = "d" = letter array index 3
Mid$("abcde", 5, 1) = "e" = letter array index 4
     VB6                               B4A
     ===                               ===
Mid$(text, n, 1)                    text.CharAt(n-1)
Mid$(text, n)                       text.SubString(n-1)
Mid$(text, n, x) [x=length wanted]  text.SubString2(n-1, n+x-1) [n+x-1=end position]
Mid$(text, n, x) = text2            text = text.SubString2(0, n-2) & _
                                           text2.SubString2(0, x-1) & _
                                           text.SubString(n-1 + z)  where...
                                             z = Min(x, text2.length)
Left$(text, n)  [n=num.of chars.]   text.SubString2(0, n)
Right$(text, n)                     text.SubString(text.Length - n + 1)
If a$ = b$...                       If a.CompareTo(b)...
If Right$(text, n) = text2...       If text.EndsWith(text2)...
If Left$(text, n) = text2...        If text.StartsWith(text2)...
If Lcase$(text) = Lcase$(text2)...  If text.EqualsIgnoreCase(text2)...
Following are some subs from NeoTechni which take the place of VB6
string functions:
Sub Left(Text As String, Length As Long)As String
   If length>text.Length Then length=text.Length
   Return text.SubString2(0, length)
End Sub
Sub Right(Text As String, Length As Long) As String
   If length>text.Length Then length=text.Length
   Return text.SubString(text.Length-length)
End Sub
Sub Mid(Text As String, Start As Int, Length As Int) As String
   Return text.SubString2(start-1,start+length-1)
End Sub
Sub Split(Text As String, Delimiter As String) As String()
   Return Regex.Split(delimter,text)
End Sub

x = Len(text)                       x = text.Length
text = Replace(text, str, str2)     text.Replace(str, str2)
Lcase(text)                         text.ToLowerCase
Ucase(text)                         text.ToUpperCase
Trim(text)                          text.Trim
  (no LTrim or RTrim in B4A)
Instr(text, string)                 text.IndexOf(string)
Instr(int, text, string)            text.IndexOf2(string, int)
                                       Returns -1 if not found.
                                       Returns char. index, not position.
                                       Starts search at "int".
InStrRev(text, str, start, case)    text.LastIndexOf(string)
  Searches from end of string,      text.LastIndexOf(string, start)
    optionally from "start".           Cannot specify case sensitivity.
  case = 0 = case-sensitive
  case = 0 = case-insensitive
                                    A boolean form of IndexOf is -
                                    If text.Contains(string) = True Then...
If Lcase$(x) = Lcase$(y)...         If x.EqualsIgnoreCase(y)...
text = Left$(text, n) & s &         text.Insert(n, s)
          Right$(Text, y)
Asc(s) [where s = a character]      same

Error Trapping:
--------------
VB6:
===
Sub SomeSub
   On [Local] Error GoTo ErrorTrap
      ...some code...
   On Error GoTo 0 [optional end to error trapping]
   ...optional additional code...
   Exit Sub [to avoid executing ErrorTrap code]
ErrorTrap:
   ...optional code for error correction...
   Resume [optional: "Resume Next" or "Resume [line label]".
End Sub
B4A:
===
Sub SomeSub
   Try
      ...some code...
   Catch [only executes if error above]
      Log(LastException) [optional]
      ...optional code for error correction...
   End Try
   ...optional additional code...
End Sub
WIth B4A, if you get an error caught in the middle of a large subroutine, you can
NOT make a correction and resume within the code you were executing. Only the code
in "Catch" gets executed, plus any code following "End Try".
Try-Catch in place of GoTo:
--------------------------
Try-Catch can be used as a substitute for GoTo [line label] for forward, but not
backward, jumps. It cannot be used to replace GoSub, for which B4A has no equivalent.
Start the code with "Try" and replace the [line label] with "Catch".
Replace "GoTo [line label]" with code which will create an exception, which causes
a jump to "Catch", such as OpenInput("bad path", "bad filename").

"Immediate Window" vs "Logs" Tab
--------------------------------
Comments, variable values, etc., can be displayed in VB6's Immediate
Window by entering into the code "Debug.Print ...".
In the B4A environment, the Logs tab on the right side of the IDE is a
way to show the values of variables, etc., while the code is running.
Both VB6 and (now) B4A allow single-stepping through the code while it
is running and viewing the values of variables. VB6 also allows changing
the value of variables, changing the code, jumping to other lines from
the current line, etc. Because B4A runs on a PC while the app runs on
a separate device, B4A is currently unable to duplicate all of these
VB6 debug features.
 
Last edited:

klaus

Expert
Licensed User
Longtime User
If you look at the documentation:

Not(Value As Boolean)
Inverts the value of the given boolean.
Returns : Boolean

Bit.Not(N As Int)
Returns the bitwise complement of the given value.
Returns : Int

To get help on functions and libraries, do you know agrahams program B4A XML file help viewer.
Or Vaders program Help documentation - B4a Object Browser.

Button1_Click
DoorOpen = NOT(DoorOpen)
is that correct?
Yes !
 

fabio.guerrazzi

Member
Licensed User
Longtime User
Below is a table listing features of Visual Basic 6 and their equivalents in B4A.

If you find errors or wish to add other features, post a reply here to have your input integrated into the table (which will be updated as needed).

B4X:
This file is primarily for reference when converting Visual Basic 6 source code to B4A.
  VB6                  B4A
  ===                  ===
controls            Views  (button, edittext, label, etc.)
In the VB6 code window, the top left drop-down list contains all
the controls you have placed in the current form and the right list
contains all the events for each control.  The equivalent in B4A can
be found by clicking on Designer - Tools - Generate Members. Once
you have created Subs in the program coding window, the tab "Modules"
on the right side will list each of the Subs.
In B4A, you start by typing "Sub [viewName]" followed by a space and
follow the prompts, pressing Enter after each selection until B4A
ends with "EventName" highlighted. This is where you would type in
the name of the Sub.
editBox = string      editBox.Text = string
In VB6, you can leave ".Text" off the names of controls when assigning
text to them, but this is not allowed in B4A.

Declaring record Type
 VB6                                                        B4A
---------
Type myRec                                             Type myRec (a as int, b as int,..,..)        
   Public a as Int                                        ok
   Public b as Int                                        ok
   Public c as OtherRecordType                     ok
   Public d as OtherClass                              ok
   Public arr(10) as Int                                 Dim (clear) at runtime is not allowed 
End TYpe

You can reference any data object/record type or class but arrays are not resizable at runtime

----
Classes and pointers references
----

If you have a class MyClass with 2 members, var1 as int, var2 as string

Dim a,b as MyClass

b=a ' binds the reference, b will be a, not a clone

b.var1 = a.var1
b.var2 = a.var2  ' this is a righe copy




Dim/ReDim:
---------
Dim Array(n)        Dim Array(n+1)
While "n" is the last index number in VB6, it indicates the number
of array elements when used in B4A. For example, to Dim an array
with 0-32 elements in VB6, you would say Dim A(32), while to convert
this to B4A, you need to change it to Dim A(33), yet index #33 is
never used (doing so would cause an out-of-range error).
ReDim Preserve      Use a List.

Using list doesn't means "if you need to redim array use the list object instead", because the performances and accessibility are very deprecable.
Keep using array but redim it controlling overflow as shown below

Dim MaxObj as int = 4
Dim oList(3) as Entity

Public Sub AddObj(e as Entity)
  If nObj >=oList.Size then ReallocateMemoryObject
  nObj = nObj + 1 
  oList(nObj)=e

End Sub

Private Sub ReallocateMemoryObject
  ' Alloca l'array del doppio della sua dimensione
  Dim L As List
  L.Initialize
  L.AddAll(oList)
   
  MaxObj = MaxObj * 2 ' every reallocation increase to W size
  Dim oList(MaxObj + 1) As Entity
   
  Dim v As Entity
  v.Initialize
  For i = 1 To L.Size
  oList(i - 1).Initialize
    v=L.Get(i - 1)
    oList(i - 1)=v
  Next

  ' dispose temp objects
  L.Clear
  L=Null
  v=Null

End Sub


ReDim Array()       Dim Array(n+1) -- to clear an array, just Dim it again.
[Dim a Int: Dim b as Boolean]
If Not b Then...    If Not(b) Then...
If b Then...        same
If b = True Then    same
If a Then...        If a > 0 Then...
                       B4A does not treat any non-zero value as True like VB6.
a = a + b           If b = True Then a = a - 1
                       Boolean's value cannot be used in a math function in B4A.
Global Const x=1    B4A does not have a Global Const function.
                       In Sub Globals, you can say   Dim x as Int: x = 1
                       but x is not a constant (it's value can be changed).

Loops, If-Then, Select Case:
---------------------------
Do [Until/While]    same
Loop [Until/While]  Loop  [Until/While not allowed.]
For - Next          same
For i... - Next i   The loop variable (i) is not allowed with Next.
Exit Do/For         Exit
If - Then - Else    same, except VB's ElseIf is "Else If" in B4A; ditto EndIf
   ---              Continue [Skips to Next in For-Next loop]
For i = 1 to 6        For i = 1 to 6
  If i <> 4 Then        If i = 4 Then Continue
    ...code...          ...code...
  End If                ...
Next                  Next
Select Case [expr]  Select [value]

Case <value1>,<value2>     Same
Case <value1> To <Value2> unsupported in B4A, use comma separated
Case <value>:statement     Same

Colors:
------
L1.BackColor =      L1.Color = Colors.Red
    vbRed
L1.ForeColor =      L1.TextColor = Colors.Black
    vbBlack

Calling a sub:
-------------
SubName x, y        SubName(x, y)
Sub SubName()       Sub SubName() As Int/String/etc. -- a Global variable cannot be
                       a parameter, so say that "player" is a Global variable, you
                       cannot say: PlayCard(player). Instead you have to say:
                       i=player: PlayCard(i)
Function FName()    Sub FName() As [var.type]
   As [var.type]       In B4A, any Sub can be used like a Function by adding a
                       variable type such as
                          Sub CheckX(x As Int) As Boolean
                             ...optional code...
                             If x = [desired value] Then Return True
                             ...optional code...
                          End Sub
                       If no Return is given, then zero/False/"" is returned, but
                       the IDE will give a warning, so it is better to Return 0/False/"".
                       The calling code does not have to reference the returned
                       value, so that while "If CheckX(x) = True..." is valid,
                       so is just "CheckX(x)"
Exit Sub            Return
Exit Function       Return [value]

General:
-------
CInt
DoEvents            same, except that Erel says:
                    "Calling DoEvents in a loop consumes a lot of resources and
                    it doesn't allow the system to process all waiting messages
                    properly." This was in response to my pointing out that while
                    in a Do Loop with DoEvents in it, WebView could not be loaded
                    or if loaded, would not process a hyperlink click. And Agraham
                    says: "Looping is bad practice on mobile devices. The CPU will
                    be constantly executing code and using battery power as the
                    code will never get back to the OS idle loop where the hardware
                    power saving measures are invoked."
Format()            NumberFormat & NumberFormat2 [see documentation]
InputBox($)         InputList(Items as List, Title, CheckedItem as Int) as Int
can list multiple       Shows list of choices with radio buttons. Returns index.
choices for which       CheckedItem is the default.
the user enters a   InputMultiList(Items as List, Title) As List
number to choose.       User can select multiple items via checkboxes.
                        Returns list with the indexes of boxes checked.
MsgBox "text"       MsgBox("text", "title")
i=MsgBox()          MsgBox2(Message, Title, Positive, Cancel, Negative, Icon) as Int
                        Displays three buttons with text to display for buttons
                           (Positive, Cancel, Negative)
                        Icon is displayed near the title and is specified like:
                           LoadBitmap(File.DirAssets, "[filename].gif")
   ---              ToastMessageShow(text, b) [where b=True for long duration]
Following is a Sub from Pfriemler which acts like InputBox:
Sub InputBox(Prompt As String, Title As String, Default As String, Hint As String) As String
    Dim Id As InputDialog
    Id.Hint = Hint
    Id.Input = Default
    ret = Id.Show(Prompt, Title, "OK", "","Abbrechen", Null)
    If ret = -1 Then Return Id.Input Else Return ""
End Sub

Rnd is < 1          Rnd(min, max) is integer >= min to < max
Rnd(-#)             RndSeed(#) - causes Rnd to generate the same random number series
                                 for the same # entered.
Randomize           Not needed in B4A to randomize Rnd.
Round(n)            same, or Round2(n, x) where x=number of decimal places

i = Val(string)     If IsNumber(string) Then i = string Else i = 0 --
                    An attempt to use i=string "throws an exception" if the string is
                    not numbers, even if the string starts with numbers. For example,
                    t = "10:45"
                    i = Val(t) sets i=10 but causes an error in B4A.
                    Instead,
                    i = t.SubString2(0, 2) = 10
control.SetFocus    view.RequestFocus
n / 0 : error       n / 0 = 2147483647 -- B4A does not "throw an exception" for
                       division by 0, but it does return 2147483647 no matter
                       what the value of "n" is.
x = Shell("...")    See "Intent". This is not a complete replacement, but allows
                       code such as the following from the B4A forum (by Erel):
                    Dim pi As PhoneIntents
                    StartActivity (pi.OpenBrowser("[URL]file:///sdcard/yourfile.html[/URL]"))
t = Timer           t = DateTime.Now ' Ticks are number of milliseconds since 1-1-70

TabIndex:
--------
In VB6, TabIndex can be set to control the order in which controls get focus
when Tab is pressed. According to Erel, in B4A:
   "Android handles the sequence according to their position. You can set
    EditText.ForceDone = True in all your EditTexts. Then catch the
    EditText_EnterPressed event and explicitly set the focus to the next
    view (with EditText.RequestFocus)."

Setting Label Transparency:
--------------------------
Properties - Back Style        Designer - Drawable - Alpha

Constants:
---------
""                  Quote = Chr$(34)
vbCr                CRLF = Chr$(10)
vbCrLf              none

String "Members":
----------------
VB6 uses a character position pointer starting with 1.
B4A uses a character Index pointer starting with 0.
        VB6                        B4A
Mid$("abcde", 1, 1) = "a" = letter array index 0 -- "a" = "abcde".CharAt(0)
Mid$("abcde", 2, 1) = "b" = letter array index 1
Mid$("abcde", 3, 1) = "c" = letter array index 2
Mid$("abcde", 4, 1) = "d" = letter array index 3
Mid$("abcde", 5, 1) = "e" = letter array index 4
     VB6                               B4A
     ===                               ===
Mid$(text, n, 1)                    text.CharAt(n-1)
Mid$(text, n)                       text.SubString(n-1)
Mid$(text, n, x) [x=length wanted]  text.SubString2(n-1, n+x-1) [n+x-1=end position]
Mid$(text, n, x) = text2            text = text.SubString2(0, n-2) & _
                                           text2.SubString2(0, x-1) & _
                                           text.SubString(n-1 + z)  where...
                                             z = Min(x, text2.length)
Left$(text, n)  [n=num.of chars.]   text.SubString2(0, n)
Right$(text, n)                     text.SubString(text.Length - n + 1)
If a$ = b$...                       If a.CompareTo(b)...
If Right$(text, n) = text2...       If text.EndsWith(text2)...
If Left$(text, n) = text2...        If text.StartsWith(text2)...
If Lcase$(text) = Lcase$(text2)...  If text.EqualsIgnoreCase(text2)...
Following are some subs from NeoTechni which take the place of VB6
string functions:
Sub Left(Text As String, Length As Long)As String
   If length>text.Length Then length=text.Length
   Return text.SubString2(0, length)
End Sub
Sub Right(Text As String, Length As Long) As String
   If length>text.Length Then length=text.Length
   Return text.SubString(text.Length-length)
End Sub
Sub Mid(Text As String, Start As Int, Length As Int) As String
   Return text.SubString2(start-1,start+length-1)
End Sub
Sub Split(Text As String, Delimiter As String) As String()
   Return Regex.Split(delimter,text)
End Sub

x = Len(text)                       x = text.Length
text = Replace(text, str, str2)     text.Replace(str, str2)
Lcase(text)                         text.ToLowerCase
Ucase(text)                         text.ToUpperCase
Trim(text)                          text.Trim
  (no LTrim or RTrim in B4A)
Instr(text, string)                 text.IndexOf(string)
Instr(int, text, string)            text.IndexOf2(string, int)
                                       Returns -1 if not found.
                                       Returns char. index, not position.
                                       Starts search at "int".
InStrRev(text, str, start, case)    text.LastIndexOf(string)
  Searches from end of string,      text.LastIndexOf(string, start)
    optionally from "start".           Cannot specify case sensitivity.
  case = 0 = case-sensitive
  case = 0 = case-insensitive
                                    A boolean form of IndexOf is -
                                    If text.Contains(string) = True Then...
If Lcase$(x) = Lcase$(y)...         If x.EqualsIgnoreCase(y)...
text = Left$(text, n) & s &         text.Insert(n, s)
          Right$(Text, y)
Asc(s) [where s = a character]      same

Error Trapping:
--------------
VB6:
===
Sub SomeSub
   On [Local] Error GoTo ErrorTrap
      ...some code...
   On Error GoTo 0 [optional end to error trapping]
   ...optional additional code...
   Exit Sub [to avoid executing ErrorTrap code]
ErrorTrap:
   ...optional code for error correction...
   Resume [optional: "Resume Next" or "Resume [line label]".
End Sub
B4A:
===
Sub SomeSub
   Try
      ...some code...
   Catch [only executes if error above]
      Log(LastException) [optional]
      ...optional code for error correction...
   End Try
   ...optional additional code...
End Sub
WIth B4A, if you get an error caught in the middle of a large subroutine, you can
NOT make a correction and resume within the code you were executing. Only the code
in "Catch" gets executed, plus any code following "End Try".
Try-Catch in place of GoTo:
--------------------------
Try-Catch can be used as a substitute for GoTo [line label] for forward, but not
backward, jumps. It cannot be used to replace GoSub, for which B4A has no equivalent.
Start the code with "Try" and replace the [line label] with "Catch".
Replace "GoTo [line label]" with code which will create an exception, which causes
a jump to "Catch", such as OpenInput("bad path", "bad filename").

"Immediate Window" vs "Logs" Tab
--------------------------------
Comments, variable values, etc., can be displayed in VB6's Immediate
Window by entering into the code "Debug.Print ...".
In the B4A environment, the Logs tab on the right side of the IDE is a
way to show the values of variables, etc., while the code is running.
Both VB6 and (now) B4A allow single-stepping through the code while it
is running and viewing the values of variables. VB6 also allows changing
the value of variables, changing the code, jumping to other lines from
the current line, etc. Because B4A runs on a PC while the app runs on
a separate device, B4A is currently unable to duplicate all of these
VB6 debug features.


I've added some hints

Select case issue
Case <value1>,<value2> Same
Case <value1> To <Value2> unsupported in B4A, use comma separated
Case <value>:statement Same

Redim issue

Type records
Classes and pointers references

Hope that helps
 
Top