Curso Básico de Programación
en Visual Basic
Tercera
Entrega: 14/Jun/97.
por Guillermo "guille" Som
![]()
Bien, después de un mes y pico, seguimos con la tercera entrega del curso "super-básico" de programación con Visual Basic. Si quieres ver las entregas anteriores, pulsa en los siguientes links: este para la Primera y este otro para la Segunda.
Esta entrega la voy empezar con recomendaciones e instrucciones del buen hacer en Visual Basic, espero que sigas algunas, preferiblemente todas, estas normas.
Ya has visto
cómo maneja el Visual Basic las variables, si a esta
"libertad" (aunque más bien es libertinaje), le
añadimos que no nos obliga a nada, es decir el VB nos está
diciendo: "puedes usar las variables para lo que
quieras, cómo quieras (o casi) y cuando
quieras"
Y esto en principio podría parecer una buena cosa, pero
realmente es un mal hábito, que muchos de los que venís del
BASIC, ya teneis formado y creo que ahora sería un buen momento
para empezar a cambiar.
Lo primero que
debes hacer es ir al menú Herramientas (Tools) y en Opciones
(Options) marca la casilla que indica "Requerir declaración
de variables" (Require Variable Declaration), esto añadirá
a cada nuevo módulo (FRM, BAS o CLS) la siguiente instrucción: Option
Explicit, de esta forma tendrás la obligación de
declarar cada una de las variables que uses en el programa. Y tu
preguntarás: ¿Para que obligar a que se declaren las
variables? La respuesta es bien sencilla: para que las
declares... (algunas veces me asombro de la
lógica tan aplastante de mis comentarios)
Bromas aparte, es recomendable que declares las variables que
vayas a usar y te diría más: no sólo es bueno declarar las
variables, sino que mejor aún es declararlas del tipo adecuado.
Ya vimos que hay diferentes tipos de variables, no sólo de tipos
genéricos como podrían ser para almacenar caracteres y
números, sino que dentro de las numéricas hay varios tipos, y
cada uno de ellos tiene una razón de ser.
En mis tiempos del BASIC normalito, es decir del MS-DOS, no
existía esta obligación de declarar "forzosamente"
las variables y cuando estabas escribiendo un programa (proyecto
que lo llaman ahora), grande, acababas
"invitablemente" usando más variables de la cuenta
porque ya no recordabas si la variable "i" o
"j" estaba siendo usada a nivel global o no... (yo es
que con el despiste que gasto, me veía creando las variables
"ii", "j2", etc, para no "meter la
pata")
y esto no era lo peor, al fin y al cabo lo único que ocurría
era que estaba "desperdiciando" memoria, por no tener
un control de las variables que estaba usando; lo malo era que se
podían escribir erróneamente los nombres de las variables de
forma que al final, el programa no funcionaba bien porque al
escribir un nombre de variable, habíamos cambiado el nombre...
era frustrante y algunas veces te volvías loco buscando el
fallo...
La ventaja de usar el Option Explicit, es que si
escribes mal una variable, el VB te avisa... bueno, algunas veces
te avisa, sobre todo cuando se encuentra con la variable
"mal escrita".
Aquí viene la
segunda recomendación del día: cuando ejecutes un
programa, hazlo con Control+F5, de esta forma se hace una
compilación completa y "más o menos" exhaustiva del
código, avisándote cuando hay algo que no "cuadra",
con el VB3 no había problemas, ya que siempre se hacía la
compilación completa, pero desde el VB4 se puede pulsar F5 y
hasta que no llega al procedimiento actual, no comprueba si todo
lo que hay en él está correcto.
Así que para "curarte en salud" procura hacer la
compilación completa
La
tercera recomendación no es obligatoria, siempre que
sigas la que voy a dar después, esta es uan norma que también
he usado desde mis tiempos de MS-DOS (aunque
reconozco que últimamente no la pongo en práctica, ya que hago
lo que después comentaré en la cuarta recomendación).
En todos los módulos, antes sólo eran BAS, ponía al principio
la siguiente línea:
DEFINT A-Z
de esta forma le indicaba al BASIC que mi intención era usar
todas las variables del tipo Integer (entero), (realmente
después usaba del tipo que me daba la gana, pero mi primera
intención era no complicarme la vida con la mayoría de las
variables), cuando quería usar una variable diferente de
Integer, le indicaba "explicitamente" de que tipo era y
así me obliga a usar la mayoría de ellas de este tipo que a la
larga es o era el más usado, ya que para hacer bucles (ya te
explicaré en un ratillo que es eso de los bucles y cómo
hacerlos en VB) y otros cálculos
"normales", era más que suficiente y en la mayoría de
los casos: más rápido.
En Basic, y por supuesto todavía en Visual Basic, aunque cada vez va a menos, se puede indicar el tipo de una variable de varias formas, al declararlas con Dim, vimos que se hacía de la siguiente forma:
Dim unNumero
As Integer
Dim unNumeroLargo As Long
Dim otroNumero As Single
Dim masNumeros As Double
Dim unNombre As String
Dim multiUso As Variant
Cada una de
estas varibales es de un tipo distinto, las cuatro primeras
numéricas, la quinta para almacenar cadenas de caracteres y la
última del tipo por defecto del VB: Variant que como su nombre
indica (aunque en inglés), es Variante y puede almacenar
prácticamente cualquier cosa, objetos incluidos, (ya veremos los
objetos en otra ocasión). Lo del tipo por defecto, es siempre
que no se haya especificado un tipo determinado para todas las
variables, por ejemplo usando el DEFINT A-Z, el tipo por defecto
ya no es Variant, sino Integer.
Al grano, "quesnoche", a lo que iba era que además de
declarar las variables de esta forma, también se puede hacer de
de esta otra:
Dim unNumero%
Dim unNumeroLargo&
Dim otroNumero!
Dim masNumeros#
Dim unNombre$
En el caso de
Variant no existe un caracter especial para indicar que es de ese
tipo, así que cuando quieras usar una varible Variant, tendrás
que declararla como en el primer ejemplo.
Aún queda otro carácter para otro tipo de datos numérico, el
tipo Currency que se puede declarar con @. Estre tipo ocupa 8
bytes y permite guardar números de tipo moneda, es decir
números no enteros, pero con un número determinado y fijo de
decimales, ahora no recuerdo, pero en la ayuda o en los manuales
podrás ver la "retaila" de números que cada tipo
admite.
Para terminar con las recomendaciones de hoy, voy a indicarte algo que debes tener en cuenta cuando declaras variables y que aún los más expertos caen en la trampa.
Además de
declarar las variables con Dim, poniendo cada declaración en una
línea, cosa que por otro lado queda bastante claro y es como
suelo hacerlo, aunque últimamente estoy volviendo a cojer malos
hábitos... ¿será la edad?
También se pueden declarar más de una variable con un mismo
DIM, vamos a verlo con un ejemplo:
Dim Numero As Integer, NumeroLargo As Long, otroNum As
Single, Nombre As String, Numerazo As Double
por supuesto también valdría de esta otra forma:
Dim Numero%, NumeroLargo&, otroNum!, Nombre$,
Numerazo#
Y si me apuras, también de esta otra:
Dim Numero%, NumeroLargo As Long, otroNum As Single,
Nombre$, Numerazo#
Pero sea como
fuere, en todos los ejemplos se ha especificado el tipo que
queremos asignar.
Por supuesto también podremos declarar varibales de esta forma:
Dim unaVariable, otraVariable, terceraVariable
Pero, surge esta pregunta ¿de que tipo son estas tres variables?
(al menos se espera que te
surja...)
La respuesta es bien sencilla, si se ha entendido toda la
"retahila" que te he soltado anteriormente:
Serán del tipo Variant o del especificado con el DEFINT
A-Z (es decir Integer)
Voy a suponer que la tercera recomendación no la estás poniendo
en práctica, por tanto serían del tipo Variant.
Pero fijate
que podrías caer en el error, sobre todo si has programado algo
en C, de pensar que esta línea:
Dim Numero, otroNumeroInt, elTercero As Integer
o esta otra:
Dim Numero As Integer, otroNumeroInt, elTercero
están declarando tres números Integer y no es así, lo que se
está declarando sería, en el primer caso:
Numero y otroNumeroInt como
Variant y elTercero como entero.
en el segundo caso sólo Numero sería del tipo
entero y las otras dos variables del tipo Variant.
Sería "ideal" que fuese como aparenta, pero el VB no hace estas "virguerías", ni incluso en la versión 5.
Por tanto,
cuando declares variables, fijate bien de que tipo son las que
estás declarando, para no llevarte sorpresas, sobre todo con los
redondeos y errores de desbordamiento...
Un desbordamiento se produce cuando asignamos a un número un
valor mayor del que está capacitado para almacenar, así si un
entero sólo acepta valores de +/- 32767 (realmente
acepta hasta -32768), al asignarle un valor de
40000, nos dirá que "tururú" y dará
error.
En cuanto a que tipo de variable usar en cada caso, tendrás que tener en cuenta que quieres hacer. Normalmente en los bucles se suelen usar variables enteras, bien Integer, si sabemos que no nos vamos a pasar de 32767, bien Long Integer que puede almacenar un valor de dos mil y pico millones... (¡quien los tuviera, aunque fuese en calderilla!)
Vamos a ver un
ejemplo (al fin algo de código se
escucha entre el público...), con este código podrás
comprobar la velocidad de los bucles con los distintos tipos de
varibales y así poder comprobar cual es la más adecuada.
Crea un nuevo proyecto y asigna unos cuantos Labels (6 en total)
y un botón.
Cuando ejecutes este programilla, puedes ir tranquilamente a
tomar café, porque se tomará su tiempo...
En teoría nos mostrará el tiempo que emplea en hacer unos
bucles con tipos diferentes de datos. Para que sea fiable,
deberás especificar unos valores altos, ya que con números
pequeños no es demasiado fiable, e incluso con números altos
tampoco... la cosa era poner algo de código para
"rematar" el capítulo de hoy...
En la próxima entrega explicaré las intrucciones que se han
usado y en algunos casos, explicaré hasta el por qué
de usarlas.
Osea esto es lo que se dice un programa inútil que además de consumir recursos del sistema y hacernos perder el tiempo, no vale para nada... (es que después de probarlo, me he dado cuenta de que o todos los formatos son prácticamente igual de rápidos o yo he estado "engañado" durante todo este tiempo...)
Option Explicit
Private Sub Command1_Click()
Dim nInt As Integer
Dim nLng As Long
Dim nSng As Single
Dim nDob As Double
Dim nCur As Currency
Dim nVar As Variant
Dim timer1#, timer2 As Double
Const minBucle = 1, maxBucle = 10
Command1.Caption = "Calculando..."
timer1 = Timer
For nInt = minBucle To maxBucle
Contar CInt(nInt), Label1
Next
timer2 = CDbl(Timer - timer1)
Label1 = "Duración con Integer: " & timer2
DoEvents
timer1 = Timer
For nLng = minBucle To maxBucle
Contar CInt(nLng), Label2
Next
timer2 = CDbl(Timer - timer1)
Label2 = "Duración con Long: " & timer2
DoEvents
timer1 = Timer
For nSng = minBucle To maxBucle
Contar CInt(nSng), Label3
Next
timer2 = CDbl(Timer - timer1)
Label3 = "Duración con Single: " & timer2
DoEvents
timer1 = Timer
For nDob = minBucle To maxBucle
Contar CInt(nDob), Label4
Next
timer2 = CDbl(Timer - timer1)
Label4 = "Duración con Double: " & timer2
DoEvents
timer1 = Timer
For nCur = minBucle To maxBucle
Contar CInt(nCur), Label5
Next
timer2 = CDbl(Timer - timer1)
Label5 = "Duración con Currency: " & timer2
DoEvents
timer1 = Timer
For nVar = minBucle To maxBucle
Contar CInt(nVar), Label6
Next
timer2 = CDbl(Timer - timer1)
Label6 = "Duración con Variant: " & timer2
DoEvents
Command1.Caption = "Calcular"
End Sub
Private Sub Contar(valor As Integer, etiqueta As Control)
Dim i As Integer
Dim unDoble As Double
Const elMaximo = 1000&
For i = 1 To elMaximo
unDoble = unDoble + 1
etiqueta.Caption = valor * elMaximo + unDoble
DoEvents
Next
End Sub
Te espero en la próxima entrega. Y como te digo y seguiré diciendote: espero que me mandes tus comentarios, para saber si sólo lo estais leyendo tú y alguien más... es que si no me dices nada, me aburro y acabaré por dejarlo...
![]()