Conceitos Básicos - LBasic
Conceitos Básicos - LBasic
Conceitos Básicos - LBasic
0. Crditos. 1. Introduccin. 1.1. Qu es programar. 1.2. El lenguaje Basic. 1.3. Las variables. 1.4. Operadores. 1.4.1. Operadores aritmticos. 1.4.2. Operadores relacionales. 1.4.3. Operadores lgicos. 1.4.4. Operadores de bits. 1.5. Arrays. 1.6. La orden de asignacin. 1.7. Bucles. 1.8. Instrucciones de bifuracin. 1.9. Tratamiento de cadenas. 1.10. Un programa ms. 2. Algunas rdenes de Basic. 2.1. Entrada y salida. 2.2. Manejo de archivos secuenciales. 3. Programacin del interface grfico. 3.1. Su primera ventana. 3.2. Cmo aadir controles a una ventana. 3.3. Organizacin de un programa en un entorno GUI. 3.4. Cmo trabajar con los cuadros de dilogo.
0. Crditos. Estos apuntes los he recopilado reuniendo y traduciendo informacin proveniente en su mayor parte desde la comunidad de usuarios de Liberty Basic. La ayuda y el tutorial que el creador suministra son tambin muy interesantes y he seleccionado algunos fragmentos; el tutorial tiene una estructura desde una mera introduccin a cuestiones avanzadas y he seguido aproximadamente la tcnica de ir profundinzando poco a poco en los conocimientos. Como siempre en internet existen algunas pginas donde se pueden encontrar multitud de ejemplos de programacin que los usuarios de Liberty Basic ponen a disposicin de cualquier usuario. Por ello, estos apuntes son de dominio pblico y pueden ser reproducidos o distribuidos, respetando su forma original y slo con el objetivo de ayudar a cualquier usuario que quiera aprender a usar este lenguaje de programacin. Se pide, por tanto, que sean usados con el fin para el que se concibieron. La direccin de donde he obtenido el Liberty Basic y gran parte de la informacin que aqu se contiene es: http://www.libertyBasic.com
Windows pareca restringida a un selecto grupo de programadores que dominaran el lenguaje C o, como mucho, Visual Basic. Tras algunos aos de espera, empiezan a aparecer herramientas de uso mucho ms sencillo que facilitan la creacin, depuracin y puesta a punto de aplicaciones a nivel de usuario domstico. El Liberty Basic es una de ellas y pretende crear aplicaciones usando un lenguaje de programacin muy conocido por gran nmero de personas, pero con unos aadidos al efecto que le permiten adaptarse a los nuevos requerimientos de un interface grfico de usuario para que sean ms fciles de usar en Windows. Liberty Basic es una aplicacin Windows y funcionalmente trabaja como una herramienta diseada para facilitarle el desarrollo de programas en este entorno. Naturalmente, cada usuario crear las aplicaciones sirvindose del lenguaje de programacin que le venga en gana, pero la gran ventaja de un entorno de manejo muy sencillo y un lenguaje de programacin muy conocido por muchos programadores pueden hacer reconsiderar la eleccin a un usuario que no quiera realizar aplicaciones de gran nivel. El precio de Liberty Basic es otra ventaja, pues no es excesivamente caro y existen versiones shareware. Liberty Basic incluye: 1. Un generador visual de formularios: freeform. 2. Un lenguaje de programacin casi igual al Basic, pero con algunos aadidos para adaptarse a los requerimientos de un interface grfico de usuario como Windows. 3. Una herramienta para el seguimiento y depuracin de la ejecucin de las aplicaciones que desarrollamos. 4. Capacidades para trabajar de forma sencilla con dlls y apis: si siegue estos apuntes aprender lo que son. 5. Capacidad para trabajar con hojas de clculo: spreadsheet. 6. Capacidad para trabajar con colores y grficos. Algunos conceptos quiz no los entienda. Si no sabe Basic, considere la posibilidad de aprenderlo. En lenguaje C se hacen aplicaciones de gran nivel, pero es ms difcil de aprender y el viejo Basic con algunos aadidos es el ncleo que nos permitir entender y manejar Liberty Basic y, quiz ms adelante, dar el paso hacia Visual Basic: es slo cuestin de planteamiento, que no de nivel alcanzado en el desarrollo de aplicaciones Windows. No todo son ventajas en Liberty Basic. La versin shareware slo permite ejecutar las aplicaciones si tenemos Liberty Basic instalado. Incluso en la versin registrada, no es posible generar un fichero con extensin exe y entregarlo a otros usuarios para que lo ejecuten. Es necesario tener algunos archivos ms que se distribuyen con la aplicacin. Asimismo, los programas que se pueden desarrollar con Liberty Basic no son ni mucho menos profesionales, pero en la mayora de los casos un usuario final desea resolver un problema y si ste no es excesivamente complejo lo podr realizar en muy poco tiempo y con un tiempo de aprendizaje mucho menor que el requerido para otros entornos de desarrollo. Con estos apuntes no se pretende resolver de forma profesional las necesidades de usuarios avanzados; en cambio, los usuarios novatos y los de tipo medio encontrarn mucha informacin y muchos casos prcticos que les pueden ayudar a crear y poner a punto pequeas aplicaciones en entorno Windows y, en la mayora de los casos pueden llegar a resolver gran nmero de problemas. Antes de empezar, es muy importante tener algunas ideas sobre qu es un ordenador, qu partes tiene, qu es un programa, cmo se realiza el trabajo de programacin: desde la concrecin abstracta de una idea que es el objeto del problema que queremos resolver hasta su descripcin detallada por escrito de forma que otros usuarios lo entiendan y, por ltimo, transcribir todo lo anterior sirvindose de un lenguaje de programacin y, por ltimo, hacer que el ordenador lo entienda, dando como resultado final la aplicacin que queramos desarrollar. Comprobar si la aplicacin funciona, as como si cumple con nuestras previsiones es tambin una de las tareas que tendremos que realizar. Para esto, cualquier libro de informtica bsica, sobre fundamentos de programacin, y, si lo encuentra, algn libro de introduccin al lenguaje Basic le puede servir. Estos apuntes presuponen unos conocimientos medios sobre estas materias.
1.1. Qu es programar. Lo primero que debemos hacer cuando queremos resolver una tarea con la ayuda de un ordenador es precisarla bien, esto es, concretar con un nivel de detalle suficiente qu acciones se deben de llevar a cabo para conseguir el fin que nos proponemos. Esto es lo ms importante de la programacin y todos los cursos de esta disciplina lo nico que hacen es dotar a los alumnos de la experiencia y la habilidad mental suficientes para que despus puedan abordar otros problemas, merced al conjunto de conocimientos y al hbito adquirido en resolver gran cantidad de casos prcticos que a veces parecen tonteras. Como el grado de dificultad va creciendo los alumnos se van habituando poco a poco a resolver casos de programacin muy diferentes. Ahora bien, el concepto de programacin ha cambiado mucho. En los sistemas orientados a texto, como MS-DOS, el usuario realizaba su trabajo, traduciendo el problema que quera resolver a cierto lenguaje de programacin, lo tecleaba y, con ms o menos fortuna, al final obtena su aplicacin. Los entornos de programacin en MS-DOS han mejorado mucho, pero en esencia el trabajo siempre es el mismo. Con la aparicin de los entornos grficos de usuario, el programador se debe preocupar ahora de dos aspectos igualmente importantes: 1. Como antes el programa debe resolver igualmente el problema para cuya solucin fue concebido. Se debe igualmente traducir el conjunto ordenado de pasos que el ordenador debe dar al lenguaje de programacin que conozca. 2. Adems, las aplicaciones deben de dotarse de un interface visual adecuado a los nuevos requerimientos. Por ejemplo, si un programa necesita que el usuario introduzca cierta informacin mediante el teclado, el sistema debe reaccionar de tal forma que no se detengan las aplicaciones que estn actualmente en ejecucin. Asimismo, la persona que maneja la aplicacin que hemos desarrollado puede decidir abandonarla y pasar a otro programa y, despus de realizar alguna operacin volver sobre ella. Esta nueva circunstancia exige de un cuidado diseo de la informacin que el ordenador entrega a la salida y cmo la aplicacin reacciona ante las operaciones que realiza el usuario. De la mejor o peor manera en que diseemos este modo de operacin, el usuario se encontrar ms o menos cmodo con el trabajo que realiza y podr obtener el mximo provecho. Esta segunda caracterstica que tambin estaba ya presente en los viejos entornos de programacin orientados a texto se presenta ahora como muy importante y en estos apuntes ser tratada extensamente. En otras palabras cualquier programa necesita: 1. Disponer de unos datos de entrada. 2. Realizar determinadas operaciones de clculo y de manipulacin de datos. 3. Entregar una informacin a la salida, que el usuario pueda interpretar correctamente. El trabajo del programador consiste, precisamente, en que los datos sean entregados al ordenador en forma adecuada, hacer que ste realice los clculos necesarios de forma precisa y, por ltimo, entregar una informacin que el usuario entienda, resolviendo el problema que era el objeto de nuestro trabajo. Todo lo dems lo da la experiencia, el haber cometido muchos errores, tener hbitos para escribir programas con cuidado, depurarlos y saber darse cuenta que una aplicacin est fallando: esto no se aprende con cursos de programacin, sino con la prctica.
1.2. El lenguaje Basic. Se trata de un lenguaje de programacin de propsito general, pero muy sencillo y fcil de aprender. Propsito general significa que este lenguaje de programacin no est especializado en ningn tipo de tareas. Esto le quita facilidad para ajustarse a la resolucin de determinado tipo de problemas,
pero le otorga grandes ventajas porque se puede adaptar a multitud de casos de programacin y hay muchsima gente que usa este lenguaje y que pone lo que hace en Internet al alcance de todos. Basic proviene de (Beginners All purpose Symbolic Instruction Code). Fue desarrollado en los aos 60 como un lenguaje muy fcil de usar para programadores novatos, pero ha tenido bastante xito. En el campo de los lenguajes de programacin se distinguen dos grandes grupos. Como el ordenador no puede entender ms que lenguaje binario, que es el fundamento de su modo de operacin, es necesario traducir de alguna forma las instrucciones que tienen todos los lenguajes de programacin. El programador escribe sus programas en un archivo que se llama cdigo fuente. 1. El primer grupo se vale de un programa especial llamado intrprete que va traduciendo una a una las instrucciones del cdigo fuente. El Basic es un lenguaje que en principio fue interpretado. Despus ha habido una gran evolucin y para MS-DOS, por ejemplo, hay versiones de Basic que son interpretadas y otras que pertenecen al siguiente grupo. 2. El otro grupo de lenguajes se valen de un programa especial que se llama compilador que traduce en forma completa el cdigo fuente. El compilador genera un archivo especial que contiene informacin binaria, que nosotros no entendemos, pero s el ordenador. Esto se llama cdigo objeto. Si se quiere, esto puede dar lugar a archivos de extensin .exe o .com, pero aqu no veremos este proceso, pues no es el caso de Liberty Basic. Empezaremos por algunas definiciones. Siga poco a poco profundizando y ver que aunque al principio los programas sean realmente tonteras, en menos de un mes puede conseguir cosas realmente interesantes a nivel de usuario inicial. Se trata de realizar un programa que acepte por teclado el precio de un producto y exhiba en pantalla el precio del producto, el impuesto de valor aadido (17%) y el total, que es la suma del precio del producto ms el de dicho impuesto. 1. La informacin de entrada consiste solamente en un valor numrico que es el precio del producto. 2. El clculo del programa es el siguiente: el I.V.A. se averigua multiplicando el precio del arttuclo por 0,17. El total se averigua sumando el precio del artculo ms el del impuesto. 3. La salida consiste en exhibir en el formato adecuado y de forma perfectamente legible estos resultados. La mayora de los lenguajes de programacin y Basic lo hace as, usan una manera simblica de identificar los nmeros cuando stos pueden tomar diferentes valores. Como el precio de un producto puede variar usan un smbolo que en la memoria del ordenador identifica de forma nica el lugar donde tal nmero puede ser almacenado. A estos smbolos se les llama variables y son importantsimos en Basic para entender cmo tiene lugar la ejecucin de un programa. 'programa: valor aadido 'descripcin: acepta por teclado el precio del producto y genera 'un informe en pantalla con el impuesto y el total que es la suma 'del precio del producto ms el impuesto (I.V.A.) 'entrada input "precio del producto: ";produ 'clculo let impuesto = prod * 0.17 let total = prod + impuesto 'salida print "el precio es: ";prod print "el impuesto es: ";impuesto print "el total asciende a: ";total end No debe confundirse una variable que no es ms que un smbolo donde se almacena determinada informacin con una palabra del lenguaje de programacin, que ordena cmo han de ser ejecutadas las operaciones del
mismo. Habr observado la presencia de smbolos como * y + que son signos para las operaciones con nmeros o con variables que los representan. En fin de cuentas, un lenguaje de programacin pretende resolver la creacin de un programa con los siguientes elementos: 1. Variables: para contener la informacin que el ordenador maneja. 2. Operadores: los hay de varios tipos, pero su misin fundamental es la realizacin de clculos para conseguir los resultados adecuados. 3. Las rdenes: que son palabras especiales, generalmente en ingls, que indican lo que se ha de hacer. Todo lenguaje de programacin contiene siempre estos tres apartados con mayor o menor dificultad de aprnedizaje, segn las peculiaridades de cada uno. Si no lo ha hecho an, este es el momento de instalar Liberty Basic. Normalmente se trata de un archivo con extensin zip. Se guarda en un directorio temporal de nuestra eleccin y all se descomprime para proceder posteriormente a la instalacin. La descompresin se puede hacer con pkunzip.exe en MS-DOS o con el Winzip en Windows. Para instalar Liberty Basic debe ejecutar el fichero install.exe que es uno de los que se genera en la descompresin del archivo con extensin zip. Le aparecen unos cuadros de dilogo y no tiene ms que seguir las instrucciones que se le van suministrando para tener el programa instalado. Para ejecutar Liberty Basic puede usar el men de inicio, pues se crea una opcin especfica al instalarlo. Cuando se arranca el programa le aparece una ventana estndar de Windows con su barra de ttulo, su barra de men y los botones tpicos de cerrar, restaurar, etc. En el interior de la ventana, que es el rea de cliente nos encontramos con un editor de texto que es donde se teclea el programa. Como es un editor de texto de Windows, puede abrir un archivo, lo puede guardar, imprimir y, ms an: puede pegar desde el portapapeles texto que ha cortado o copiado desde otras aplicaciones Windows. El men archivo y el de edicin tienen la misma filosofa que en las aplicaciones Windows estndar. Para ejecutar el programa. Pulse shift+f5. Asimismo existe el men ejecutar que le permite depurar y poner a punto la aplicacin que pretende desarrollar cuando un error se resiste y empiezan a aparecer dificultades. El men ayuda le permite obtener ayuda en cualquier momento.
1.3. Las variables. Recuerde que una variable es un smbolo que se usa en programacin para identificar la informacin guardada en determinada zona de memoria. El nombre del smbolo en Liberty Basic debe empezar por una letra y puede contener letras, caracteres numricos y otros como subrayado, guin, punto, etc. Hay versiones de Basic que slo consideran los ocho primeros caracteres de las variables. Liberty Basic no es as. Adems las letras maysculas y minsculas tambin son significativas, por lo que midatos y MiDatos no son lo mismo. Sea muy estricto con los nombres de las variables. Son una fuente de error considerable y el uso de nombres nemotcnicos y su buena documentacin le facilitarn en gran medida la depuracin de los programas con posterioridad. Liberty Basic acepta dos tipos de variables: numrico y cadena de caracteres. Desde luego no empezamos bien, pero el programa cuando se trata de tipos numricos optimiza siempre con el objetivo de no perder precisin cuando hace clculos con nmeros con muchos decimales. En el caso de operar con nmeros enteros convierte las variables involucradas en la operacin de modo tal que son ms fciles de manejar, lo que hace ganar velocidad. En principio no tendra que haber problemas para nmeros enteros, pues el rango es suficiente. En el caso de nmeros reales, se exhiben por defecto 9 cifras decimales, pero podran exhibirse hasta 18. Observe lo siguiente: 'exhibe la raz cuadrada de 2 con 18 cifras
print using("#.#################", 2 ^ 0.5) 'el operador ^ quiere decir elevado a Las variables de cadena de caracteres pueden contener ninguno, uno o ms caracteres. Se llama longitud cuando hablamos de este tipo de variables al nmero de caracteres que contiene, aunque sean espacios. No existe limitacin a la longitud de estas variables, ya que slo est limitada por la memoria del ordenador. Liberty Basic, como muchos otros Basic es muy elstico respecto al tipo de variables: una variable de cadena puede contener un valor numrico y a la inversa. Las tablas o arrays s que tienen tipo cuando se declaran, pero las variables no. Esto ms que ser una ventaja es un inconveniente y sera mejor que tuviera las cosas claras desde el principio y usara las variables coherentemente. Si en el futuro desea programar en un lenguaje ms estricto este hbito le resultar muy beneficioso. Tradicionalmente las variables de cadena de caracteres llevan al final del nombre el smbolo $. Liberty Basic no lo exige as, pero sera conveniente que lo hiciera, por compatibilidad con el Basic tradicional y sobre todo porque si alguna vez programa en otros lenguajes ms estrictos y evolucionados debe declarar las variables antes de usarlas, indicando adems el tipo de datos que stas pueden contener.
1.4. Operadores. Lo que mejor se le da a los ordenadores es hacer operaciones aritmticas y lgicas a gran velocidad. Por eso todos los lenguajes de programacin poseen un conjunto de operadores que sirven para permitir la realizacin de operaciones aritmticas y lgicas con los datos. Lo que los lenguajes de programacin hacen es permitir la posibilidad de realizar operaciones bien con nmeros o con las variables que representan.
1.4.1. Operadores aritmticos. Los operadores clsicos son: signo ms (+) para sumar, signo menos (-) para restar, asterisco (*) para multiplicar, barra oblicua (/) para dividir. Tambin se dispone del operador (^) para elevar un nmero a otro. He aqu algunos ejemplos. Recuerde que la orden Let sirve para asignar a una variable lo que est a la derecha del signo igual. Let Variable1 = 3+2-4 Let Variable2 = 5*2+10/2 Let Variable3 = 2^0.5 Observe adems en los ejemplos que figuran a continuacin que el signo igual sirve para mucho ms que asignar: Let Variable1 = 1 Let Variable1 = Variable1 + 1 Esto algebraicamente no tiene ningn sentido, pero en los lenguajes de programacin ms comunes quiere decir que primero se evala la expresin a la derecha del signo igual, como Variable1 vale 1, 1+1=2. Ese resultado se asigna a la variable a la izquierda del signo igual, con lo que ahora Variable1 pasa a valer 2. As se incrementan o decrementan las variables, lo que permite hacer con mucha facilidad programas que pueden contar las veces que ocurre un determinado fenmeno y podemos tener una gran flexibilidad en la asignacin y manejo de variables. Otro ejemplo de asignacin y uso de operadores aritmticos: Let ResHorizontal = 640 Let ResVertical = 480 Let NumeroPixels = 640 * 480
'que es equivalente a lo siguiente: Let NumeroPixels = ResHorizontal * ResVertical En las variables que pueden contener cadenas de caracteres, el operador indicado con el signo ms (+) concatena o une dos variables. POr ejemplo: Let Msg1$ = "mi nombre es " Let Msg2$ = "ricardo" Let c$ = Msg1$ + Msg2$ Es muy importante la jerarqua o precedencia de los operadores: primero se efectan las multiplicaciones y divisiones, despus las sumas y restas. No obstante, este orden se puede alterar con el uso de parntesis. Si no est seguro de cmo se va a evaluar una expresin determinada, asegure por medio de parntesis el orden que ms le convenga. Let A = 1 Let X = 7 Let A = A * (X + 1) / 2 Primero se evala la suma x+1 que vale 8. Luego se multiplica el actual valor de A que es 1 por 8 y se divide por 2, con lo que la variable A toma el nuevo valor de 4.
1.4.2. Operadores relacionales. Adems de buenas calculadoras los ordenadores destacan por una asombrosa capacidad de hacer comparaciones entre diferentes datos. Todo esto es encargado a los operadores relacionales que, a diferencia de los operadores aritmticos, su accin genera un resultado de tipo lgico. Esto quiere decir que el resultado es uno de los dos posibles: verdadero (true) o falso (false). Liberty Basic asigna como valor verdadero (-1) y como valor falso el cero. Estos operadores siempre estn entre dos expresiones homogneas. Antes de aplicar el operador relacional se han de calcular el valor de cada expresin que relaciona. Hecho esto, se aplica el operador relacional a los dos valores previamente calculados. Estos operadores son siempre binarios, esto es: ligan dos expresiones, de forma que una est antes del mismo y la otra despus. Con el trmino expresiones homogneas se hace referencia a que no se puede comparar un nmero entero con una variable de tipo cadena de caracteres pues ya dice el refrn que no se puede comparar la velocidad con el tocino. En Liberty Basic esto s se puede hacer, pero no es buena tcnica de programacin proceder de este modo. Aunque el compilador no genere un error, pueden aparecer resultados muy difciles de depurar, puesto que est intentando realizar operaciones lgicas con cosas que no tienen nada que ver. Los principales operadores relacionales son: = operador identidad. Se pone entre dos expresiones y ser cierto si las dos expresiones son iguales y falso en caso contrario. Puede poner expresiones numricas o de cadena de caracteres. Por ejemplo: let a = 1 let b = 2 let b = b - 1 if a = b then c$ = "juan" else c$ = "pedro" if c$ = "" then pirnt "cadena nula" if c$ = "juan" then print "hola juan" if c$ = "pedro" then print "hola pedro" <> operador no identidad. Ser cierto si las expresiones a su izquierda y a su derecha no son iguales y falso en caso contrario. Se aplican
las mismas reglas que para el caso anterior. Let A = Let B = Let C = Let A = if A <> 1 2 3 A + 1 b then end
En este caso la condicin ser falsa, pues al tratarse del mismo ejemplo de antes, a es igual a b, con lo que la condicin a distinto de b es falsa. < operador menor que. Da un resultado verdadero cuando la expresin situada a la izquierda del mismo es menor que la que se suta a su derecha. De significado muy parecido son los operadores: <= que es cierto cuando la expresin de la izquierda del signo es menor o igual que la de la derecha de l. > que es el operador estrictamente mayor y >= que es cierto cuand la expresin de la izquierda del signo es mayor o igual que la que est situada a su derecha. 1.4.3. Operadores lgicos. Los operadores lgicos estn entre dos expresiones lgicas. Una expresin lgica es aqulla que slo admite dos nicos valores posibles: verdadero (true) o falso (false). El resultado de estos operadores tambin es de este tipo: verdadero o falso, pero ofrecen la enorme ventaja de poder relacionar dos expresiones lgicas generndose un resultado de tipo lgico, pero que slo depende del tipo de operador lgico empleado y de la combinacin de valores lgicos de las dos expresiones relacionadas. Aunque esto pueda parecer un poco abstracto, los operadores lgicos se usan profusamente en los programas. A continuacin se van a enumerar y seguro que con los ejemplos entender cmo pueden ser usados. and operador and. Genera un resultado verdadero si son verdaderas las dos expresiones lgicas relacionadas por l. Ser falso en cualquier otro caso. Por ejemplo: Let A = 1 Let B = A Let C = 2 Let D = 3 if A = B and C = D then end En este ejemplo la condicin es falsa porque a es igual a b, pero c no es igual a d. or operador or. Generar un valor verdadero cuando cualquiera de las dos expresiones que relaciona tenga ese valor. Puede ser la priemra expresin, la segunda o las dos. Se generar un resultado falso en cualquier otro caso. Por ejemplo: Let A = 1 Let B = A Let C = 2 Let D = 3 if A = B or C = D then end En eeste caso la condicin ser cierta, porque a es igual a b, con lo que ya no se evala la otra expresin, pues con que cualquiera de las dos, la primera o la segunda sea verdadera, el operador or da resultado verdadero. not operador not. Es el nico operador lgico no binario y su funcin es convertir la expresin a la que afecta en falsa si era verdadera y en verdadera si era falsa. Esto se llama negacin lgica. Por ejemplo:
Let A = 1 Let B = 2 if not (A = B) then end 'equivalente a lo siguiente: if A <> B then end Tanto en un caso como en otro, la condicin es verdadera, pues en el primer caso la condicin (a = b) est negada. Como a tiene el valor 1 y b el valor 2, la conidicin (a == b) ser falsa y al negarla, la convertimos en verdadera. De la misma forma la ltima expresin (a <> b) genera un resultado verdadero, pues es lo que realmente as ocurre. El fundamento matemtico de los operadores lgicos se llama Algebra de Boole y si quiere aprender ms sobre todo esto, puede consultar cualquier libro de programacin o de matemticas para la computacin.
1.4.4. Operadores de bits. Liberty Basic no implementa de por s operadores de bits, pero acepta expresiones del tipo: 8 and 4, 15 and 2, 14 or 8, etc. En estos casos los dgitos binarios de los nmeros son evaluados uno a uno con el operador en cuestin. Debe conocer bien el fundamento matemtico de la base dos para usar este tipo de operadores. 1.5. Arrays. Un array es una variable especial con un nombre, pero que es capaz de almacenar y acceder a una lista de datos mediante un nmero especial que va despus de su nombre y que se llama ndice. Debido a los requerimientos de memoria, los arrays hay que declararlos y el tipo de informacin que contieen no puede cambiar mientras dura su existencia. Para declarar un array observe los siguientes ejemplos: dim nombre$(10) 'array para cadena de caracteres let nombre$(0) = "ricardo" let nombre$(1) = "alberto" let nombre$(2) = "francisco" let nombre$(3) = "remigio" let nombre$(4) = "lamberto" let nombre$(5) = "ovidio" let nombre$(6) = "eusebio" let nombre$(7) = "roberto" let nombre$(8) = "eladio" let nombre$(9) = "policarpo" 'imprime la lista print "la lista contenida en el array es:" for i = 0 to 9 print nombre$(i) next i Respecto a los arrays, tenga en cuenta algunas circunstancias especiales. Cuando se declara un array de tipo numrico el valor que todos sus elementos contienen es cero. Cuando el array es de tipo cadena de caracteres, cada elemento se inicializa como cadena nula, representada por los smbolos "", cuya longitud es cero, pues no contiene caracteres. Es muy importante cuidar no sobrepasar las dimensiones de un array. Si declara un array como: dim nombre$(10), el indice puede tomar los valores de cero a nueve. Liberty Basic es ms flexible respecto a esto, pero tenga cuidado y sea muy estricto, pues el Basic es muy flexible, pero si se aprovecha excesivamente de esta caracterstica, puede despus encontrarse con errores muy difciles de detectar y si progresa a lenguajes de programacin ms estrictos puede encontrarse incmodo por no tener una disciplina adecuada de
elaboracin del cdigo. Seguramente piense que esto es una tontera, pero la experiencia le demostrar que la escritura de cdigo debe atenerse a unas normas algo estrictas, porque ese cdigo lo puede tener que reutilizar dentro de un tiempo y debe estar suficientemente claro para que dentro de quiz algunos meses pueda recordar lo que haca cada orden que escribi y sobre todo porque a veces el cdigo que escribe lo pueden necesitar otras personas y es muy importante que lo puedan entender empleando el menor tiempo posible. Los arrays, son muy tiles en programacin y su estudio completo llevara ms espacio del que aqu se le puede reservar. Los libros de programacin estn llenos de ejemplos de la potencia y flexibilidad que ofrecen. Liberty Basic apenas cambia en lo referente a los arrays respecto al viejo GWBasic. 1.6. La orden de asignacin. En todo lenguaje de programacin una vez que se ha definido una variable, debe haber alguna orden para asignarle o almacenar informacin en ella. Liberty Basic y casi todos los Basic hacen esto poniendo el nombre de la variable, un signo igual y una expresin. El intrprete o el compilador calculan primero la expresin que hay a la derecha del signo igual y, hecho esto, almacenan el valor en la zona de memoria etiquetada por la variable. La expresin a la derecha del signo igual debe ser coherente con el tipo de informacin que almacena la variable. Es responsabilidad del programador hacer esto correctamente. Opcionalmente la orden let sirve para asignar un valor a una variable. Por ejemplo: let x = let y = let y = 'que es y = y + 0 1 y + 1 equivalente 1
Recurdese lo visto en el apartado de las variables respecto a cmo incrementarlas, como en el caso anterior o al contrario, como en el siguiente ejemplo: let x = 1 let x = x - 1 if x = 0 then end
1.7. Las sentencias condicionales. Se ha hablado con cierto detalle de los operadores, de condiciones verdaderas y falsas. Pues es hora de aplicar todos estos conocimientos a una gran potencialidad de los lenguajes de programacin. Si los programas se ejecutaran desde el principio hasta el final en forma secuencial sin la posibilidad de poder alterar la secuencia de la ejecucin de las rdenes, los ordenadores seran nada ms unas potentes mquinas de calcular, pero las sentencias condicionales les dan la posibilidad de adaptarse a condiciones cambiantes de los datos de entrada. Esto otorga a los programadores una mayor capacidad de hacer cdigo que pueda responder de forma precisa a informacin de entrada que, normalmente, no es siempre la misma. Liberty Basic emplea una sentencia condicional algo pobre, pero los Basic antiguos lo hacen igual. Primero se pone la palabra if y despus debe haber una condicin que slo puede tener como resultado dos valores: verdadera o falsa. Despus de la condicin se dispone la palabra then tras la cual se disponen las rdenes que se ejecutarn slo si la condicin que se ha evaluado es verdadera. Si hay ms de una orden cada una se separa de la siguiente por el carcter (:) dos puntos. Observe los siguientes ejemplos:
input "introduzca un nmero ";num if num = 0 then print "nulo..." if num > 0 then print "un nmero positivo" if num <= 5 and num >= 1 then print "entre 1-5" if num <= -1 then print "nmero negativo" Puede observar la gran cantidad de condiciones que aqu se han planteado: simples, compuestas, usando diversos operadores relacionales y lgicos... Junto con las rdenes de iteracin o de bucle, que se van a estudiar a continuacin ofrecen toda la potencialidad de alterar el flojo o forma de ejecucin de las instrucciones en un programa de ordenador. La orden if de GWBasic que slo puede estar en una lnea ha quedado algo desfasada y en los Basic ms modernos y tambin en Liberty Basic admite un formato mejorado. Si conoce qBasic puede darse cuenta de esto. Aqu pondremos un pequeo ejemplo, pero recuerde que los dos formatos, el antiguo y el moderno son posibles. let a = if a <> print gosub else print end if 1 1 then "lo siento, pero no ha acertado" [error1] "acert: el juego ha terminado"
Otra caracterstica muy importante de las rdenes condicionales es que se pueden anidar. En una lnea de GWBasic es muy difcil de hacer esto, pero en el nuevo formato puede haber una sentencia condicionala dentro de otra. Para clarificar la escritura del programa la sentencia condicional del interior se indenta un poco para indicar que depende de la condicin exterior. 1.7. Bocles. Liberty Basic ofrece algunas rdenes para hacer un bocle, esto es, para conseguir que un grupo de instrucciones se repita determinado nmero de veces o mientras se cumpla una determinada condicin. La orden ms tradicional de bucle en Basic es for-netx. Observe el ejemplo y pruebe si lo desea un programa creado al efecto para observar cmo funciona este tipo de rdenes: for i = 1 to 5 print i next i El funcionamiento del bucle es como sigue. Se toma el valor inicial de la variable de la expresin que hay despus del signo igual. En este caso es 1. El bucle se ejecuta hasta que se llega a la instruccin next i, en cuyo caso se incrementa la variable en uno y se compara con el valor final. Si el valor de la variable es menor o igual que el valor final se vuelve al inicio del mismo y en caso contrario se da por finalizado. En este caso la ejecucin de tan pequeo trozo de programa dara lugar a la impresin en pantalla de los nmeros del uno al cinco, ambos inclusive. Se puede, no obstante, hacer que la variable que controla el bucle no se incremente de uno en uno. Observe el siguiente ejemplo: 'primeros seis numeros pares for i = 1 to 11 step 2 print i + 1 next i
Los valores que toma la variable que controla el bucle son: 1, 3, 5, 7, 9, 11 y los que realmente se imprimen son: 2, 4, 6, 8, 10, 12. El nmero que va despus de la clusula step puede ser positivo o netativo y da la magnitud de incremento o decremento, respectivamente, de la variable de control del bucle. Cuando haga por primera vez bucles de este tipo a veces obtendr resultados extraos, bien porque se ejecuta el bucle indefinidamente, bien porque se itera ms de lo necesario. Tenga en cuenta que el propio bucle puede cambiar el valor de su variable de control. Aunque esto no se debe hacer a veces no queda ms remedio, pero aqu es donde ms cuidado ha de tener. La depuracin de este tipo de cdigo da muchos quebraderos de cabeza. Si fuera necesario imprima todos los valores de la variable de control del bucle que le da problemas. Puede preparar condiciones especiales que le permitan saber que se han cumplido por la presencia de determinado mensaje en pantalla. En los primeros momentos quiz estas instrucciones sean las que ms trabajo le den, pero recuerde que su potencialidad es enorme. Al contrario que for-next, la instruccin while-wend evala cierta condicin al principio del inicio del bucle. Si esta condicin es cierta, se entrar en el bucle y se ejecutar hasta la sentencia wend, momento en el que se volver al principio y se evaluar la condicin inicial de nuevo. Esta nueva orden no incrementa ninguna variable de control por s sola. El programador es responsable de que se entre en el bucle o que se salga de l por el cumplimiento o no de la condicin inicial. En este tipo de bucles se pueden dar dos casos que deben ser cuidadosamente evitados. El primero es que no se entre nunca, porque la condicin incial no se cumple la primera vez que se evala: el bucle no se ejecutar nunca. El segundo es a veces catastrfico, pues consiste en que la condicin inicial siempre se cumple, esto es, siempre es cierta, con lo que el programa nunca sale del bucle y se queda bloqueado. Observe los siguientes ejemplos: 'nmeros de Fibonacci print "cuntos nmeros de fibonacci desea generar" input cuantos let anterior = 1 let siguiente = 1 if cuantos = 0 then [terminar] if cuantos = 1 then [uno] if cuantos = 2 then [dos] print anteior print siguiente let i = 3 while i <= cuantos let aux = siguiente let siguiente = siguiente + anterior let anterior = aux print siguiente let i = i + 1 wend [terminar] end [uno] print anterior goto [terminar] [dos] print anterior print siguiente goto [terminar] Analice este cdigo. Hay algo de aritmtica, pero el bucle es lo ms importante. Recuerde tambin que ante un problema de programacin, la
solucin no es nica y existen otras formas que igualmente resuelven el problema propuesto. Si es posible deberemos optar por la solucin ms snecilla, ms fcil de programar y que sea lo ms comprensible que se pueda. 1.8. Instrucciones de bifurcacin. El Basic tradicional y Liberty Basic tambin tienen unas sentencias para bifurcar, esto es, hacer que se ejecuten las instrucciones del programa que estn a partir de determinada etiqueta. Esto ya no est de moda, pues la programacin va por otros derroteros. Se habla ahora de programacin estructurada y de anlisis desde arriba hacia abajo. En lnea generales la programacin estructurada es una forma especial de escribir los programas de forma que el problema se subdivide en bloques o trozos funcionalmente dependientes pero relacionados de tal manera que se pueden programar por separado. En cada bloque se empieza por el principio y el final del mismo slo se da en un nico punto del cdigo. Esto, que puede parecer puntilloso es muy necesario en aplicaciones muy grandes. Tngase en cuenta que cuando el trabajo de programacin es de un gran nivel es imposible que una sola persona lo pueda realizar. Cuando se trabaja en equipo las normas del equipo deben ser muy precisas, pues de lo contrario el trabajo en comn nunca podra funcionar satisfactoriamente. En Basic nos contentaremos con aconsejar ciertos hbitos de programacin. NO se trata de programar como un profesional, pero tampoco es nada cmodo que nuestro cdigo se asemeje a un salto de pulga continuo de una parte del programa a otra, lo que dificulta el seguimiento del programa y sobre todo su depuracin. La orden goto lleva despus una etiqueta. La etiqueta puede ser un nmero, como ocurre con el Basic tradicional o una etiqueta de texto. En este caso, la etiqueta debe ir entre corchetes y dentro de ella no debe haber espacios. SE aconseja que la etiqueta tenga un significado de su funcin y si hay varias palabras en ella, cada letra inicial de las mismas est en mayscula. Por ejemplo: [Comienzo] input "introduzca un nmero";a if a <> 0 then [BienNumero] [Terminar] end [BienNumero] print a goto [Comienzo] Esto est muy bien, pero si hay 900 lneas, que tampoco es un programa excesivamente grande, ser bastante difcil hacerse cargo de tanto goto. Observe el siguiente ejemplo equivalente: let a = 1 while a <> 0 input "introduzca un nmero";a if a <> 0 then print a wend end A veces esto no es posible, pero trate de evitar en lo posible esta sentencia. La orden gosub tiene el mismo formato, pero las instrucciones que se ejecutan a partir de la etiqueta terminan con una ordena especial llamada return, que obliga al programa a retornar para que se siga ejecutando el programa justo despus de la instruccin
gosub. Por esta caracterstica, se llama subrutina al grupo funcional que ejecuta gosub. Realmente es como goto, pero esta ltima orden deriva el control del programa a una etiqueta y nada ms, mientras que gosub retorna despus de haber ejecutado las instrucciones que hay despus de la etiqueta y una vez que se encuentra la orden return. 1.9. Tratamiento de cadenas. El tratamiento de las cadenas de caracteres es uno de los puntos fuertes del Basic. Las variables de cadena de caracteres se identifican porque su nombre termina con el carcter $ y pueden contener: 1. No contener ningn carcter, lo que se llama tambin cadena nula o vaca y se representa por "". 2. Uno o varios caracteres. El nmero mximo de caracteres que una variable de este tipo puede contener est determinado slo por la memoria del ordenador. 3. Las cadenas de caracteres se pueden encadenar usando el operador + y se pueden comparar entre s, puedindose usar en instrucciones condicionales, como if, while, etc. A continuacin vamos a estudiar unas cuantas funciones que convierten al Basic en un lenguaje muy potente a la hora de manejar cadenas de caracteres. Casi todo lo que se discute aqu es til tambin en el Basic tradicional. Por ejemplo: let x = len(a$) La variable x toma la longitud o nmero de caracteres de la variable a$. Si la variable es una cadena nula o vaca, x tomar el valor 0. resul$ = left$(a$,x) Devuelve en resul$ los x primeros caracteres de a$ empezando a contar por la izquierda. Las funciones right$(a$,x) y mid$(a$,x,y) extraen trozos de una variable. Right$ extrae los x ltimos caracteres de una variable que contiene caracteres. La funcin mid$ del ejemplo anterior extrae y caracteres a partir de la posicin x-sima de la misma. Las funciones upper$(texto$) y lower$(texto$) nos permiten pasar a maysculas o a minsculas, respectivamente, una cadena de caracteres. La funcin word$ acepta como parmetros primero una variable tipo cadena de caracteres y, separado por una coma ha de ir un nmero o variable numrica. Por ejemplo: a$ = word$("mi casa tiene patio", 3) Esta funcin devuelve en la variable a$ la palabra tiene, puesto que es la tercera palabra de "mi casa tiene patio". Si el nmero es demasiado grande para la cantidad de palabras contenidas en el primer parmetro se devuelve una cadena nula o vaca. Existe otra funcin muy interesante que permite comparar dos cadenas de caracteres: instr(Cadena1$, patron$) Devuelve un nmero entero. Si ste es cero, las cadenas son distintas, puesto que no se ha encontrado el patrn en la cadena que se pasa a la funcin como primer parmetro. En caso contrario, este nmero da la posicin a partir de la cual se ha encontrado coincidencia exacta de los caracteres de Cadena1$ con Patron$. Seguro que un ejemplo aclara todo esto: 'control de la respuesta por teclado print "teclee si para seguir" print "teclee no para abandonar" [Entrada] input "Desea seguir si/no";resp$ longitud = len(resp$) if longitudd = 0 or longitud > 2 then print "respuesta errnea" goto [Entrada end if 'nos quedamos con la respuesta que tiene dos caracteres
aux$ = upper$(resp$) if instr("SI", aux$) = 0 then print "respuesta errnea" goto [Entrada end if cls print "fin del programa" end Hay algunas funciones ms, pero las ya estudiadas permiten una aproximacin suficiente a estas potencialidades. Liberty Basic no aade nada nuevo y puede aprovechar los conocimientos que ya tiene de GWBasic o aprender en un libro sobre este lenguaje. 1.9. Funciones numricas. Son tradicionales en el Basic y Liberty Basic no aade nada nuevo. Todas las funciones numricas del GWBasic de siempre: trigonomtricas, logartmicas y exponenciales, las tenemos tambin aqu.
1.10. Un programa ms. La teora est muy bien, pero seguro que encuentra libros donde se resumen y compilan funciones y ms funciones de Basic. Creo que lo mejor es analizar pequeos programas que le instruyan cmo hacer algunas cosas. Si por su cuenta no hace otros programas esto no valdr para nada, pues es el hbito lo que logra crear una disciplina para poder programar con soltura. Se trata en este caso de programar una pequea aplicacin que elija un nmero al azar entre 1 y 100. Hecho esto, se le pide al usuario que introduzca un nmero por teclado con el fin de acertarlo. Si el nmero introducido es igual al que la aplicacin eligi, el programa termina y se imprime el nmero en cuestin y el nmero de intentos que el usuario ha tardado en acertarlo. Si el nmero no coincide, la a plicacin debe dar otra oportunidad, indicando como pista si el nmero que el usuario ha introducido es menor o mayor que el que se desea divinar. Juegos de este tipo se exponen por decenas en los libros de programacin. Dudo que alguien desee usarlo en sus ratos de ocio, pero por aqu se debe empezar necesariamente y despus se abordarn trabajos de mayor complejidad. Antes de todo, el algoritmo o conjunto de pasos estructurados que se han de dar para realizar y dar solucin al problema que nos proponemos. Los programadores llaman tambin pseudocdigo a la forma que tiene por escrito la enumeracin de los pasos en que se usa un lenguaje comn, pero con algunas palabras especiales para indicar las diferentes acciones. La ventaja que tiene el pseudocdigo es que el problema tiene una concrecin por escrito y lo suficientemente sistemtica para que cualquier programador lo entienda. Adems a partir del pseudocdigo se puede empezar a escribir el programa en cualquier lenguaje de programacin, ya que el pseudocdigo indica pasos a seguir y no cmo stos han de darse. El traducir de forma eficiente un pseudocdigo a lenguaje de programacin depende de los conocimientos y habilidad del programador. La solucin o programa que se escribe no es necesariamente nica, pues la escritura de programas obedece al conocimiento y habilidad que se tenga: de la disciplina sobre la que trata el programa que se desea escribir, del nivel de matemticas aplicadas a la computacin de que el programa hace uso, del lenguaje de programacin que se usa y, en fin, del propio funcionamiento interno del ordenador, pues es realmente quien lo va a ejecutar. En el caso de este programa, el pseudocdigo sera algo parecido a lo siguiente: x = (nmero al azar) intentos = 0 leer y
while (x <> y) if x < y then print "el nmero es menor) else print "el nmero es mayor" endif intentos = intentos + 1 leer y wend print "ha acertado el nmero ";x print intentos " fueron necesarios para conseguirlo" end La traduccin al Basic sera: [start] guessMe = int(rnd(1)*100) + 1 'limpiar ventana y poner instrucciones cls print "HI-LO" print print "elija un nmero entre 1 y 100. Si lo acierta gana" print "si no es as, se le dar una pista sobre si el" print "nmero debe ser mayor o menor: otra oportunidad" print [ask1] 'pregunta por un nmero input "elija un nmero ";guess Let count = 0 while guess <> guessme if guess > guessMe then gosub [mayor] if guess < guessMe then gosub [menor] [ask1] let count = count + 1 'pregunta por un nmero input "elija un nmero ";guess wend [mayor] print "el nmero ha de ser mayor" return [menor] print "el nmero ha de ser menor" return [win] beep print "acert el nmero ";guessme print count;" intentos realizados" let count = 0 input "quiere seguir: ";play$ if play$ ="y" or play$ = "Y" then [start] print "presione alt+f4 para cerrar la aplicacin" end 2. Otras funciones del lenguaje Basic. 2.1. Entrada y salida.
Para que un programa sea realmente efectivo debe ser capaz de recibir una informacin de entrada y entregar cierta informacin al usuario. En este apartado se vern funciones muy sencillas. S tiene conocimientos de GWBasic lo podra saltar, pues el objetivo es realizar aplicaciones para Windows y para esto Liberty Basic tiene algunos aadidos. La principal orden de entrada por teclado en GWBasic es input. Esta orden detiene la ejecucin de un programa y da la oportunidad para que el usuario introduzca por teclado cierta informacin. Cuando pulsa la tecla enter, el programa se la pasa a la variable que va despus de la orden y el programa sigue su curso normal de ejecucin. Por ejemplo: input "introduzca su nombre: ";nombre$ En este caso el programa se detiene, presenta el mensaje entre comillas y existe un cursor que le indica que puede teclear algo. Cuando pulse enter lo que haya tecleado pasar a la variable nombre$. Ni GWBasic ni Liberty Basic tienen manera de conocer la informacin que se le ha pasado a dicha variable ms que cuando se sigue la ejecucin del programa. Entonces vienen las comprobaciones exahustivas: si slo ha pulsado enter y no tecle ninguna informacin o si lo que ha hecho es teclear nmeros o letras mezcladas, como si estuviera pulsando teclas por azar. Ya se ver que esta instruccin es ms til de lo que pueda parecer. En Liberty Basic input detiene el programa, pero no a Windows, lo que le permite esperar a que ocurran ciertos sucesos que llamaremos eventos en una ventana o en los controles de un cuadro de dilogo o en un men. En el siguiente captulo se discutir esto en detalle. La instruccin principal de salida de informacin en pantalla es print. Esta orden es muy parecida a la de GWBasic y los ejemplos ya estudiados y los que nos quedan por discutir nos aclararn sin ningn gnero de dudas todas las posibilidades que ofrece.
2.2. Tratamiento de ficheros secuenciales. Liberty Basic hace un uso bastante extenso de las rdenes para tratamiento de los ficheros de este tipo. Se le dedica un apartado entero de estos apuntes para que pueda entender despus mejor cmo se las arregla para usar el interface grfico de usuario de una forma poco elegante, pero muy efectiva. Para Liberty Basic una ventana o un control en un cuadro de dilogo no son ms que objetos a los que hace referencia mediante el uso de un manipulador (handle) que tambin se usa en el tratamiento de archivos en disco. Con las rdenes print e input que ms adelante se estudiarn, tambin maneja los objetos del interface grfico de usuario, pues utiliza sus manipuladores como si se tratara de los que usa para los archivos. Ya se dijo que era una forma poco elegante, pero con resultados ciertamente sorprendentes. SE estudian los archivos secuenciales, porque son los ms sencillos. Para otro tipo de archivos, consulte algn libro de programacin o de GWBasic, donde se explican con detalle todas estas cuestiones. Liberty Basic no aade nada nuevo. Un archivo o fichero secuencial es aqul en que se lee o escribe la informacin desde el principio hasta el final. Se estudian siempre en programacin en primer trmino pues son los ms fciles de entender. Liberty Basic usa un concepto especial llamado stream que podra traducirse por canal, como el Basic tradicional, pero profundiza ms hacia otro nuevo que se llama manipulador, (handle) y que no es ms que un nmero, pero que para Windows es el manipulador de uno de sus objetos: una ventana, un fichero, etc. La orden de GWBasic: open "datos.txt" for output as #1 se puede poner ms libremente as: open "datos.txt" for output as #datos1 El manipulador o handle del fichero datos.txt es #datos1 y siempre que se quiera hacer referencia al fichero #datos1 ser la forma en que indicaremos al sistema que necesitamos acceder a ese archivo y no a otro. Ms
adelante se ver que para abrir una ventana o una hoja de clculo se hace lo mismo y el handle o manipulador ser la forma en que tendremos que referirnos a dichos objetos cuando estn abiertos o para cerrarlos. Observe el siguiente ejemplo: open "fich.txt" for output as #MyHandle Respecto a los archivos, tenga en cuenta algunas consideraciones. La primera es que si un archivo est abierto no se puede reabrir otra vez. Si desea leer informacin en el fichero y ste fue abierto para escritura, debe cerrarlo primero y despus abrirlo para que la informacin pueda ser leda. No se preocupe si no entiende algo, porque habr suficientes ejemplos para que pueda hacerse una idea del alcance de todas estas rdenes. Un manipulador de fichero o handle slo puede hacer referencia a un solo archivo y si abre otro fichero con el mismo manipulador que ya est siendo usado, obtendr un error. Se llama "modo de acceso" a una palabra especial que va despus de la clusula "as" en la orden open. Estos modos de acceso determinan lo que se puede hacer con el archivo una vez que est abierto. En el modo output, por ejemplo, slo se puede escribir en el archivo. Para hacer esto, usar la orden print seguida del handle o manipulador del fichero, una coma y lo que se desea escribir en el mismo. Todo lo que se aplica a print sobre la pantalla, tambin es posible hacerlo a la escritura de datos en un archivo. Esto significa que: print #MyHandle, "fichero de datos" imprimir en el archivo que hemos abierto previamente ese literal y aadir un carcter de lnea nueva, pues no se puso punto y coma al final. Recuerde que un carcter de lnea nueva suele escribirse realmente en un archivo como dos caracteres ascii: retorno y salto de lnea. Los lenguajes de programacin no se suelen meter en estas interioridades, pues cada sistema operativo gestiona esto como mejor lo program su diseador y a veces un programa escrito en cierto lenguaje de programacin puede ejecutarse en diferentes sistemas operativos. Desgraciadamente Esto no es cierto en el caso del Basic, pero este criterio se ha mantenido. Para cerrar el fichero, use la orden: close #MyHandle. Esto provoca que el manipulador que antes estaba ligado al archivo quede libre para ser usado si as lo desea en otras operaciones. El fichero que hemos escrito lo podemos leer, bien con un editor de texto o usando el propio Liberty Basic o GWBasic para hacerlo. El modo input debe ser el de nuestra eleccin. Para hacerlo, observe el siguiente ejemplo: open "fich.txt" for input as #MyHandle Existen muchas formas de leer informacin de un fichero secuencial abierto para lectura. La orden input se usa, tal y como ocurra con la orden print y casi con el mismo formato, primero se dispone el manipulador del fichero, una coma y despus se dispone la variable que va a contener la informacin que se ha ledo. El funcionamiento de input es tal que entiende que lee una variable completa cuando encuentra una coma o un carcter de nueva lnea en el fichero. Lo mejor es usar la orden: line input #MyHandle, variable$ En este caso se lee el fichero por lneas. Hay un asunto que debe tenerse muy en cuenta. Para saber cundo se llega al final de un fichero secuencial cuando ste se abre en modo lectura, es preciso usar una funcin especial: eof(#MyHandle) que es falsa si no se ha llegado al final del fichero y es cierta en caso contrario. Un bucle muy sencillo nos permitir leer un fichero secuencial del principio al final. Recuerde que si una funcin es verdadera para Basic devolver -1 y si es falsa 0. Observe el siguiente ejemplo: open "fich.txt" for output as #MyHandle print #MyHandle, "hola" print #MyHandle, "gente" close #MyHandle print "abriendo el fichero"
open "fich.txt" for input as #MyHandle while not eof(#MyHandle) line input #MyHandle, a$ print a$ wend close #MyHandle end Existe otro modo especial para ficheros secuenciales. Se llama append y sirve para aadir informacin a un fichero secuencial de forma que la que previamente contena no sea destruida. Este modo permite escribir, pero no leer. Es responsabilidad del programador que la informacin contenida en el ficher6o no sea redundante respecto de la que se escriba despus en l, sirvindose de este nuevo modo. Recuerde que cuando se abre un fichero en este modo, ste debe existir. Si no fuera as, se generar un error. Slo se podr escribir en el modo append, pero no leer. Si realmente tiene necesidad de saber lo que contena un fichero secuencial y despus quiere aadir informacin sobre l, primero hay que abrirlo en modo lectura. Luego se lee la informacin del fichero hasta llegar al final o conseguir llegar al dato que nos interesaba. Despus hay que cerrar el fichero y reabrirlo, pero esta vez en modo append, con lo que slo podremos escribir en el archivo. Recuerde tambin que el modo output destruye cualquier archivo preexistente con el nombre que figura entre comillas. Es ideal para crear archivos nuevos, pero no para aadir informacin a uno existente. Por eso el modo append es contemplado por muchos Basic, hasta incluso el GWBasic. 3. Programacin del interface grfico. Con programacin del interface grfico se hace referencia a cmo un lenguaje de programacin es capaz de acceder a los objetos de un interface grfico de usuario (GUI), como es en este caso Windows. Los lenguajes especficamente concebidos con esta caracterstica son los que ms partido sacan de las caractersticas de Windows y se adaptan mejor a sus particularidades. Liberty Basic no es ninguna maravilla al respecto, pero tiene algunos puntos que quiz le permitan hacerse una idea de cmo funciona Windows y quiz en el futuro, progrese hacia otros entornos de programacin ms evolucionados. Para adquirir nociones de Windows y sus objetos quiz sea necesario que consulte algn libro al respecto. NO se requieren grandes conocimientos, pero es necesario que sepa al menos superficialmente lo que es una ventana, un men, un cuadro de dilogo y los principales objetos que contiene: botones de comando, cuadros y etiquetas de texto, casillas de verificacin, botones de radio, listas, etc. Aqu es donde Liberty Basic se empieza a diferenciar de otros Basic ms antiguos, pues se le han aadidod algunas rdenes nuevas para el manejo de ventanas. Aqu aprender: 1. Cmo abrir ventanas. 2. Cmo determinar sus propiedades fundamentales: tamao, posicin y tipo. 3. Cmo disponer botones y otros controles en una ventana. 4. Cmo programar los eventos o acciones que se realizan sobre los botones y otros controles en una ventana. Ms adelante se discutirn los objetos que se pueden abrir. Por ahora trabajaremos con cuadros de dilogo, pero esto es slo el principio.
3.1. Su primera ventana. Observe este ejemplo: 'primera ventana open "mi primera ventana" for window as #Ventana input Variable$
close #Ventana end Desde luego complicado no es, pero ahora es cuando podr aplicar todo lo aprendido en el captulo anterior. Liberty Basic usa comandos de archivo para manejar ventanas. Es algo cutre, pero quiz sea la mejor forma de introducir a usuarios de viejos entornos Basic en un interface grfico de usuario para el que este lenguaje de programacin no fue concebido. Al igual que los archivos, puede abrir varias ventanas, pero el handle o manipulador de cada una es nico. Si abre otra ventana con el mismo manipulador que tiene una que est actualmente abierta, obtendr un error. Para definir el tamao y posicin de una ventana, antes de abrirla cambie las siguientes variables: WindowWidth: anchura en pixels de la ventana. WindowHeight: altura en pixels de la ventana. UpperLeftX: posicin horzontal en pixels de la ventana, respecto a la esquina superior izquierda de la pantalla. UpperLeftY: posicin vertical en pixels de la ventana, respecto a la esquina superior izquierda de la pantalla. Para hacerse una idea de cmo funcionan estas caractersticas, observe el siguiente ejemplo. Recuerde que las posiciones se dan respecto a la esquina superior izquierda de la pantalla y que estas propiedades hay que establecerlas antes de abrir la ventana. 'ventana con tamao y posicin definidos 'tamao: 300 por 100 en (200, 150) WindowWidth = 300 'ancho de la ventana WindowHeight = 100 'altura de la ventana UpperLeftX = 200 'coordenada x UpperLeftY = 150 'coordenada y open "ventana predefinida" for window as #Ventana input Variable$ close #Ventana end Es importante tener en cuenta que con la orden open se pueden abrir diferentes objetos relacionados con el interface grfico: window: para abrir una ventana en la que puede haber diferentes objetos como botones, cuadros de texto, mens, etc. dialog: que abre una ventana especial llamada cuadro de dilogo, que ms tarde se discutir. dialog_modal: se trata de otro tipo de cuadro de dilogo que tambin se estudiar ms tarde. Consulte la referencia de Liberty Basic para ms detalles.
3.2. Cmo aadir controles a una ventana. Los interfaces grficos de usuario presentan en la pantalla dentro de las ventanas o de los cuadros de dilogo unos objetos sobre los que el usuario puede actuar para realizar las acciones que en los sistemas orientados a texto seran hechas con comandos de teclado. Los lenguajes de programacin que se diseen para crear aplicaciones en estos nuevos entornos deben tener la posibilidad de insertar objetos de este tipo en la ventana de la aplicacin o en los diferentes cuadros de dilogo de los que el programa pueda disponer. Observe el siguiente ejemplo: 'cuadro de dilogo con un botn nomainwin 'elimina la ventana de texto Basic button #1.Ok, "&OK", [ok_Click], UL, 15, 15 titulo$ = "mi primer cuadro de dilogo" open titulo$ for dialog as #1 print #1, "TrapClose [cerrar]";
[espera1] 'bucle fundamental del programa input Variable$ goto [espera1] [ok_Click] 'evento click sobre el botn notice "OK pulsado" goto [terminar] [cerrar] 'evento cerrar aplicacin confirm "Quiere abandonar?";resp$ if instr("yesYES", resp$) <> 0 then [terminar] goto [espera1] [terminar] 'cerrar la ventana y terminar close #1 'el handle o manipulador puede 'ser: #1, #MiCuadroDeDialogo, etc. end 'terminar Esto no es ni mucho menos programacin estructurada, pero es interesante que se d cuenta de las principales partes de que se compone todo programa creado con Liberty Basic sobre un interface grfico de usuario. En primer lugar se fijan las propiedades fundamentales del objeto que se desea abrir. Al tratarse de un cuadro de dilogo es el sistema y no Liberty Basic el que fija sus caractersticas. Si pretendiramos abrir una ventana, se pueden fijar su tamao y posicin en pantalla sirvindose de las variables especiales que ms arriba se han discutido. Despus se le aaden los controles u objetos necesarios para que el usuario pueda interactuar de manera ptima. A continuacin se abre con la orden open. Ahora llega el momento de enviar comandos al objeto abierto. Este comando tiene la misin de capturar el suceso que se produce cuando el usuario, bien con el ratn, bien con el teclado cierra la aplicacin que se est ejecutando. Despus del comando TrapClose va la etiqueta donde el programa bifurcar cuando ocurra este suceso. El ncleo fundamental del programa est formado por la etiqueta [espera1] y las siguientes dos lneas. Esto parece una aberracin para cualquier programador. En Liberty Basic lo que ocurre es que el programa est detenido esperando su respuesta. Recuerde que Windows no est detenido y si decide cambiar de aplicacin puede hacerlo, volviendo ms tarde sobre este programa. Si cierra la ventana, se bifurcar a la etiqueta [cerrar] que le pedir confirmacin sobre si realmente desea abandonar la aplicacin. Si con el ratn o con el teclado pulsa sobre el botn ok, se bifurcar a la etiqueta [ok_click] y se ejecutar el cdigo que contiene. Lo nico que ocurre es que le aparece un cuadro de mensaje indicndole que el botn en cuestin se ha pulsado. Cuando acepta, se cierra la aplicacin sin ms. Observe sobre todo que se ha de aadir el botn y cualquier otro control antes de la orden open. Para aadir un botn use la siguiente orden: button #handle, etiqueta, [ok_clik], rel, x, y Despus de la palabra button figura un handle que asegura que el acceso a dicho botn sea nico dentro del programa. El nombre del handle o manipulador puede ser cualquiera, pero por costumbre se suele adoptar el mismo que el del objeto dentro del que se inserta ms algn carcter como punto o guin bajo y el nombre del botn. Como siguiente parmetro y separado por una coma del anterior se pone una o ms palabras: se trata del ttulo o texto que aparece dentro del botn. Si slo es una palabra, no son necesarias las comillas, lo que es aplicable a muchas etiquetas o ttulos de los controles. Si hay ms de una palabra ser necesario encerrr el texto entre comillas. Por ejemplo: OK, "su seleccin". Es opcional que slo una de las letras del texto del botn tenga antes el signo &. Esto hace que sta aparezca subrayada y es la forma de indicar al usuario que ese botn se puede
activar rpidamente por teclado pulsando la tecla alt junto con dicha letra. Por ejemplo, "&OK". Separado por otra coma se dispone el tercer parmetro que es la seccin de cdigo a que se bifurcar cuando se pulse el botn, bien con el ratn, bien con el teclado. Despus de otra coma, estn dos letras que indican la posicin relativa. Se admiten los siguientes pares de letras: UL: (upper left). Relativo a la esquina superior izquierda de la ventana. UR: (upper right). Relativo a la esquina superior derecha de la ventana. LL: (lower left). Relativa a la esquina inferior izquierda de la ventana. LR: (lower right). Relativa a la esquina inferior derecha de la ventana. Por ltimo se especifican cuntos pixels se desplaza horizontal y verticalmente respecto al elemento al cual se dispone el botn. Liberty Basic por defecto elige la anchura y altura del botn para albergar el texto en l contenido. De todas formas si desea cambiar estas caractersticas o propiedades del botn puede hacerlo usando dos parmetros ms en la definicin del mismo. El primero indica los pixels que tiene de anchura y el siguiente los que tiene de altura. Por ejemplo: button #1.Ok, "&OK", [ok_Click], UL, 15, 15, 75, 50 Es muy importante la sentencia u orden input que viene despus de la orden open. Liberty Basic slo puede responder a las acciones que se hacen sobre los controles que estn en un objeto abierto si est esperando entradas por teclado. Input consigue esto, aunque esta orden se puede refinar bastante ms. Los principales comandos u rdenes que se pueden enviar a un botn son: print #1.ext, "label text"; Cambiar el texto que aparece en un botn. print #1,ext, "!locate x y width height"; Permite cambiar la posicin y tamao de un botn. Esto slo ser efectivo despus de un comando refresh enviado al objeto que contiene el botn. Para aadir un cuadro de edicin, se usa una tcnica muy parecida a la de un botn. Observe el siguiente ejemplo: textbox #1.ed1, 60, 15, 200, 25 Es muy frecuenta que los cuadros de edicin contengan por defecto cierta informacin que el usuario puede dejar intacta o modificar a su antojo. Para lograr esto, usar un comando print seguido del handle o manipulador de este control, despus una coma y, por ltimo, figurar una variable de cadena de caracteres o un texto entre comillas. Por ejemplo: print #1.ed1, "mamferos"; Esto hace que la palabra mamferos aparezca en el cuadro de edicin, pero recuerde que el usuario puede modificarla si lo desea usando las tecls comunes de edicin y el teclado para escribir lo que desee. Para recoger el texto que hay en un cuadro de edicin ejecutar: print #1.ed1, "!contents?"; input #1.ed1, texto$ En este caso lo que haya en el cuadro de texto o cuadro de edicin pasar a la variable texto$ y el programa ser el encargado de analizar realmente lo que el usuario tecle all. En el formato de la orden textbox despus del manipulador figuran cuatro nmeros. Los dos primeros son respectivamente la posicin horizontal y vertical del emplazamiento del cuadro de texto, teniendo en cuenta que siempre se hace referencia a la esquina superior izquierda del objeto que se va a abrir. Los dos ltimos nmeros indican, tambin respectivamente, la anchura y la altura del control en cuestin. Si el cuadro de edicin no es lo suficientemente ancho, cuando teclee texto sobre l y alcance el final del control, el texto se ir desplazando a la izquierda para dejar paso al nuevo, ocultndose el principio del mismo. Si el cuadro de edicin no es suficientemente alto, no ver ningn texto, pues el sistema no puede albergarlo al faltarle altura al control.
Aadir una etiqueta de texto esttico, le permite etiquetar los controles para que el usuario de la aplicacin sepa exactamente qu tipo de informacin o actuacin se solicita de l. Observe el siguiente ejemplo y podr darse cuenta del funcionamiento en conjunto de lo hasta aqu aprendido: 'cuadro de dilogo con una etiqueta de 'texto, un cuadro de edicin y un botn 'si tuviramos que abrir una ventana, 'primero se establecen su tamao y posicin 'tamao: 300 por 100, posicin (200, 150) 'WindowWidth = 300 'WindowHeight = 100 'UpperLeftX = 200 'UpperLeftY = 150 nomainwin 'evita la ventana de texto Basic 'ahora se definen los controles button #1.ok, "&OK", [ok_Click], UL, 220, 35 textbox #1.ed1, 10, 35, 200, 25 statictext #1.et1, "su nombre: ", 10, 10, 150, 25 titulo$ = "datos personales" open titulo$ for dialog as #1 'captura el evento de cierre print #1, "TrapClose [cerrar]"; [espera1] 'hace esperar al programa input Variable$ goto [espera1] [ok_Click] 'evento click sobre el botn 'obtiene lo que hay en el cuadro de edicin 'dar un comando al cuadro de edicin print #1.ed1, "!contents?"; 'obtener la informacin que contiene input #1.ed1, contenido$ 'exhibir un cuadro de mensaje con esa informacin notice contenido$ goto [terminar] [cerrar] 'bifurca cuando el usuario cierra la aplicacin confirm "Desea abandonar?";resp$ if instr("yesYES", resp$) <> 0 then [terminar] goto [espera1] [terminar] 'cerrar la ventana close #1 end Se habr fijado que el formato del control statictext es el mismo que el del textbox. La diferencia es que el control etiqueta de texto tiene un texto que se puede modificar por el programa, pero no por el usuuario. En el cuadro de edicin en cambio, el texto se puede modificar, tanto por el programa como por accin directa del usuario. En un cuadro de edicin se pueden utilizar las teclas normales de Windows para editar texto, pero tambin las teclas especficas que Windows dispone para cortar, copiar y pegar. Para estos conceptos puede consultar cualquier libro de Windows que trate sobre el bloc de notas que es un editor de texto muy sencillo que este entorno incorpora. Recuerde en este sentido que para exhibir un texto, tanto en un cuadro de edicin como en una etiqueta de texto esttico debe enviar el
comando print seguido del manipulador del objeto y una cadena de texto entre comillas o una variable tipo cadena de caracteres. No olvide separar ambos elementos por una coma y si lo que dispone como segundo parmetro es un literal de texto tendr que encerrarlo entre comillas. Observe el ejemplo anterior. Observe tambin el formato del comando para capturar el suceso de cierre. En la cadena de caracteres que se le enva con el comando print figura la palabra TrapClose y despus entre corchetes la seccin de cdigo a que se bifurcar cuando el usuario intente cerrarla aplicacin. Recuerde que el suceso de cierre se activa tanto por medio del ratn, como por medio del teclado. Realmente, cuando ocurre el suceso de cierre se ejecuta una orden goto hacia la seccin de cdigo que comienza en la etiqueta especificada despus de la palabra TrapClose. Liberty Basic no tiene manera de detectar este suceso por s mismo y podran darse errores difciles de detectar si el cdigo intenta hacer algo con un objeto suponiendo que est abierto cuando en realidad no es as. Para ello, lo mejor es capturar siempre el suceso de cierre y asegurar bien todas las situaciones. Es especialmente peligroso que una aplicacin est en un bucle de espera, como el de los ejemplos anteriores y el objeto donde estn los controles a los que debe responder est cerrado. Antes de seguir enumerando los controles que se pueden aadir a nuestras aplicaciones, se insiste un poco ms en una orden que habr observado y que an no se ha comentado bien. Cuando se inicia un programa en Liberty Basic, por defecto aparece una ventana de texto, herencia de los antiguos Basic, que se ejecutaban en sistemas orientados a texto. Cualquier orden print, input, que requiera al usuario que introduzca informacin o que la exhiba en pantalla, usan la ventana principal de texto para interactuar con el usuario. Esta ventana es importante para la depuracin, para imprimir a lo largo del programa alguna variable de cuyo comportamiento no estamos seguros, as como para depurar y refinar la aplicacin. Cuando deseamos realizar una aplicacin en Windows y estamos suficientemente seguros de que su funcionamiento es correcto es hora de suprimir esta ventana de texto. Esto se hace con la orden: nowinmain. Si no desea hacer aplicaciones para el interface grfico y slo va a usar el Basic en su versin ms antigua, quite esta orden, pues si no, la ventana principal de texto no aparecer y en esa situacin es totalmente necesaria. Para aadir un cuadro de grupo use lo siguiente: GROUPBOX #1.gb1, "etiqueta", x, y, wide, high Es muy parecido a la etiqueta de texto, pero con la diferencia de que dibuja un marco en el que se pueden agrupar algunos controles de funcin parecida en el cuadro de dilogo para que visualmente sea ms perceptible su relacin. Es importante notar el significado del manipulador. Un control puede tener si se desea el mismo manipulador que la ventana o cuadro de dilogo donde se inserta, pero entonces no se le podrn enviar comandos. Con los botones hay menos problemas, pues slo responden al evento click. En cambio los cuadros de edicin y las etiquetas de texto deben de tener handles diferentes para que se les puedan enviar comandos y en algunos casos retornar informacin a la aplicacin. Recuerde tambin que es una costumbre muy extendida disponer el manipulador de un control como el de la ventana o cuadro de dilogo donde se insertan ms un punto o un guin bajo y un identificador corto del control en cuestin. Para insertar una casilla de verificacin use la siguiente orden, muy parecida a la de los otros controles: CHECKBOX #1.ch1 "&etiqueta", [set], [reset], x, y El primer parmetro es el manipulador para acceder al control, como siempre. El segundo parmetro es el texto visible que aparecer dentro del control. Como estas casillas de verificacin tienen dos estados posibles, activado o verificado y desactivado o no verificado, existen dos parmetros. El primero de ellos es la seccin del programa a que se bifurca cuando el usuario activa la casilla de verificacin. El segundo tiene la misma funcin, pero se bifurca a la seccin del programa all definida slo cuando la casilla es desactivada por el usuario, ya sea mediante el ratn o mediante el teclado. Despus hay dos parmetros que indican la posicin del control, siempre tomando como referencia la esquina superior izquierda de la ventana o
cuadro de dilogo donde se inserta este control. Opcionalmente se pueden disponer dos parmetros ms que indican, respectivamente, la anchura y la altura en pixels del control. Para aadir un botn de radio, use lo siguiente: RADIOBUTTON #1.rb1, "&etiqueta", [set], [reset], x, y Los parmetros son muy parecidos al control casilla de verificacin. La diferencia es que los botones de radio tienen la especial caracterstica de que cuando se activa uno, los dems del mismo grupo deben estar desactivados. Debe notar tambin que la rama o seccin del programa donde se bifurca cuando se desactiva un botn de radio no tiene ninguna funcin efectiva, pues los botones de radio no se desactivan con el ratn, sino que al activar uno desactiva automticamente todos los dems. Los dems parmetros son totalmente iguales a los del control casilla de verificacin. Para aadir un cuadro de lista use la orden: LISTBOX #1.lb1, array$(, [seleccion], x, y El primer parmetro es un manipulador que tiene las mismas normas que en los casos anteriores. Este manipulador debe ser nico porque ser necesario enviar rdenes al control y recibir con posterioridad informacin proveniente de l. El segundo parmetro debe ser un array que contenga cadenas de caracteres. Antes de abrir la ventana o cuadro de dilogo y dar la orden de insercin de un cuadro de lista debe almacenar la informacin que quiera exhibir en este control de manera conveniente en cada elemento del array. Si en el transcurso del programa algn elemento de la lista debe ser cambiado, no tiene ms que hacerlo en el array usando las rdenes de asignacin estndar y despus ha de enviar al control listbox un comando reload para actualizar la informacin que ha de ser exhibida. El tercer parmetro es la etiqueta de la seccin de programa a que se bifurca cuando un elemento de la lista es seleccionado. Si usa el ratn un simple click no causa ningn suceso de seleccin. Para hacerlo debe hacer doble-click sobre el elemento de la lista que desee seleccionar. Despus, como siempre estn los valores de posicin horizontal y vertical respecto a la esquina superior izquierda del objeto donde se inserta el control, ya sea una ventana o un cuadro de dilogo. Opcionalmente se admiten otros dos valores para la anchura y la altura, respectivamente, del control. Los valores, como siempre, se dan en pixels. Los comandos para el manejo de una lista se discuten a continuacin: print #1.lb1, "select string"; Selecciona el elemento que es igual a la cadena de caracteres especificada despus del comando select y actualiza la lista por si se hubiera hecho algn cambio en el array de donde se recoge la informacin que ha de visualizarse. print #1.lb1, "selectindex i"; Selecciona el elemento cuya posicin o ndice viene determinada por el ndice en el array que va despus del comando selectindex y actualiza el array por si se hubiera hecho algn cambio para visualizar correctamente la informacin en el cuadro de lista. Recuerde que el ndice puede tomar valores desde 0 hasta justo antes del primer elemento del array cuyo contenido es una cadena vaca. print #1.lb1, "selection?"; input #1.lb1, info$ Recoge en la variable info$ el tem seleccionado de la lista. Si no hubiera ningn elemento seleccionado en ese momento la variable info$ contendra una cadena nula o vaca, su longitud sera cero y vendra representada por "". print #1.lb1, "selectionindex?"; input #1.lb1, index Devuelve en la variable index el ndice de elemento que est seleccionado. Si no hay ningn elemento seleccionado index tomar el valor cero. print #1.lb1, "reload"; Actualiza la visualizacin de los elementos de la lista en la pantalla. Se usa cuando la aplicacin cambia el contenido de algn elemento del array, con lo que la lista se ha de actualizar.
print #1.lb1, "font facename width height"; Selecciona la fuente apropiada para exhibir los elementos de la lista. print #1.lb1, "singleclickselect"; Hace que Liberty Basic provoque el suceso o evento seleccin con un simple click del ratn en vez de la opcin por defecto que es doble-click. print #1.lb1, "setfocus"; Hace que el sistema enfoque al cuadro de lista. Esto provoca que cualquier accin del teclado recaiga inmediatamente sobre este control. Recuerde que la tecla del cursor arriba provoca la seleccin del anterior elemento y la tecla cursor abajo la del siguiente. Es importante destacar que las acciones del teclado no provocan ningn evento de seleccin y realmente quienes se deben preocupar de recoger la informacin de la lista son los sucesos click de algunos botones, como por ejemplo aceptar. Observe el siguiente ejemplo: 'demostracin de un cuadro de lista nomainwin 'evita la aparicin de la ventana de array$(0) = "primer elemento" array$(1) = "segundo elemento" array$(2) = "tercer elemento" array$(3) = "cuarto elemento" array$(4) = "quinto elemento" array$(5) = "sexto elemento" array$(6) = "sptimo elemento" array$(7) = "octavo elemento" array$(8) = "noveno elemento" listbox #1.lb1, array$(, [selected], textbox #1.ed1, 182, 16, 136, 25 button #1.ok, "Aceptar", [ok_click], titulo$ = "demostracin de cuadro de open titulo$ for dialog as #1 print #1, "TrapClose [cerrar]"; [espera1] input Variable$ goto [espera1] [selected] 'cuando un elemento se selecciona 'con doble-click del ratn 'inserte aqui el cdigo que desee print #1.lb1, "selectionindex?"; input #1.lb1, xVar print #1.ed1, str$(xVar); goto [espera1] [ok_click] 'evento click sobre aceptar 'inserte aqu su cdigo print #1.lb1, "selection?"; input #1.lb1, info$ notice info$ + " se ha elegido" goto [terminar] [cerrar] confirm "quiere salir?";resp$ if instr("yesYES", resp$) = 0 then [espera1] [terminar] close #1 end
texto
Para insertar un cuadro combinado: COMBOBOX #1.cb1, array$(, [seleccion], x, y Un cuadro combinado es un control que se comporta como un cuadro de lista, pero permite ahorrar espacio. En vez de presentar una lista de elementos, slo le aparece el que est seleccionado. Para abrir la lista, deber pulsar con el ratn en una flecha que mira hacia abajo. Entonces la lista se despliega y puede seleccionar con el ratn el elemento que desee. Si pulsa sobre la flecha de nuevo con el ratn la lista se volver a cerrar y slo aparece el elemento seleccionado. Con el teclado, alt+flecha abajo abre la lista, con los cursores nos movemos por ella y para cerrarla pulsaremos alt+flecha arriba. Por lo dems, tanto la sintaxis como todos los comportamientos y comandos son exactamente iguales que el anterior control. Observe, no obstante el siguiente ejemplo: 'demostracin de cuadro combinado array$(0) = "This" array$(1) = "is" array$(2) = "a" array$(3) = "test" array$(4) = "of" array$(5) = "the" array$(6) = "emergency" array$(7) = "broadcast" array$(8) = "system" combobox #1.cb1, array$(, [selected], 26, 16, 136, 200 textbox #1.ed1, 182, 16, 136, 25 button #1.ok, "Aceptar", [accept], UL, 182, 51, 136, 25 instruct$ = "Select an item in the combobox and watch the " + _ "number change, then change the number and hit Accept " + _ "Selection go the other way." statictext #1.et1, instruc$, 182, 86, 136, 200 titulo$ = "demostracin de cuadro combinado" open titulo$ for dialog as #1 print #1, "TrapClose [cerrar]"; [espera1] input Variable$ goto [espera1] [selected] 'inserte aqui su cdigo cuando se 'haga doble-click sobre un elemento print #1.cb1, "selectionindex?"; input #1.cb1, xVar print #1.ed1, str$(xVar); goto [espera1] [accept] 'evento click sobre el botn print 1.ed1, "!contents?" input #1.ed1, yVar print #1.cb1, "selectindex "; yVar; goto [espera1] [cerrar] confirm "quiere salir?";resp$ if instr("yesYES", resp$) = 0 then [espera1] close #1 end Aadir un control de edicin de texto le permite disponer en la ventana que lo lleva de un verdadero editor de texto con barras de desplazamiento, e incluso un men de edicin para realizar las operaciones
ms comunes de Windows con texto: cortar, copiar y pegar. Su sintaxis es: TEXTEDITOR #handle.ext, x, y, anchura, altura Este control se maneja mediante comandos. Es muy importante destacar que en la ventana donde est este control se pueden poner mens lo que le permitir acceder a todas las funciones cuando determinada opcin se active con el ratn o con el teclado. Los principales comandos son: print #handle, "!cls"; Quita cualquier texto de la ventana. Se ha de abrir una ventana normal, no un grfico. print #handle, "!font faceName width height"; Permite especificar un nombre, una anchura y una altura de fuente para el texto que se exhibe en la pantalla. Si no fuera posible encontrar una fuente que cumpla exactamente con esos requerimientos, Liberty Basic intentar encontrar una fuente que los cumpla al mximo posible. print #handle, "!line #"; input #handle, texto$ Devuelve el texto que hay en la lnea especificada. Si la lnea es menor que uno o mayor que el nmero mximo de lneas que hay en el control, la cadena texto$ ser nula. print #handle, "!lines"; input handle, xvar Obtiene el nmero de lneas de texto que hay en el control. print #handle, "!modified?"; input #handle, modif$ Si modif$="true" el texto en el control se ha modificado. Si es "false" el texto no ha sido modificado. Se suele usar cuando el usuario cierra con alt+f4 la aplicacin donde hay un control de edicin. Antes de hacer directamente esta tarea es necesario saber si el texto se ha modificado. Si no se ha modificado, la copia en disco es igual a la que existe en el control, por lo que el usuario tiene la completa seguridad de que su trabajo ya est guardado convenientemente. Si el texto ha sido modificado, ser necesario guardarlo en disco y despus s que se podr cerrar la aplicacin. print #handle, "!origin?"; input #handle, rowVar, columnVar Permite determinar la posicin en el control de edicin. print #handle, "!origin row column"; Fuerza a situar en la fila y columna especificadas. print #handle, "!paste"; Causa que el texto que hay en el portapapeles de Windows (si es que hay alguno), sea pegado a partir de la posicin del punto de insercin. print #handle, "!selectall"; Selecciona todo el texto del control. print #handle, "!selection?"; input #handle, texto$ Provoca que la variable texto$ contenga el texto que se ha seleccionado. Si no hubiera nada, esta variable contendr una cadena nula. print #handle, "!setfocus"; Hace que el sistema enfoque al control, con lo que cualquier accin del teclado recaer sobre l. print #handle, "!autoresize"; Provoca que cuando el usuario cambiar el tamao de la ventana, los controles adecen su tamao para mantener aproximadamente las relaciones originales. Los controles implementan por s solos la forma de redibujarse cuando se cambiar el tamao de una ventana. No obstante, si le es posible no imprima texto directamente en la ventana si piensa que el usuario va a cambiar su tamao a voluntad. print #Handle, "!cls"; Quita cualquier texto que haya en la ventana. print #handle, "!contents texto$"; print #handle, "!contents #handle"; La primera forma reemplaza el texto de la ventana referenciada por el manipulador con el texto que contiene la variable texto$.
La segunda forma reemplaza el texto de la ventana con el que contiene el manipulador especificado en ltima lugar. Esto es una forma de transferir rpidamente un archivo de texto a una ventana abierta con un control de edicin de texto. Observe el siguiente ejemplo: 'algunos comandos a una ventana 'con el control texteditor nomainwin texteditor #main.te, 0, 0, 200, 200 open "sin ttulo" for window as #main print #main, "TrapClose [cerrar]"; open "c:\autoexec.bat" for input as #1 print #main.te, "!contents #1"; [espera1] input Variable$ goto [espera1] [cerrar] confirm "quiere salir?";resp$ if instr("yesYES", resp$) = 0 then [main.inputLoop] [terminar] close #main close #1 end print #handle, "!contents?"; input #handle, texto$ Se usa para recoger el texto que tiene una ventana, un control de edicin o un cuadro de edicin. La informacin se devuelve en la variable texto$. print #handle, "!copy"; Se usa para copiar el texto actualmente seleccionado al portapapeles de Windows. print #handle, "!cut"; Se usa para llevar el texto actualmente seleccionado al portapapeles de Windows y borrarlo de donde se encuentra. print #handle, "!font faceName width height"; Establece la fuente de texto de la ventana o del control cuyo manipulador se especifica como primer parmetro. Si no es posible establecer exactamente el tamao de la fuente, Liberty Basic lo har lo ms aproximadamente que se pueda. Si el nombre de la fuente tiene ms de una palabra, stas se unirn con un guin bajo: print #handle, "!font Times_New_Roman 8 15"; print #handle, "!line #"; input #handle, texto$ Usado sobre todo en un control de edicin de texto. La variable texto$ contiene la lnea cuyo nmero se ha solicitado. Si este nmero es menor que uno o es mayor que el mximo nmero de lneas que se contienen en la ventana o en el cuadro de edicin de texto, texto$ contendr una cadena nula. print #handle, "!lines"; input #handle, countVar Recoge en la variable countvar el mximo nmero de lneas que contiene la ventana o el control de edicin de texto especificado por el manipulador que se da como primer parmetro. print #handle, "!modified?"; input #handle, modi$ Si modi$="true" el texto de la ventana se ha modificado. Si modi$="false" esto no es as. Es muy til cuando el usuario decide cerrar la aplicacin y ha de drsele la oportunidad de guardar el trabajo que ha realizado. print #handle, "!origin?";
input #handle, rowVar, colvar Devuelve en estas dos ltimas variables la fila y columna en donde se est. Cuando se abre un control de edicin se est en la lnea uno, columna uno. print #handle, "!origin row column"; Fuerza a situarse en la fila y columna especificadas. print #handle, "!paste"; Pega el texto contenido en el portapapeles de Windows, (si es que hay algn texto all) a partir de la posicin actual del cursor. print #handle, "!selectall"; Selecciona todo el texto de la ventana. print #handle, "!selection?"; input #handle, texto$ Devuelve en la variable texto$ lo que haya seleccionado en ese momento. print #handle, "!setfocus"; Hace recaer el foco del sistema sobre el control cuyo manipulador se ha especificado. Esto significa que ste ser el que reciba las entradas del teclado. Para aadir un men, use la siguiente sintaxis. Recuerde antes de todo que un men se aade a una ventana y no a un cuadro de dilogo. Si abre una ventana con un control de edicin de texto ya existe un men de edicin que Liberty Basic coloca automticamente para las tareas ms comunes sobre el texto: cortar, copiar y pegar. menu #1.me, ttulo, lin1, [selec1], lin2, [selec2], etc. Permite aadir una opcin de men a una ventana. El manipulador tiene como siempre las mismas caractersticas: el de la ventana donde se inserta, que puede ser un nmero por sencillez o una palabra como #main, #ventana, #mainwin3, etc. El ttulo es lo que aparecer en la barra de men. Si desea que haya ms de una apalbra, las tendr que encerrar entre comillas. Puede opcionalmente poner un signo & antes de una de las letras de este ttulo. Esto indica que dicha letra aparecer subrayada y el usuario sabe que pulsando alt junto con dicha letra el men se despliega. Lin1 es la primera lnea que aparecer al desplegar el men en vertical y [sel1] la seccin del programa a la que se bifurca cuando se hace click o se pulsa intro sobre esa opcin. Puede aadir las opciones de men que desee. Recuerde que debe poner al lado de cada opcin de men la seccin de cdigo a la que se debe bifurcar cuando esa opcin en cuestin sea activada, bien con un click de ratn o con el teclado. Como todas las etiquetas, si slo es una palabra no hacen falta las comillas y tambin es aplicable lo del signo &. Si este signo lo aplica de forma adecuada podr indicar fcilmente al usuario mtodos de activacin abreviados del men mediante el teclado. En principio cada menu que inserte tendr un ttulo y las letras de activacin han de ser diferentes. Dentro de cada men, las opciones del men vertical deben tambin ser diferentes. Esto asegura un manejo muy eficaz de los mens mediante el teclado. Recuerde que el men o mens que desee aadir a de realizarlo, como todos los controles antes de abrir el objeto donde se insertan. En un cuadro de dilogo no tiene sentido poner un men, pues es en una ventana donde adquieren todo su significado. Windows tiene unas normas y stas han de ser respetadas. A veces las opciones de men estn agrupadas funcionalmente. Esto se realiza usando unas lneas horizontales que agrupan opciones relacionadas por su tarea. Para realizar esto se pone entre las opciones que desea separar por una lnea un carcter barra vertical (|), seguido de una coma, como si fuera un parmetro ms. print #handle, "locate x y width height"; Reposiciona un control en una ventana o en un cuadro de dilogo que ya ha sido abierto. Esto no tendr efecto hasta que no se enve a la ventana un comando refresh.
3.3. Organizacin de un programa en un entorno GUI. Recuerde que cuando un programa se abre, por defecto se crea una ventana de texto en la que se exhibe la informacin que el programa pueda enviar con comandos tales como print o donde el usuario teclea informacin en respuesta a un comando input. Si no desea abrir esa ventana disponga al principio de la aplicacin que desarrolla la orden: nomainwin. Esta orden evita que se abra esa ventana. A veces sta ser necesaria, pues es heredera del viejo entorno Basic tradicional, y es donde se pueden depurar los programas con mayor facilidad cuando hay variables de comportamiento extrao o partes del cdigo que no responden como es debido. Antes de dar algunas pautas para escribir cdigo, es fundamental que todo lo que haya abierto sea cerrado cuando la aplicacin termina. Es responsabilidad del programador hacer esto y debe asegurar al mximo que siempre al terminar la aplicacin todos los cuadros de dilogo, ventanas y archivos se cierran. Otra cuestin que tambin debe cuidarse al extremo es que, como los programas en Liberty Basic realizan un bucle de espera infinito como: [espera1] input variable$ goto [espera1] Para un programador esto es aberrante, pero tenga en cuenta que esto slo se realiza cuando una ventana o un cuadro de dilogo estn abiertos. En este caso se asegura una respuesta adecuada a los eventos sobre los objetos o controles que se hayan insertado. Si por alguna razn un programa hace este tipo de bucles para esperar la respuesta a eventos y el objeto al que supuestamente est relacionado este bucle ya est cerrado, pueden darse errores en el sistema muy difciles de detectar. Recuerde que Windows es un sistema multitarea y que esta funcin se basa en la asignacin dinmica de recursos. El sistema posee manipuladores para los objetos, memoria y tiempo de procesamiento. Es una norma estndar que cuando una aplicacin comienza sta requiere a Windows que le d recursos, (los que necesite), pero cuando sta termina, debe devolver convenientemente lo que pidi, para que el sistema pueda administrarlos segn las necesidades futuras. Si un programa permanece en un bucle infinito, no podr devolver la memoria, quiz algn manipulador o handle est an abierto y quita, desde luego, tiempo de ejecucin al sistema. Al principio del desarrollo de una aplicacin no quite la ventana de texto de Basic, pues de este modo puede darse cuenta de estos hechos, pues Liberty Basic le avisar de este problema. Hasta ahora se han discutido ejemplos muy sencillos, pero en un entorno grfico de usuario puede haber bastantes ms controles y el cdigo que se requiere empieza a ser mayor. Esto exige cierta organizacin para que el programador o la gente que pudiera reutilizar nuestro cdigo tengan al menos una idea vaga de cmo hemos querido organizar nuestro trabajo. Lo ms importante es que si va a trabajar con varias ventanas o cuadros de dilogo el cdigo de cada una est agrupado y no disperso a lo largo del programa. Normalmente la mayora de las aplicaciones se organizan en torno a una ventana central desde donde se pueden abrir otras. Para terminar la aplicacin, primero se cierran todas las ventanas que dependen de la central y, por ltimo, sta ltima tambin. Adems de una conexin lgica, debe cuidar los nombres de las variables y de los manipuladores, documentar lo ms posible su trabajo y probar su trabajo a trozos. Aunque Liberty Basic no es un lenguaje preparado para crear mdulos o pequeos trozos de programa, debe hacer el esfuerzo de trocear su trabajo, probar cada fragmento y, por ltimo reunirlo todo para probar el conjunto. Al principio ser algo complejo, pero esta forma de trabajo es la que en el futuro tendr que adoptar si progresa a otros lenguajes de programacin y entornos de desarrollo ms evolucionados.
3.4. Cmo trabajar con los cuadros de dilogo. Un cuadro de dilogo es un tipo de ventana especial que se usa con mucha frecuencia para requerir del usuario cierta informacin. Por su naturaleza apresentam una serie de caractersticas que nos ser muy til conocer: 1. La tecla tabulador y shift+tab nos permite ir de control en control. Windows presenta al usuario un cuadro de dilogo de forma que ste intuye de manera unvoca qu control est focalizado, esto es, acepta entradas por el teclado. A este control se le llama activo y slo uno en un momento dado puede estar focalizado. Los otros controles estn inactivos. Cuando pulsamos el tabulador o hacemos click con el ratn sobre otro control, conseguiremos que Windows lo enfoque. 2. Existen algunas clases de cuadros de dilogo. Los modales requieren una completa atencin del sistema. Esto quiere decir que cuando se abren, el usuario los ha de cerrar antes de poder seguir trabajando con la aplicacin. 3. En Liberty Basic los cuadros de dilogo pueden aparecer en cualquier posicin de la pantalla, pues ignoran las variables especiales UpperLeftX y UpperLeftY. 4. Los cuadros de dilogo tienen un tamao fijo y no pueden ser redimensionados por el usuario. No obstante antes de abrirlos se puede fijar su tamao sirvindose de las variables especiales WindowWidth y WindowHeight. Muchas aplicaciones estn prcticamente construidas en torno a cuadros de dilogo. De hecho los formularios de Visual Basic se usan preferentemente como cuadros de dilogo donde se pueden insertar controles. Si aprende a crear cuadros de dilogo en este lenguaje no tendr ninguna dificultad en progresar en el futuro a lenguajes de mayor nivel. Liberty Basic le ofrece ya hechos varios cuadros de dilogo tpicos de Windows que le permiten tareas tales como dar al usuario mensajes de notificacin, darle la oportunidad de responder s o no a una pregunta, o elegir un fichero dentro de una lista. He aqu algunos ejemplos: notice expresion$ Si la variable expresion$ no contiene ningn retorno de carro, chr$(13), el ttulo del cuadro de dilogo ser "notice" y el mensaje que el usuario debe leer es el contenido de expresion$. Si dicha variable llevara en su interior un retorno de carro, la primera parte de la variable antes de l ser usada como ttulo y la segunda como el mensaje que el usuario debe leer. En la parte inferior de estos cuadros de dilogo existe un botn ok para cerrarlos. Con la tecla enter tambin se cierran. Por ejemplo: notice "el fichero no existe" notice "error fatla" + chr$(13) +_ "el buffer de caracteres est lleno" Para realizar la seleccin de un fichero use: filedialog titulo$, template$, recibe$ Exhibe un cuadro de dilogo cuyo ttulo es el primer parmetro, el segundo parmetro es un filtro que puede ser hecho con caracteres comodn o con un nombre de fichero. El tercer parmetro es la variable que recibir el archivo que se ha seleccionado una vez que el usuario acepte. Esta variable funciona de tal forma que se dispone en ella el path completo del fichero, desde la unidad hasta el nombre del fichero, con todos los subdirectorios hasta llegar a l. Por ejemplo: filedialog "archivo de texto", "*.txt", fileName$ Si el usuario acepta y hay un fichero, filename$ contendr un fichero vlido con su path, pero si cancela, esta variable contendr una cadena nula. Para responder s o no a una pregunta use: confirm expresion$; resp$ Crea un cuadro de dilogo con dos botones s y no y con un mensaje que es el contenido en la primera variable. Despus del punto y coma, la variable resp$ acoger la seleccin hecha por el usuario. Si selecciona s, la variable resp$ contendr la cadena "yes". En cambio dicho contenido ser "no" si esta es la decisin del usuario pulsando el botn del mismo nombre. Para introducir informacin mediante el teclado con un mensaje
indicativo use: prompt expresion$; variable$ La primera variable es el mensaje que muestra el cuadro de dilogo. Este cuadro de dilogo tiene un cuadro de edicin donde puede teclear dicha informacin y dos botones: aceptar y cancelar. Si acepta, el contenido del cuadro de edicin pasar a la variable variable$; si selecciona cancelar dicha variable contendr una cadena nula. Para usar estos cuadros de dilogo prehechos deber asegurarse de que no haya abierto ningn otro cuadro de dilogo. A los usuarios de aplicaciones estndar de Windows les resultar extrao este hecho. No debe usar cuadros de dilogo de este tipo en sucesin: por ejemplo, uno para pedirle el nombre, otro para pedirle la direccin, etc. Esto tambin es muy extrao y sera preferible que use un slo cuadro de dilogo con varios controles para requerir toda esta informacin. Como resumen observe el siguiente ejemplo: 'acertar el nmero usando cuadros de dilogo. Le ser ms 'fcil de usar, ya sea con el tabulador o mediante el ratn 'no use ventana principal nomainwin 'fijar la anchura y la altura del cuadro de 'dilogo mediante las variables especiales WindowWidth = 312 WindowHeight = 145 'aadir controles msg1$ = "su nmero por favor: " statictext #1.et1, msg1$, 14, 16, 176, 20 textbox #1.ed1, 14, 41, 216, 25 button #1.ok, &ok, [ok_click], UL, 238, 41, 50, 25 msg2$ = "nmero de intentos" statictext #1.et2, msg2$, 14, 81, 176, 20 button #1.about, "A cerca", [about_click], UL,238,81,50, 25 'abrir el cuadro de dilogo msg3$ = "acetijo del nmero" open msg3$ for dialog as #1 'capturar el suceso de cierre print #1, "trapclose [cerrar]"; 'la primera vez se exhibe informacin 'acerca del programa gosub [aboutMyhiloSub] [juego] 'piensa un nmero guessMe = int(rnd(1)*100) + 1 print #1.guessField, "listo:" [espera1] 'bucle principal de espera input Variable$ goto [espera1] [guessNow] 'que nmero ha tecleado: acert o no... print #1.ed1, "!contents?" input #1.ed1, guess 'ha obtenido dicha informacin let count = count + 1 'incrementa contador if guess = guessMe then [acerto] if guess < guessMe then status$ = "debe ser mayor" if guess > guessMe then status$ = "debe ser menor" msg4$ = status$ + " " + str$(count) + " intentos" print #1.et2, msg4$ 'esperar ms entradas
goto [espera1] [acerto] beep 'acert en el juego msg5$ = "gan en " + str$(count) + " intentos" print #1.et2, msg5$ 'preparar por si se juega de nuevo count = 0 goto [jugar] [about] 'abre un cuadro de dilogo acerca de... gosub [aboutMyhiloSub] goto [espera1] [aboutMyhiloSub] 'aqui es donde este cuadro de dilogo se exhibe WindowWidth = 368 WindowHeight = 190 'slo hay un texto esttico y un botn ok 'se podra haber hecho con notice n$ = chr$(13) titulo1$ = "acertijo de un nmero entre 1 y 100:" +_ n$ +_ "si no lo acierta, el programa le indica si el " +_ n$ +_ "nmero ha de ser mayor o menor. Si lo acierta, se " +_ n$ +_ "le indicar el nmero de intentos en que lo ha " +_ n$ +_ "conseguido." statictext #2.et1, titulo1$, 22, 16, 312, 80 button #2.oK, "OK", [ok2_click], UL, 278, 111, 64, 35 'abrir este cuadro de dilogo open "acerca de acertijo" for dialog_modal as #2 'capturar el cierre print #1, "trapclose [ok2_click]"; [espera2] input r$ goto [espera2] [closeAboutBox] 'cuando se pulsa el botn ok o se cierra el 'cuadro de dilog con los mtodos usuales close #2 return [quit] close #1 end