B4xBasicLanguage V1.0
B4xBasicLanguage V1.0
B4xBasicLanguage V1.0
Para buscar por una palabra o sentencia, usa la función Búsqueda en el menú Editar.
1 BASIC
En la programación de computadoras, BASIC, siglas de Beginner's All-purpose Symbolic
Instruction Code (Código simbólico de instrucciones de propósito general para principiantes en
español), es una familia de lenguajes de programación de alto nivel. El BASIC original, el
Dartmouth BASIC, fue diseñado en 1964 por John George Kemeny y Thomas Eugene Kurtz en el
Dartmouth College en Nuevo Hampshire, Estados Unidos, como un medio para facilitar la
programación en ordenadores a estudiantes (y profesores) que no fueran de ciencias. En aquella
época, casi todo el uso de los ordenadores requería codificar software hecho a medida, con lo cual
quedaba restringido a personas con formación como científicos y matemáticos (fuente: Wikipedia).
1.1 B4x
B4R es una herramienta de desarrollo 100% gratuita para crear programas nativos para Arduino y
ESP8266.
B4R sigue los mismos conceptos de otras herramientas B4X, proporcionando una sencilla y potente
herramienta de desarrollo.
B4R, B4A, B4J y B4i juntos, conforman la mejor solución de desarrollo para el Internet de las
Cosas (IoT - Internet of Things).
BASIC 8 Lenguaje Basic B4x
2 Variables y objetos
Una variable es un nombre simbólico dado a alguna, conocida o no, cantidad de información, con
el fin de permitir que sea usada de forma independiente de la información que representa. Un
nombre de variable, en código fuente de ordenador, generalmente se asocia con una ubicación de
almacenamiento de datos y por lo tanto también su contenido, y estos pueden cambiar durante el
curso de la ejecución del programa (fuente: Wikipedia).
B4R
Byte 0 - 255
Int (2 bytes) -32768 - 32768. Similar al tipo Short de las otras herramientas B4x.
UInt (2 bytes) 0 - 65535. Especifico de B4R.
Long (4 bytes) -2,147,483,648 - 2,147,483,647. Similar al tipo Int de las otras herramientas
B4x.
ULong (4 bytes) 0 - 4,294,967,295 Especifico de B4R.
Double (4 bytes) Número en coma flotante de 4 bytes. Similar al tipo Float de las otras
herramientas B4x.
Float es el mismo que Double. Short es el mismo que Int.
Otros tipos:
Boolean Verdadero o Falso. Prácticamente se guarda como un byte con el valor de 1 o 0.
String Las cadenas de caracteres están hechas de una matriz de bytes que terminan con un byte
nulo (byte con el valor de 0).
Object Los objetos pueden contener otros tipos de valores
Las variables de tipo primitiva, se pasan siempre por valor a otras subs o cuando son asignadas a
otras variables.
Por ejemplo:
Sub S1
Private A As Int
A = 12 La variable A = 12
S2(A) Se pasa por valor a la rutina S2
Log(A) ' Muestra 12 La variable A todavía vale 12, aunque B fue cambiada en la rutina S2.
End Sub
Todos los otros tipos de variables, incluyendo las matrices de variables primitivas, se clasifican
como variables no-primitivas.
Cuando se pasa una variable no-primitiva a una sub o cuando se asigna a una variable distinta, se
pasa una copia de la referencia.
Esto significa que los datos en sí no están duplicados.
Es ligeramente diferente pasar una variable por referencia ya que no se puede cambiar la referencia
de la variable original.
Aquí vemos un error común donde el desarrollador intenta añadir varias matrices a una lista:
Depende de nosotros darle cualquier nombre a una variable, a excepción de las palabras reservadas.
Un nombre de variable debe comenzar con una letra y debe estar compuesto de los siguientes
caracteres A-Z, a-z, 0-9, y el guión bajo "_", sin espacios, paréntesis etc.
Los nombres de variables no son sensibles a mayúsculas, lo que significa que Index e index se
refieren a la misma variable.
Para Views (B4A, B4i), Nodes (B4J), es útil añadir al nombre un prefijo de tres caracteres que
define su tipo.
Ejemplos:
lblCapital lbl > Label Capital > propósito
edtInterest edt > EditText Interest > propósito
btnNext btn > Button Next > propósito
Las variables son declaradas con la palabra clave Private o Public seguido por el nombre de la
variable y la palabra clave As seguido del tipo de variable. Para más detalles leer el capítulo
Ámbito.
También existe la palabra clave Dim , esta se mantiene por compatibilidad.
Ejemplos:
Private Capital As Double Declara tres variables como Double,
Private Interest As Double números de precisión doble.
Private Rate As Double
Private btnNext As Button Declara dos variables como „views‟ de tipo Button.
Private btnPrev As Button
Las mismas variables también pueden ser declaradas de una forma más corta.
Private Capital, Interest, Rate As Double
Private i, j, k As Int
Private lblCapital, lblInterest, lblRate As Label
Private btnNext, btnPrev As Button
Los nombres de las variables separados por comas y seguido por la declaración del tipo de variable.
BASIC 12 Lenguaje Basic B4x
Private txt = "test" As String, value = 1.05 As Double, flag = False As Boolean
Las vistas deben ser declaradas si queremos acceder a ellas mediante código.
Por ejemplo, si queremos cambiar el texto en una vista Label mediante código, de esta forma:
lblCapital.Text = "1200",
Tenemos que hacer referencia a esta vista Label por el nombre lblCapital que le hemos dado
mediante la declaración Private.
Si no necesitamos acceder a esta vista Label mediante código, no necesitamos declararla.
El uso de una rutina de evento para una vista no necesita que esta sea declarada.
Para asignar un valor a una variable, se debe escribir su nombre seguido por el signo igual y
seguido por el valor, de esta forma:
Capital = 1200
LastName = "SMITH"
Ten en cuenta que para Capital escribimos solo 1200 porque Capital es un número.
Pero para LastName escribimos "SMITH" porque LastName es una cadena de texto.
Las cadenas de texto siempre deben ser escritas entre comillas dobles.
Las matrices (Arrays), son colecciones de datos u objetos, cuyos elementos pueden ser
seleccionados mediante índices. Las matrices pueden tener varias dimensiones.
La declaración contiene las palabras clave Private o Public seguida por el nombre de la variable
LastName, el número de elementos entre paréntesis (50), la palabra clave As y el tipo de variable
String.
Para más detalles consulta el capítulo Ámbito. También existe la palabra clave Dim , esta se
mantiene por compatibilidad.
Ejemplos:
Public LastName(50) As String Matriz de tipo String de una dimensión, elementos totales 50.
Public Matrix(3, 3) As Double Matriz de tipo Double de dos dimensiones, elementos totales 9.
Public Data(3, 5, 10) As Int Matriz de tipo Int de tres dimensiones, elementos totales 150.
El índice del último elemento en cada dimensión es igual al número de elementos menos 1.
LastName(49), Matrix(2,2), Data(2,4,9)
Este ejemplo muestra cómo obtener acceso a todos los elementos en una matriz de tres dimensiones.
For i = 0 To 2
For j = 0 To 4
For k = 0 To 9
Data(i, j, k) = ...
Next
Next
Next
Y la rutina de acceso.
For i = 0 To NbX - 1
For j = 0 To NbY - 1
For k = 0 To NbZ - 1
Data(i, j, k) = ...
Next
Next
Next
Views / nodes u objetos pueden estar en una matriz. El siguiente código muestra un ejemplo:
En B4A y B4i los objetos de la interfaz son llamados views y llamados nodes en B4J.
En el siguiente ejemplo los Buttons se añaden al view / node padre mediante código.
B4A
Sub Globals
Private Buttons(6) As Button
End Sub
For i = 0 To 5
Buttons(i).Initialize("Buttons")
Activity.AddView(Buttons(i), 10dip, 10dip + i * 60dip, 150dip, 50dip)
Buttons(i).Tag = i + 1
Buttons(i).Text = "Test " & (i + 1)
Next
End Sub
Sub Buttons_Click
Private btn As Button
btn = Sender
Log("Button " & btn.Tag & " clicked")
End Sub
B4i
Sub Process_Globals
Private i As Int
For i = 0 To 5
Buttons(i).Initialize("Buttons")
Page1.RootPanel.AddView(Buttons(i), 10dip, 10dip + i * 60dip, 150dip, 50dip)
Buttons(i).Tag = i + 1
Buttons(i).Text = "Test " & (i + 1)
Next
End Sub
Sub Buttons_Click
Private btn As Button
btn = Sender
Log("Button " & btn.Tag & " clicked")
End Sub
BASIC 15 Lenguaje Basic B4x
B4J
Sub Process_Globals
Private i As Int
For i = 0 To 5
Buttons(i).Initialize("Buttons")
MainForm.RootPane.AddNode(Buttons(i), 10, 10 + i * 60, 150, 50)
Buttons(i).Tag = i + 1
Buttons(i).Text = "Test " & (i + 1)
Next
End Sub
Los Buttons podrían también ser añadidos mediante un archivo de diseño, en este caso no necesitan
se inicializados, ni añadidos al view / node padre y las propiedades Text y Tag también se deben
establecer en el diseñador.
En ese caso, el código sería este:
B4A
Sub Globals
Private b1, b2, b3, b4, b5, b6, b7 As Button
Private Buttons() As Button
End Sub
Sub Buttons_Click
Private btn As Button
btn = Sender
Log("Button " & btn.Tag & " clicked")
End Sub
BASIC 16 Lenguaje Basic B4x
B4i
Sub Process_Globals
Sub Buttons_Click
Private btn As Button
btn = Sender
Log("Button " & btn.Tag & " clicked")
End Sub
B4J
Sub Process_Globals
Las variables Type No pueden ser privadas. Una vez declaradas se puede acceder a ellas
desde cualquier sitio (similar a los módulos de Clase).
El mejor lugar para declararlas es en la rutina Process_Globals en el módulo Main.
La nueva variable Type es Person , a continuación declaramos una variable simple y una matriz
como variables de tipo Person.
Para acceder a un elemento en particular, podemos utilizar el siguiente código.
CurrentUser.FirstName
CurrentUser.LastName
User(1).LastName
User(1).FirstName
Es posible asignar una variable Type a otra variable del mismo tipo, como se muestra a
continuación.
CurrentUser = User(1)
BASIC 18 Lenguaje Basic B4x
B4x evalúa los tipos de la variable automáticamente según sea necesario. También evalúa los
números como cadenas de texto y viceversa de forma automática.
En muchos casos, se necesita explícitamente evaluar un Objeto como un tipo específico.
Esto se puede hacer asignando el objeto a una variable del tipo requerido.
Por ejemplo, la palabra clave Sender hace referencia al objeto que provocó el evento.
El siguiente código cambia el color del button pulsado.
Ten en cuenta que hay varios buttons que comparten la misma rutina para el evento Click.
Sub Globals
Private Btn1, Btn2, Btn3 As Button
End Sub
Sub Btn_Click
Private btn As Button
btn = Sender ' Definimos el objeto Sender como Button
btn.Color = Colors.RGB(Rnd(0, 255), Rnd(0, 255), Rnd(0, 255))
End Sub
Sub Globals
End Sub
Sub Btn_Click
Private btn As Button
btn = Sender ' Definimos el objeto Sender como Button
btn.Color = Colors.RGB(Rnd(0, 255), Rnd(0, 255), Rnd(0, 255))
End Sub
BASIC 19 Lenguaje Basic B4x
2.5 Ámbito
Estas variables son accesibles todo el tiempo de vida del proceso. Deben ser declaradas dentro de la
rutina Process_Globals. Esta rutina es llamada una vez cuando se inicia el proceso (esto es cierto
para todos los módulos, no solo para el módulo main).
Estas variables son "public". Lo que significa que pueden ser accedidas también desde otros
módulos.
Sin embargo, en B4A, no todos los tipos de objetos pueden ser declarados como variables de
proceso.
Por ejemplo, views / nodes no pueden ser declarados como variables de proceso.
La razón, es que no queremos mantener una referencia a objetos que deben ser destruidos junto con
la Activity. En otras palabras, una vez que la Activity se destruye, todas las views que contenía esa
Activity también son destruidas.
Si mantenemos una referencia a una View, el recolector de basura no será capaz de liberar recursos
y vamos a tener un problema de memoria El compilador hace cumplir este requisito.
Para acceder a variables de proceso desde otros módulos, debes indicar el nombre del módulo,
donde han sido declaradas, como prefijo.
Ejemplo:
Variable declarada en un módulo con el nombre: MyModule
Sub Process_Globals
Public MyVar As String
End Sub
Para variables declaradas en un módulo de Clase en la rutina Class_Globals, las mismas reglas de
arriba son válidas.
Public MyVarPublic As String ' pública
Private MyVarPublic As String ' privada
Dim MyVar As String ' pública como Public
2.6 Consejos
Un view / node puede ser asignado a una variable de modo que podemos cambiar fácilmente sus
propiedades.
Por ejemplo, el siguiente código desactiva todas las Views contenidas en un Panel / Pane:
For i = 0 To MyPanel.NumberOfViews - 1
Private v As View
v = MyPanel.GetView(i)
v.Enabled = False
Next
For i = 0 To.NumberOfViews - 1
Private v As View
v = MyPanel.GetView(i)
If v Is Button Then 'comprobar si se trata de un Button
v.Enabled = False
End If
Next
3 Lenguaje Basic
3.1 Expresiones
Por ejemplo, 2 + 3 es una expresión aritmética y de programación que se evalúa a 5. Una variable es
una expresión porque es un puntero a un valor en memoria, de modo que y + 6 es una expresión. Un
ejemplo de una expresión relacional es 4 = 4 que se evalúa como verdadero (fuente: Wikipedia).
Nivel de
Operador Ejemplo Operación
prioridad
+ x + y 3 Suma
- x - y 3 Resta
* x * y 2 Multiplicación
/ x / y 2 División
Mod x Mod y 2 Modulo
y
Power Power(x,y) x 1 Potencia de
Nivel de prioridad: En una expresión, operaciones con el nivel 1 son evaluadas antes que las
operaciones con el nivel 2, que son evaluadas antes que las operaciones con el nivel 3.
Ejemplos:
4 + 5 * 3 + 2 = 21 > 4 + 15 + 2
(4 + 5) * (3 + 2) = 45 > 9 * 5
- 22 = - 4
(-2)2 = 4
BASIC 22 Lenguaje Basic B4x
En ciencias de la computación, una expresión Booleana, es una expresión que produce un valor
Booleano cuando se evalúa, es decir, Verdadero o Falso. Una expresión Booleana puede estar
compuesta por una combinación de constantes Booleanas Verdadero o Falso, Variables tipo
Booleanas, Operadores de valor Booleano, y funciones de valor Booleano (fuente: Wikipedia).
Operador Comentario
O Booleano Z = X Or Y Z = verdadera si X o Y son verdaderas, o ambas son
O
verdaderas
And Y Booleano Z = X And Y Z = verdadera si X e Y son ambas verdaderas
Not ( ) NO Booleano X = verdadero Y = Not(X) > Y = Falso
O And
X Y Z Z
Falso Falso Falso Falso
Verdadero Falso Verdadero Falso
Falso Verdadero Verdadero Falso
Verdadero Verdadero Verdadero Verdadero
BASIC 23 Lenguaje Basic B4x
Null As Object
NumberFormat (Number As Double, MinimumIntegers As Int, MaximumFractions As Int) As
String
NumberFormat2 (Number As Double, MinimumIntegers As Int, MaximumFractions As Int,
MinimumFractions As Int, GroupingUsed As Boolean) As String
Power (Base As Double, Exponent As Double) As Double
QUOTE As String
Regex As Regex
Return
Rnd (Min As Int, Max As Int) As Int
RndSeed (Seed As Long)
Round (Number As Double) As Long
Round2 (Number As Double, DecimalPlaces As Int) As Double
Select
Sender As Object
Sin (Radians As Double) As Double
SinD (Degrees As Double) As Double
Sleep (Milliseconds As Int)
SmartStringFormatter (Format As String, Value As Object) As String
Sqrt (Value As Double) As Double
Sub
SubExists (Object As Object, Sub As String) As Boolean
TAB As String
Tan (Radians As Double) As Double
TanD (Degrees As Double) As Double
True As Boolean
Try
Type
Until
While
BASIC 25 Lenguaje Basic B4x
Array
BytesToString (Data() As Byte, StartOffset As Int, Length As Int, CharSet As String) As String
Llama a una rutina. CallSub puede ser usado para llamar a una rutina que pertenece a un módulo
diferente.
Sin embargo, la rutina solo será llamada si el módulo no está en pausa. En este caso, una cadena
vacía será devuelta.
Puedes utilizar IsPaused para comprobar si un módulo está en pausa
Esto significa que un Activity no puede llamar a una rutina de una Activity diferente. Ya que la otra
Activity seguro que está en pausa.
CallSub permite a una Activity llamar a una rutina de servicio y permite a un servicio llamar a una
rutina de Activity.
Ten en cuenta que no es posible llamar a rutinas de módulos de código.
CallSub también puede ser usado para llamar a rutinas del módulo actual. Usar 'Me' como
'component' en ese caso.
Ejemplo:
CallSub(Main, "RefreshData")
CallSub3 (Component As Object, Sub As String, Argument1 As Object, Argument2 As Object) As Object
Catch
cE As Double
Devuelve el menor Double que es mayor o igual que el número especificado y es un número entero.
BASIC 27 Lenguaje Basic B4x
Continue
cPI As Double
Constante PI.
CRLF As String
Dim
Declarar varias variables. Todas las variables serán del tipo especificado.
Dim [Const] variable1 [= expression], variable2 [= expression], ..., [As type]
Ten en cuenta que la sintaxis abreviada sólo se aplica a la palabra clave Dim.
Ejemplo: Dim a = 1, b = 2, c = 3 As Int
Exit
False As Boolean
Devuelve el menor Double que es menor o igual que el número especificado y es un número
entero..
For
Sintaxis:
For variable = value1 To value2 [intervalo]
...
Next
Si la variable de iteración no se ha declarado antes, será del tipo Int.
O:
For Each variable As type In collection
...
Next
Ejemplos:
For i = 1 To 10
Log(i) 'mostrará de 1 a 10 (incluido).
Next
For Each n As Int In Numbers 'una matriz
Sum = Sum + n
Next
Ten en cuenta que los límites del bucle se comprueban una vez antes de la primera iteración.
If
En una línea:
If condición Then instrucción si es verdadero [Else instrucción si es falso]
Multilínea:
If condición Then
instrucción
Else If condición Then
instrucción
...
Else
instrucción
End If
Comprueba si la cadena de texto especificada puede ser analizada de forma segura como un
número.
BASIC 29 Lenguaje Basic B4x
LoadBitmapSample (Dir As String, FileName As String, MaxWidth As Int, MaxHeight As Int) As Bitmap
Me As Object
Null As Object
BASIC 30 Lenguaje Basic B4x
QUOTE As String
Regex As Regex
Return
Select
Compara un valor único con varios valores.
Ejemplo:
Dim value As Int
value = 7
Select value
Case 1
Log("Uno")
Case 2, 4, 6, 8
Log("Par")
Case 3, 5, 7, 9
Log("Impar mayor que uno")
Case Else
Log("mayor que 9")
End Select
Sender As Object
Sub
Declara una rutina con los parámetros y el tipo de variable que devuelve.
Sintaxis: Sub nombre [(lista de parámetros)] [As tipo-de-variable-devuelta]
En los parámetros se deben incluir el nombre y el tipo.
La longitud de las dimensiones de las matrices no debe ser incluida.
Ejemplo:
Sub MySub (FirstName As String, LastName As String, Age As Int, OtherValues() As
Double) As Boolean
...
End Sub
En este ejemplo OtherValues es una matriz de una sola dimensión.
TAB As String
Carácter Tabulador.
True As Boolean
Try
Type
Until
While
If test1 Then
' código1
Else If test2 Then
'código2
Else
' código3
End If
Las comprobaciones pueden ser cualquier tipo de prueba condicional que devuelva True o False.
Algunos ejemplos:
If b = 0 Then
a = 0 La estructura If-Then más simple.
End If
If b = 0 Then
a = 0 La estructura If-Then-Else más simple.
Else
a = 1
End If
If b = 0 Then a = 0 : c = 1
El carácter de dos puntos ' : ' en la línea anterior se trata en B4x como un carácter CR de Retorno
de Carro.
Caso general:
1. TestExpression es evaluada.
2. Si un elemento de ExpressionList1 coincide con TestExpression entonces se ejecuta
código1 y continúa en la siguiente línea de la palabra clave End Select.
3. Si un elemento de ExpressionList2 coincide con TestExpression entonces se
ejecuta código2 y continúa en la siguiente línea de la palabra clave End Select.
4. Si no hay ninguna coincidencia con TestExpression se ejecuta código3
y continúa en la siguiente línea de la palabra clave End Select.
Ejemplos:
Select Value
Case 1, 2, 3, 4 La variable Value es un valor numérico.
Case Activity.ACTION_MOVE
Case Activity.ACTION_UP
End Select
End Sub
BASIC 37 Lenguaje Basic B4x
For i = n3 To 0 Step -1
Next
En VB :
La variable a incrementar se añade después de la palabra clave Next.
El tipo de bucle se especifica después de la palabra clave Exit.
Ejemplo:
Next
Sum = 0
For Each n As Int In Numbers
Sum = Sum + n
Next
Sum = 0
For i = 0 To Numbers.Length - 1
Sum = Sum + Numbers(i)
Next
BASIC 40 Lenguaje Basic B4x
Do While test
' código
If a = 0 Then Exit Si a = 0 entonces sale del bucle
' código
Loop
BASIC 41 Lenguaje Basic B4x
Ejemplos:
Bucle Do Until:
Private i, n As Int
i = 0
Do Until i = 10
' código
i = i + 1
Loop
Bucle Do While :
Private i, n As Int
i = 0
Do While i < 10
' código
i = i + 1
Loop
tr.Initialize(File.OpenInput(File.DirInternal, "test.txt"))
lstText.Initialize
line = tr.ReadLine
Do While line <> Null
lstText.Add(line)
line = tr.ReadLine
Loop
tr.Close
3.5 Subs
Una Subrutina (“Sub”) es una pieza de código. Puede ser de cualquier longitud, tiene un nombre
distintivo y un alcance definido (referido al ámbito de las variables explicado anteriormente). En
código B4x , una subrutina es se llama “Sub”, y es equivalente a los procedimientos, funciones,
métodos y subs en otros lenguajes de programación. Las líneas de código dentro de una Sub son
ejecutadas desde la primera a la última, como se describe en el capítulo flujo de código.
No es recomendable tener Subs con una gran cantidad de código, son más difíciles de entender.
3.5.1 Declaración
Se inicia con la palabra clave Sub, seguido por el nombre de la subrutina, seguido por una lista de
parámetros, seguido del tipo de variable que devuelve y termina con las palabras claves End Sub.
Las Subs son siempre declaradas en el nivel superior del módulo, no se puede anidar una Sub dentro
de otra.
3.5.2 Llamadas
Cuando se desea ejecutar las líneas de código dentro de una Sub, simplemente se escribe el nombre
de la Sub.
Por ejemplo:
Interest = CalcInterest(1234, 5.2)
A una subrutina declarada en un módulo de código se puede acceder desde cualquier otro módulo,
pero en este caso, se debe añadir el nombre del módulo donde se declaró la Sub como prefijo.
En lugar de:
Interest = CalcInterest(1234, 5.2)
BASIC 43 Lenguaje Basic B4x
3.5.4 Nombres
Básicamente, para poner un nombre a una Sub puedes usar las mismas reglas que para poner
nombres a las variables. Se recomienda poner un nombre significativo, como CalcInterest en el
ejemplo, así puedes saber qué hace el código viendo el nombre de la Sub.
No hay límite en el número de Subs que puedes añadir al programa, pero no se permite tener dos
Subs con el mismo nombre en el mismo módulo.
3.5.5 Parámetros
A una Sub se le pueden pasar parámetros. La lista de parámetros debe ir entre paréntesis después
del nombre de la Sub.
El tipo de parámetro debe ser declarado directamente en la lista.
Una sub puede devolver un valor, este puede ser cualquier objeto.
La devolución de ese valor se hace mediante la palabra clave Return.
El tipo de valor devuelto se añade en la declaración de la Sub después de la lista de parámetros.
La reanudación de Subs es una nueva característica añadida en B4A v7.00 / B4i v4.00 / B4J v5.50.
Simplifica enormemente el manejo de las tareas asíncronas.
(Esta característica es una variante de coroutines sin pila.)
La característica especial de la reanudación de Subs es que pueden ser pausadas sin necesidad de
detener la ejecución del hilo y más tarde ser reanudada.
El programa no espera a la reanudación de la Sub. Otros eventos se activarán como de costumbre.
Cualquier Sub con una o más llamadas a 'Sleep' o 'Wait For' es una Sub resumible.
El IDE muestra este indicador junto a la declaración de la Sub:
3.6.1 Sleep
Log(1)
Sleep(1000)
Log(2)
Puedes usar Sleep(0) para la más breve pausa. Esto se puede usar para permitir que la interfaz de
usuario se actualice. Es una buena alternativa para DoEvents (que no existe en B4J ni B4i y debe
ser evitado en B4A).
Sub VeryBusySub
For i = 1 To 10000000
'hacer algo
If i Mod 1000 = 0 Then Sleep(0) 'Permite a la interfaz de usuario actualizarse
cada 1000 iteraciones.
Next
Log("Terminado!")
End Sub
BASIC 45 Lenguaje Basic B4x
B4X es un lenguaje de programación por eventos. Tareas asíncronas se ejecutan de fondo y activan
un evento cuando se completan.
Con la nueva palabra clave Wait For puedes manejar ese evento desde la actual Sub.
Por ejemplo, este código esperará por el evento Ready de GoogleMap (ejemplo B4J):
gmap.Initialize("gmap")
Pane1.AddNode(gmap.AsPane, 0, 0, Pane1.Width, Pane1.Height)
MainForm.Show
Wait For gmap_Ready '<----------------
gmap.AddMarker(10, 10, "Marker")
End Sub
Cuando la palabra clave Wait For es llamada, la Sub se pausa y el manejador interno de eventos
cuida de reanudarla cuando se produce el evento. Si el evento nunca se produce, la Sub nunca se
reanudará. El programa todavía seguirá ejecutándose y respondiendo a otros eventos.
Si más tarde se vuelve a usar Wait For con el mismo evento, entonces la nueva instancia de la Sub
reemplazará a la anterior.
BASIC 46 Lenguaje Basic B4x
Supongamos que queremos crear una Sub que descarga una imagen y la carga en una vista
ImageView:
DownloadImage("https://www.b4x.com/images3/android.png", ImageView1)
DownloadImage("https://www.b4x.com/images3/apple.png", ImageView2)
Solo cargaremos la segunda imagen, porque la segunda llamada a Wait For JobDone sobrescribirá a
la anterior.
Esto nos lleva a la segunda variante de Wait For.
Para resolver este problema, Wait For puede distinguir entre eventos basado en el remitente del
evento.
Esto se hace con un parámetro opcional:
Ejemplo:
Con el código anterior, cada instancia de la Sub resumible va a esperar por un evento diferente y no
se verá afectada por las otras instancias.
BASIC 47 Lenguaje Basic B4x
Sub S1
Log("S1: A")
S2
Log("S1: B")
End Sub
Sub S2
Log("S2: A")
Sleep(0)
Log("S2: B")
End Sub
El resultado es:
S1: A
S2: A
S1: B
S2: B
Siempre que las palabras claves Sleep o Wait For son usadas, la actual Sub se pausa. Esto es
equivalente a llamar a Return.
BASIC 48 Lenguaje Basic B4x
Cuando una Sub resumible llama a una segunda Sub resumible, el código en la primera Sub
continuara después de la primera llamada a Sleep o Wait For (en la segunda Sub).
Si quieres esperar a que la segunda sub se complete, puedes provocar un evento en la segunda Sub y
esperar por ese evento en la primera Sub:
Sub FirstSub
Log("FirstSub comenzada")
SecondSub
Wait For SecondSub_Complete
Log("FirstSub completada")
End Sub
Sub SecondSub
Log("SecondSub comenzada")
Sleep(1000)
Log("SecondSub completada")
CallSubDelayed(Me, "SecondSub_Complete")
End Sub
Registros:
FirstSub comenzada
SecondSub comenzada
SecondSub completada
FirstSub completada
Notas:
- Es más seguro utilizar CallSubDelayed que CallSub. CallSub fallará si la segunda Sub nunca entra
en pausa (por ejemplo si Sleep solo es llamada usando alguna condición).
- Aquí se asume que FirstSub nunca va a ser llamada de nuevo hasta que se haya completado.
BASIC 49 Lenguaje Basic B4x
3.6.5 DoEvents
A partir de B4A v7.0, aparecerá el siguiente aviso para las llamadas a DoEvents:
DoEvents está en desuso. Esto puede llevar a problemas de estabilidad. Usa Sleep(0) en su lugar
(si es realmente necesario).
El propósito de Doevents era permitir que la interfaz de usuario se actualizara mientras el hilo
principal estaba ocupado. DoEvents, que comparte la misma implementación que los cuadros de
diálogo modales, es una implementación de bajo nivel. Accede a la cola de mensajes y ejecuta
algunos de los mensajes en espera.
Según ha ido evolucionando Android, el manejo de la cola de mensajes se ha vuelto más sofisticado
y frágil.
Las razones para dejar de usar DoEvents son:
1. Es una fuente importante de problemas de inestabilidad. Puede conducir a una difícil depuración
o a mensajes ANR (aplicación no responde). Ten en cuenta que esto también es cierto para los
cuadros de diálogo modales (como los Msgbox y los InputList).
2. Hay mejores maneras de mantener el hilo principal libre. Por ejemplo usando métodos asíncronos
SQL en lugar de los métodos síncronos.
3. No hace lo que muchos de los desarrolladores esperan que haga Ya que solo se encarga de los
mensajes relacionados con la interfaz de usuario, la mayoría de los eventos no pueden ser
manejados desde una llamada a DoEvents.
4. Ahora es posible usar Sleep para pausar la actual Sub y reanudarla después de que se procesen
los mensajes en espera. La implementación de Sleep es completamente diferente a DoEvents. No
bloquea el hilo. En lugar de eso, lo libera preservando el estado de la Sub.
A diferencia de DoEvents que solo procesa los mensajes relacionados con el interfaz de usuario,
con Sleep se procesan todos los mensajes y otros eventos serán activados.
(Nota que usar Wait For para esperar por un evento es mejor que usar Sleep en un bucle.)
Con todo esto, DoEvents todavía se puede usar y las aplicaciones existentes funcionarán
exactamente igual que antes.
BASIC 50 Lenguaje Basic B4x
Diálogos modales = diálogos que bloquean el hilo principal hasta que el diálogo se cierra.
En lugar de:
Debes utilizar :
Wait For no bloquea el hilo principal. En su lugar, guarda el estado actual de la Sub y lo libera. El
código se reanudará cuando el usuario haga clic en alguno de los botones del cuadro de diálogo.
Los otros nuevos métodos similares son: MsgboxAsync, InputListAsync and InputMapAsync.
Con la excepción de MsgboxAsync, los nuevos métodos también añaden un nuevo parámetro
cancelable. Si es verdadero, entonces el cuadro de diálogo puede ser cerrado al hacer clic en la tecla
volver o fuera del cuadro de diálogo. Este es el comportamiento por defecto de los antiguos
métodos.
Como otros códigos se pueden ejecutar mientras un cuadro de diálogo es visible, es posible que
varios cuadros de diálogo aparezcan al mismo tiempo.
Si este es el caso de tu aplicación, debes configurar el filtro del remitente en el parámetro de la
llamada a Wait For:
Esto permite manejar correctamente los eventos activados por cada resultado devuelto por los
distintos cuadros de diálogo.
BASIC 51 Lenguaje Basic B4x
La nueva característica de las Sub resumibles, hace que sea más sencillo trabajar con grandes
conjuntos de datos con un mínimo efecto en la capacidad de respuesta del programa.
For i = 1 To 1000
SQL1.AddNonQueryToBatch("INSERT INTO table1 VALUES (?)", Array(Rnd(0, 100000)))
Next
Dim SenderFilter As Object = SQL1.ExecNonQueryBatch("SQL")
Wait For (SenderFilter) SQL_NonQueryComplete (Success As Boolean)
Log("NonQuery: " & Success)
3.6.7.1 Consultas
En la mayoría de los casos las consultas serán rápidas y por lo tanto deben ser hechas mediante la
forma síncrona con SQL1.ExecQuery2. Sin embargo, si hay una consulta lenta, entonces debes
cambiar a SQL1.ExecQueryAsync:
Como en el caso anterior, el método ExecQueryAsync devuelve un objeto que es usado como
parámetro para filtrar el remitente.
Consejos:
1. El tipo ResultSet en B4A extiende el tipo Cursor. Puedes cambiar el tipo Cursor si lo prefieres.
La ventaja de usar ResultSet es que es compatible con B4J y B4i.
2. Si el número de filas devueltas por la consulta es grande, entonces el bucle Do While será lento
en modo 'debug'. puedes hacer que sea más rápido poniéndolo en otra Sub y limpiando el proyecto
(Ctrl + P):
BASIC 52 Lenguaje Basic B4x
Esto está relacionado con una optimización del depurador que se encuentra deshabilitado en las Sub
resumibles.
El rendimiento de ambas soluciones, será el mismo en modo 'release'.
3.6.7.2 B4J
3.7 Eventos
3.7.1 B4A
Eventos
CheckedChange
ItemLongClick
FocusChanged
ScrollChanged
ValueChanged
TextChanged
PageFinished
EnterPressed
TabChanged
OverrideUrl
LongClick
ItemClick
KeyPress
KeyUp
Touch
Down
Click
Up
Views
Activity
Button
CheckBox
EditText
HorizontalScrollView
ImageView
Label
ListView
Panel
RadioButton
ScrollView
SeekBar
Spinner
TabHost
ToggleButton
WebView
BASIC 55 Lenguaje Basic B4x
Ejemplo:
Sub Activity_Touch (Action As Int, X As Float, Y As Float)
Select Action
Case Activity.ACTION_DOWN
'Tu código para la acción DOWN
Case Activity.ACTION_MOVE
'Tu código para la acción MOVE
Case Activity.ACTION_UP
'tu código para la acción UP
End Select
End Sub
Ejemplo:
Sub CheckBox1_CheckedChange(Checked As Boolean)
If Checked = True Then
'Tu código si activado
Else
'Tu código si no activado
End If
End Sub
BASIC 56 Lenguaje Basic B4x
Ejemplo:
3.7.2 B4i
Eventos
ScrollChanged
ValueChanged
IndexChanged
TextChanged
PageFinished
ItemSelected
EnterPressed
OverrideUrl
LongClick
BeginEdit
EndEdit
Resize
Touch
Click
Views
Button
TextField
TextView
ImageView
Label
Panel
ScrollView
Slider
Picker
Stepper
Switch
SegmentedControl
Slider
Stepper
WebView
BASIC 58 Lenguaje Basic B4x
Ejemplo:
Private Sub Panel_Touch (Action As Int, X As Float, Y As Float)
Select Action
Case Panel.ACTION_DOWN
'Tu código para la acción DOWN
Case Panel.ACTION_MOVE
'Tu código para la acción MOVE
Case Panel.ACTION_UP
'tu código para la acción UP
End Select
End Sub
BASIC 59 Lenguaje Basic B4x
3.7.3 B4J
Eventos
SelectedIndexChanged
H / VScrollChanged
CheckedChange
SelectedChange
MouseReleased
MouseDragged
FocusChanged
MouseClicked
MousePressed
MouseMoved
ValueChange
PageFinished
TextChanged
TabChanged
Action
Resize
d
Nodes
Button
Canvas
CheckBox
ChoiceBox
ComboBox
ImageView
Label
ListView
Pane
RadioButton
ScrollPane
Slider
Spinner
TabPane
TextArea
TextField
ToggleButton
WebView
BASIC 60 Lenguaje Basic B4x
MouseEvent
Datos devueltos por los eventos de Ratón:
3.7.4 B4R
En B4R, los objetos 'Pin' y 'Timer' son los únicos que generan eventos:
Pin
StateChanged (State As Boolean) El evento se desencadena cuando el pin cambia su
estado.
Ejemplo:
Sub Pin1_StateChanged(State As Boolean)
'Tu código
End Sub
Timer
Tick El evento se desencadena cada intervalo de tiempo dado
Ejemplo:
Sub Timer1_Tick
'Tu código
End Sub
BASIC 63 Lenguaje Basic B4x
3.8 Librerías
Para las librerías adicionales es útil crear una carpeta especial para guardarlas en otra parte.
Por ejemplo:
C:\B4A\AddLibraries, C:\B4i\AddLibraries, C:\B4J\AddLibraries, C:\B4R\AddLibraries
Cuando instalas una nueva versión de B4x, todas las librerías estándar se actualizan
automáticamente, pero las librerías adicionales no están incluidas. La ventaja de usar una carpeta
especial es que no tienes que preocuparte por estas librerías, porque esta carpeta no se ve afectada
cuando se instala una nueva versión de B4x.
Las librerías adicionales no son sistemáticamente actualizadas con la nueva versión de B4x.
Una lista de las librerías oficiales y el resto de librerías con enlaces a sus correspondientes páginas
de ayuda, se puede encontrar en el sitio de B4x en:
Página de documentación de B4A: Lista de Librerías.
Página de documentación de B4i: Lista de Librerías.
Página de documentación de B4J: Lista de Librerías.
Página de documentación de B4R: Lista de Librerías.
Si obtienes un mensaje similar a este, significa que te has olvidado de activar la librería especificada
en la lista de librerías de la pestaña 'Libreries Manager' !
BASIC 67 Lenguaje Basic B4x
B4A, B4i y B4J permiten la manipulación de cadenas de texto como otros lenguajes Basic pero con
algunas diferencias.
3.9.2 B4R
Las cadenas en B4R son diferentes que en otras herramientas B4x. Las razones de estas diferencias
son:
Memoria muy limitada.
Falta de codificadores Unicode.
Un objeto 'String' en B4R es el mismo que 'char* String' en lenguaje C. Es una matriz de bytes con
un byte 0 adicional al final.
El requisito del byte 0 al final hace imposible crear una subcadena sin copiar la memoria a una
nueva dirección.
Por esta razón, las matrices de bytes son preferibles sobre las cadenas.
Los distintos métodos relacionados con el trabajo con cadenas funcionan con matrices de bytes.
Convertir una cadena a una matriz de bytes es muy simple y no requiere ninguna copia en memoria.
El compilador lo hará automáticamente cuando sea necesario:
Private b() As Byte = "abc" 'equivalente a Private b() As Byte = "abc".GetBytes
Métodos de cadena
Los métodos de cadena estándar están disponibles en el tipo 'ByteConverter type' (librería
'rRandomAccessFile').
Nota como cadenas y matrices pueden ser utilizadas ya que el compilador convierte las cadenas a
matrices de bytes automáticamente.
Con la excepción de 'JoinStrings', ninguno de los métodos anteriores hace una copia de la cadena o
los bytes originales.
Esto significa que la modificación de la matriz devuelta como en las últimas tres líneas también va a
modificar la matriz original.
Esto también sucede con cadenas literales ya que todas comparten el mismo bloque de memoria:
Formato de números, muestra los números como cadenas con diferentes formatos:
NumberFormat(Number As Double, MinimumIntegers As Int, MaximumFractions As Int)
NumberFormat(12345.6789, 0, 2) = 12,345.68
NumberFormat(1, 3 ,0) = 001
NumberFormat(Value, 3 ,0) pueden utilizarse variables.
NumberFormat(Value + 10, 3 ,0) pueden utilizarse operaciones aritméticas.
NumberFormat((lblscore.Text + 10), 0, 0) si una variable es una cadena, añade
paréntesis.
BASIC 72 Lenguaje Basic B4x
Formato de números, muestra los números como cadenas con diferentes formatos, hay dos palabras
claves:
NumberFormat(Number As Double, MinimumIntegers As Int, MaximumFractions As Int)
NumberFormat(12345.6789, 0, 2) = 12,345.68
NumberFormat(1, 3 ,0) = 001
NumberFormat(Value, 3 ,0) pueden utilizarse variables.
NumberFormat(Value + 10, 3 ,0) pueden utilizarse operaciones aritméticas.
NumberFormat((lblscore.Text + 10), 0, 0) si una variables es una cadena, añade
paréntesis.
3.10.2 B4R
Formato de números, muestra los números como cadenas con diferentes formatos:
NumberFormat(Number As Double, MinimumIntegers As Int, MaximumFractions As Int)
NumberFormat(12345.6789, 0, 2) = 12,345.68
NumberFormat(1, 3 ,0) = 001
NumberFormat(Value, 3 ,0) pueden utilizarse variables.
NumberFormat(Value + 10, 3 ,0) pueden utilizarse operaciones aritméticas.
NumberFormat((lblscore.Text + 10), 0, 0) si una variable es una cadena, añade
paréntesis.
BASIC 73 Lenguaje Basic B4x
3.11 Temporizadores
Un objeto temporizador genera Eventos cada cierto intervalo de tiempo. El uso de un temporizador
es una buena alternativa a un bucle largo, ya que permite a la interfaz de usuario manejar otros
eventos y mensajes.
Ten en cuenta que los eventos del temporizador no se activarán mientras la interfaz de usuario está
ocupada ejecutando el resto del código(a menos que uses 'DoEvents').
Los eventos de temporizador no se activarán cuando la 'Activity' esté en pausa o un cuadro de
dialogo (como 'Msgbox') es visible.
También es importante desactivar el temporizador cuando la 'Activity' está en pausa y volver a
habilitarlo cuando se reanuda. Esto ahorrará uso de CPU y batería.
Un temporizador tiene:
Tres parámetros.
o Initialize Inicializa el temporizador con dos parámetros, el nombre del evento y
el intervalo.
Timer1.Initialize(EventName As String, Interval As Long)
Ejemplo: Timer1.Initialize("Timer1", 1000)
Un Evento
o Tick La rutina Tick es llamada cada intervalo de tiempo configurado con el
parámetro 'Interval'.
Ejemplo: Sub Timer1_Tick
Sub Process_Globals
Public Timer1 As Timer
BASIC 74 Lenguaje Basic B4x
Pero debe ser inicializado en una de las siguientes rutinas en el módulo donde la rutina del
evento 'Tick' es usado.
Sub Timer1_Tick
' Hacer algo
End Sub
BASIC 75 Lenguaje Basic B4x
Muchas aplicaciones requieren acceso a un almacenamiento persistente. Los dos tipos más comunes
de almacenamiento son los archivos y las bases de datos.
Android e iOS tienen sus propios sistemas de archivos. Ni B4A ni B4i tienen acceso al sistema de
archivos del sistema Windows,
Para agregar archivos a tu proyecto debes agregarlos a la pestaña 'Files' del IDE. Estos archivos se
agregarán a la carpeta 'Files' del proyecto.
El objeto predefinido 'File' tiene una serie de funciones para trabajar con archivos.
Ubicación de los archivos - Hay varias importantes ubicaciones donde puedes escribir y leer
archivos.
File.DirAssets
La carpeta 'assets' incluye los archivos añadidos desde la pestaña 'File Manager' en el IDE.
Es la carpeta 'Files' en la carpeta del proyecto.
Estos archivos son de solo lectura.
No se pueden crear nuevos archivos en esta carpeta (que se encuentra realmente dentro del archivo
apk)).
Si tienes un archivo de base de datos en la carpeta 'Assets', necesitas copiarla a otra ubicación antes
de usarla.
File.DirInternal / File.DirInternalCache
Estas dos carpetas se ubican en la memoria principal del dispositivo y son privadas de la aplicación.
Otras aplicaciones no pueden acceder a estos archivos.
La carpeta de caché puede ser borrada por el sistema operativo si necesita más espacio.
File.DirRootExternal
La carpeta raíz de la tarjeta de almacenamiento.
File.DirDefaultExternal
La carpeta predeterminada para la aplicación en la tarjeta SD.
La carpeta es: <tarjeta de almacenamiento>/Android/data/<nombre del paquete>/files/
Será creada si es necesario.
Ten en cuenta que usar cualquiera de las dos propiedades anteriores, agregará el permiso
'EXTERNAL_STORAGE' a la aplicación.
Sugerencia: También puedes comprobar si hay una tarjeta de almacenamiento y si está disponible
con 'File.ExternalReadable' y 'File.ExternalWritable'.
Ejemplo : MyFile.txt
Ten en cuenta que en B4x los nombres de archivos son sensibles a mayúsculas !
MyFile.txt es diferente que myfile.txt
3.12.3 Subcarpetas
Para acceder a la subcarpeta se debe añadir "/" entre el nombre de la carpeta y la subcarpeta.
ImageView1.Bitmap = LoadBitmap(File.DirInternal & "/Pictures", "test1.png")
O añadir el nombre de la subcarpeta más "/" antes del nombre del archivo.
ImageView1.Bitmap = LoadBitmap(File.DirInternal, "Pictures/test1.png")
3.12.4 TextWriter
Hay otras dos útiles funciones para los archivos de texto: 'TextWriter' y 'TextReader':
Ejemplo:
Private Writer As TextWriter
Writer.Initialize(File.OpenOutput(File.DirRootExternal, "Test.txt" , False))
Ejemplo:
Private Writer As TextWriter
Writer.Initialize2(File.OpenOutput(File.DirRootExternal,"Test.txt" ,False)," ISO-8859-1")
TextWriter.Close
- Cierra el flujo.
Ejemplo:
3.12.5 TextReader
Hay otras dos útiles funciones para los archivos de texto: 'TextWriter' y 'TextReader':
Ejemplo:
Private Reader TextReader
Reader.Initialize(File.InputOutput(File.DirRootExternal, "Test.txt"))
Ejemplo:
Private Reader TextReader
Reader.Initialize2(File.OpenInput(File.DirRootExternal, "Test.txt", "ISO-8859-1")
TextReader.ReadAll As String
- Lee el resto del texto y cierra el flujo.
Ejemplo:
txt = Reader.ReadAll
TextReader.ReadLine As String
- Lee la siguiente línea del flujo.
Los caracteres de nueva línea no son devueltos.
Devuelve 'Null' si no hay más caracteres a leer.
Ejemplo:
TextReader.ReadList As List
- Lee el resto del texto y devuelve un objeto 'List' rellenando cada elemento de la lista con una línea.
Cierra el flujo al terminar.
Ejemplo:
List1 = Reader.ReadList
BASIC 80 Lenguaje Basic B4x
Muchos de los archivos generados por los programas de Windows son codificados con el conjunto
de caracteres ANSI en los países occidentales. Por ejemplo: Archivos csv de Excel, archivos del
Bloc de notas por defecto.
Pero con el Bloc de notas, los archivos se pueden guardar codificados con UTF-8.
Para leer los archivos de Windows codificados con la norma ANSI, debes utilizar el conjunto de
caracteres Windows-1252.
Si necesitas escribir archivos para su uso con Windows también se debe utilizar el conjunto de
caracteres Windows-1252.
Para leer o escribir archivos con una codificación diferente, debes utilizar los objetos 'TextReader' o
'TextWriter' con el método 'Initialize2'. Incluso para leer archivos csv.
BASIC 81 Lenguaje Basic B4x
O
Leer todo el archivo con 'TextReader.Initializa2' y codificación "Windows-1252".
volver a guardarlo con 'TextWriter.Initialize' con la codificación estándar de Android.
Leer el archivo con 'LoadCSV' o 'LoadCSV2' de la librería 'StringUtils'.
Private tw As TextWriter
tw.Initialize(File.OpenOutput(File.DirInternal, "TestCSV1_W.csv", False))
tw.Write(txt)
tw.Close
Cuando se guarda un archivo con el Bloc de notas se agregan tres bytes adicionales.
Estos bytes son llamados caracteres BOM (Byte Order Mark).
En UTF-8 son representados por esta secuencia de bytes: 0xEF,0xBB,0xBF.
Un editor de textos o un navegador web que interprete el texto como Windows-1252 mostrará en
pantalla los caracteres .
Para evitar esto se puede utilizar Notepad++ en lugar del Bloc de notas y usar codificar en UTF-8
sin BOM.
Otra posibilidad para cambiar un texto de Windows-1252 a UTF-8 es utilizar el código de abajo.
Initialize2 (AlgunaMatriz)
Inicializa una lista con los valores dados. Este método debe ser utilizado para convertir
matrices en listas. Ten en cuenta que si pasas una lista a este método, a continuación ambos
objetos comparten la misma lista, y si pasas una matriz la lista será de un tamaño fijo.
Una lista puede contener cualquier tipo de objeto. Sin embargo, si una lista es declarada como un
objeto 'Process Global' no puede contener objetos de 'Activity' (como las 'Views').
B4x convierte automáticamente las matrices normales en listas. Así que cuando se espera una lista,
se puede pasar una matriz en su lugar.
Utiliza el método 'Get' para obtener un elemento de la lista con (Índices de lista basados en 0):
Para obtener el primer elemento utiliza Get(0).
Para obtener el último elemento utiliza Get(Lista1.Size - 1).
Get(Index As Int)
elemento = Lista1.Get(i)
Puedes utilizar un bucle 'For' para iterar a través de todos los valores:
For i = 0 To List1.Size - 1
Private elemento As Int
elemento = Lista1.Get(i)
...
Next
Una lista puede ser ordenada (los elementos deben ser números o cadenas de texto) con :
Sort(Ascending As Boolean)
Lista1.Sort(True) orden ascendente
Lista1.Sort(False) orden descendente
SortCaseInsensitive(Ascending As Boolean)
Las claves son únicas. Lo que significa que si se agrega un par de clave/valor (entrada) y la
colección ya tiene una entrada con la misma clave, el de la entrada anterior será eliminado del 'map'.
La clave debe ser una cadena de texto o un número. El valor puede ser cualquier tipo de objeto.
Al igual que listas, un 'map' puede contener cualquier objeto, sin embargo, si se trata de una
variable de 'Process_Global', no puede contener objetos de 'Activity' (como las 'Views').
Comprobar si el 'Map' contiene una entrada, comprueba si hay una entrada con la clave dada :
ContainsKey(Key As Object)
If Map1.ContainsKey("Idioma") Then
Msgbox("Ya existe una entrada con esta clave!", "ATENCIÓN")
Return
End If
BASIC 85 Lenguaje Basic B4x
4 Herramientas de ayuda
Para encontrar respuestas a muchas preguntas acerca de B4x las siguientes herramientas son muy
útiles.
Y el resultado:
Este programa muestra los archivos xml de ayuda. Fue escrito originalmente por Andrew Graham
(agrham) para B4A. Lo he modificado, con el consentimiento de Andrew, para mostrar los archivos
xml de ayuda de B4A, B4J, B4i y B4R.
Motor de búsqueda para encontrar el objeto por una palabra clave determinada.
Cierra B4AHelp
Librerías estándar
Una vez seleccionado el directorio se guarda para la próxima vez que se inicie el programa.
BASIC 91 Lenguaje Basic B4A
Este también es un programa independiente de Windows que muestra los archivos de ayuda de las
librerías.