guia real basic bien basic

Upload: willian-wallas

Post on 08-Jul-2015

2.201 views

Category:

Documents


0 download

DESCRIPTION

Guia de de REALBASIC(c) efectuada de recopilaciones de autores antónimos, para iniciarse en la programación de esta util herramienta de desarrollo

TRANSCRIPT

1////137

En memoria de Barry Horne..

Barry Horne fue un activista britnico, vegano de base, firme en la lucha por la defensa de los animales. Horne, nacido en Northhampton, fue condenado en 1997 a lo que se considera la sentencia ms larga contra un activista por la Liberacin Animal -18 aos de prisin- una condena que ni siquiera reciben muchos violadores, narcotraficantes o criminales en serie. Se le acus de daos por 5,8 millones de libras esterlinas en incendios provocados en protesta contra los abusos de animales en experimentos cientficos (cabe destacar que dichos incendios se provocaban nicamente cuando no haba personas que pudieran perecer en el atentado). ..El objetivo de sus huelgas de hambre no era conseguir su propia libertad, sino forzar al Gobierno britnico a poner en marcha una comisin oficial para valorar los abusos cometidos con los animales viviseccionadosEl 60% de los experimentos en el Reino Unido se hace sin ningn tipo de anestesia. Todos los animales mueren como consecuencia de los experimentos o son aniquilados al acabar los experimentos.

2////137

Estimado estudioso o interesado en aprender a programar: la relacin que vamos a tener va a ser muy directa, ms que como profesor y alumn o, como dos amigos interesados en ayudarse, por lo que voy a tutearte, para hacer ms entretenida estas clases o sesiones de aprendizaje. Para empezar la sesin lo primero es lanzar la aplicacin RealBasic. Tanto si se tiene la versin classic o la X el resultado es similar: se abren una serie de ventanas, con distintos nombres. Estas en el IDE (integrated development environment) que es un ambiente de programacin. En este ambiente diseas tu programa, pruebas lo que haces, ves resultados, etc., siempre dentro de la aplicacin RealBasic (RB). Cuando lo que programas has comprobado que funciona y est finalizado, es cuando compilas lo programado, creando una aplicacin independiente que funciona de forma autnoma. Esta aplicacin llevar tu nombre, tu diseo de icono, la versin que hagas, etc. Uno de los mens del RB permite hacer correr lo programado: Debug-Run. Cuando haces un "run", tu programa "corre" dentro del RB, y cuando sales de tu programa ests de nuevo en el RB, en el ambiente de la programacin. Entonces, dentro del RB tienes la zona de programacin, que es el llamado editor, y la posibilidad de verlo correr cuando haces RUN. Cuando abres RB, creas un PROYECTO. Cuando grabas, das nombre al proyecto. Siempre puedes ir a la ventana del proyecto con comando 0. El proyecto siempre incorpora de entrada una ventana llamada "window1" y un men llamado "menubar1". Eso es porque toda aplicacin tiene al menos una ventana, y la mayora tienen mens. En versiones modernas de RB adems de estas dos ventanas aparece otro componente que aparece con el nombre "app". Si haces dobleclick sobre "window1" se abre esta ventana window1, que aparece en primer plano. Detrs est la ventana proyecto. Si cierras esta ventana, y haces luego dobleclick en el elemento window1 del proyecto, se vuelve a abrir. La ventana es un ELEMENTO, con PROPIEDADES (caractersticas que la definen). Las propiedades de la ventana aparecen en una ventana situada a la derecha, encabezada como 'properties'. En esta ventana, que aparece y desaparece con comando-opcin 2, se muestran las propiedades de la ventana, en el caso de que esta ventana est seleccionada. Pero tambin se muestran las propiedades de cualquier otro elemento que luego usemos y est seleccionado. Ya lo veremos ms adelante. Propiedades de la ventana: no hace falta aprenderlas, lo importante es ir conocindolas poco a poco (algunas no las usaras nunca).

3////137

Primera propiedad: 'name' (nombre) es window1. Puedes cambiarlo: toca con el cursor donde pone window1 de la ventana properties, y teclea ventana1 (sin espacios). Si saltas a otro sitio, vers que la ventana tiene ya otro nombre que se refleja en el proyecto. NOTA: los nombres de elementos no permiten espacios ni otros signos. Si quieres escribir como nombre 'Ventana verde, debers usar el guin inferior 'Ventana_verde' Otras propiedades de la ventana son 'width' (anchura) y 'eight ' (altura). Si estiras la ventana con el ratn vers que estos valores cambian. Y si primero cambias estos valores, veras que la ventana se acomoda a los nmeros que escribas. Estos nmeros de width y eight son pixeles de pantalla. Propiedad 'title': untitled. Cambiala escribiendo en la ventana properties lo que quieras, por ejemplo 'Mi Ventana' (como esto no es nombre de elemento, puede tener espacios y smbolos). Bueno, no toques nada ms. Puedes grabar el proyecto y darle nombre. Por ejemplo, 'Proyecto A'. Empecemos por aadir elementos a la 'Ventana1'. Veras que a la izquierda est siempre presente una ventana con un conjunto de elementos que aparecen con iconos relativos a lo que son. La ventana aparece y desaparece con las teclas comando-opcin 1 Estos elementos se aaden a las ventanas, no al proyecto. Comencemos arrastrando un botn a nuestra ventana. El botn (pushbutton) aparece con las letras OK. Arrstralo sobre la ventana1. Aparece un botn seleccionado, con las letras 'untitled' Veras que la ventana properties ha cambiado, pues ahora muestra las propiedades del botn aadido. Si tocas en la ventana y se deselecciona el botn, las propiedades vuelven a ser las de la ventana1. Bueno, este botn vemos que se llama pushbutton1. Cambiemos su nombre por algo ms lgico para nosotros: 'BotonRun' Una propiedad es el 'caption' (encabezado) del botn, que ahora es untitled. Lo vamos a cambiar por 'OK' Resumen, tenemos una ventana con un botn. Y hemos cambiado caractersticas de ambos elementos. Vamos a aadir otro elemento a 'ventanal'. Es este caso, un elemento de texto, denominado 'StaticText'.

4////137

De la ventana de elementos, hay uno que muestra como icono 'Aa'. Arrstralo sobre 'Ventana1' a la posicin que desees. Si est seleccionado, vers en propiedades que se denomina 'StaticText1'. Cambiemos su nombre en 'Name' por otro ms fcil de recordar: 'MiTexto'. En propiedades, aparece bajo el epgrafe 'Appearance' la propiedad 'Text' que es precisamente el texto que muestra este elemento. Por defecto, 'text' es 'Label' pero podemos cambiarlo de dos formas: si el elemento est seleccionado, basta con que tecleemos cualquier texto. La otra forma es ir a la ventana 'properties' y cambiar donde pone 'label' y escribir lo que queramos. Vamos a poner 'HOLA'. Entonces, este elemento muestra como propiedad 'texto' la palabra 'HOLA'. Con el ratn, vamos a desplazar este elemento por la ventana hasta una posicin 20, 30, es decir, left=20 y top=30 En una ventana, la esquina superior izquierda es el punto 0, 0., luego el punto left = 20 equivale a desplazar 20 pixels a la derecha del 0 y el punto top=30 equivale a desplazar hacia abajo 30 pixels. Podemos ver donde estamos desplazando el elemento y examinando la ventana 'properties' mientras desplazamos. Tambin podemos asignar, en la ventana properties, el valor 20 a la propiedad 'left' y el valor 30 a la propiedad 'top'. Pasemos a ver ahora como funciona un programa. Lo primero es saber que los elementos de la ventana no hacen nada por s mismos, es preciso que les demos instrucciones para efectuar algo. Vamos a ello: Hacemos dobleclick sobre el botn de nombre 'BotonRun'. Se nos abre una nueva ventana, que se denomina 'Code Editor' y que corresponde a elementos de la ventana (o a la propia ventana) en la cual hemos hecho dobleclick. Este Editor muestra dos partes: a al izquierda, los elementos de 'Ventana1' y las acciones que pueden realizar esos elementos (Action, Close, GotFocus..) y a la derecha una zona de escritura donde escribir el cdigo que queramos. Bueno, de las diferentes opciones asociadas a 'BotonRun' aparece seleccionada la denominada 'Action' (acccin o actividad) que es justamente el tipo de accin o actividad que har el botn cuando se pulse por el usuario. En el editor, aparece los comandos o trminos del lenguaje Basic 'Sub', que significa inicio de una Subrutina, y 'End Sub', que es el

5////137

final de la Subrutina. As pues, la subrutina 'Action' del BotonRun est vaca de programacin. Pues vamos a escribir algo en esta subrutina. Por ejemplo, nos gustara que al pulsar el 'BotonRun' el texto 'HOLA' que aparece en la ventana de nuestro programa se cambie de posicin, y de estilo. Pues vamos a teclear un cdigo muy simple: Para decirle al elemento 'MiTexto' que se desplace al punto 100, 150, simplemente le asignamos esos valores a sus propiedades, escribiendo debajo de Sub: Ventana1.Mitexto.left=100 Ventana1.Mitexto.top=150 Bueno, pues lo que estamos haciendo es programar lo siguiente: Cuando el usuario pulse el botn 'BotonRun' que aparece con el caption 'OK', el BotonRun realizar la Subrutina 'Action' la cual lleva el cdigo que acabamos de escribir. El cdigo que hemos escrito es fcil de entender: primero, es jerrquico, de mayor a menor. Lo primero que se cita es el nombre de la ventana ('Ventana1'), luego el nombre del elemento al que hacemos referencia ('Mitexto') y por ultimo la propiedad de este ltimo que queremos modificar ('left'). En este cdigo jerrquico, siempre se separan los diferentes elementos (ventana, texto, propiedad, etc.) con un punto. La tercera lnea de programa que escribiremos en la subrutina 'action' es el siguiente: Ventana1.MiTexto.TextSize=18 que quiere decir que el TextSize (tamao texto) del elemento 'MiTexto' de 'Ventana1' pase a ser 18. La subrutina debe quedar as: SUB Action() Ventana1.Mitexto.left=100 Ventana1.Mitexto.top=150 Ventana1.MiTexto.TextSize=18 END SUB Ya est escrito nuestro primer programa. Grabemos para que no se pierda.

6////137

Y ahora vamos a ver si no nos hemos equivocado en la sintaxis, etc,. y ver cmo funciona. Cerremos la ventana editor, y en el Men 'Debug' elegimos Run. Se compila lo programado y vemos el RESULTADO: Se nos abre una ventana en la que aparecen un botn que pone OK y un texto que dice 'HOLA'. Si pulsamos el botn veremos que el texto cambia de posicin y tamao. Es todo. Para finalizar, elegimos en el men REALBASIC el tem Quit. Con eso finaliza nuestro programa y volvemos a entrar en el IDE, en el ambiente de programacin. Bueno, nuestro primer proyecto o programa ha sido muy simple. Vamos a hacer algo nuevo a partir de l. Lo primero, vamos a grabarlo con otro nombre para no perder el 'Proyecto A' original. Vamos a grabarlo como 'Proyecto B' usando el men Save As. Ahora vamos a ir un poco ms rpido, (1) Abrimos 'Ventana1'. Aadimos otro elemento del tipo Botn, y lo colocamos donde nos parezca. Le damos nombre : 'BotonQuit'. En el caption de este botn, escribimos 'FIN', y al hacer doble click sobre l, se nos abre el editor, apareciendo seleccionado el evento 'action' con la Subrutina correspondiente vaca. En esta subrutina escribimos 'quit' quedando as: SUB Action() quit End Sub Quit es un comando de basic y cuya accin es esa, quit, finalizar el programa. (2) Nos vamos al editor, y seleccionamos del evento 'action' y vemos las lneas que ya habamos escrito. Aadimos otra lnea: Ventana1.MiTexto.text = ADIOS Qu significa? No es difcil darse cuenta, que este cdigo le dice a MiTexto de Ventana1 que el texto que debe mostrar es 'ADIOS' OJO: El texto, en programacin, SIEMPRE va entre comillas, es una manera de informar que se trata de texto y no de nmeros o variables. elemento BotonRun el

7////137

(3) Cerramos el editor, seleccionamos con un click el 'BotonRun' y en propiedades marcamos la casilla 'Default'. Ahora este botn estar seleccionado por defecto, es el botn que responder si el usuario pulsa retorno. Grabamos. Vamos a debug y seleccionamos el tem Run. Ahora en la ventana que se abre tenemos 2 botones, uno que dice OK, y aparece seleccionado, otro que dice FIN. Si pulsamos OK o retorno vemos el resultado de lo que programamos. Si pulsamos Fin el programa finaliza y volvemos al IDE. Finalizamos as la primera sesin.

8////137

SESION 2 En esta sesin 2 damos por supuesto que se han entendido y se recuerdan las nociones bsicas realizadas en la Sesin 1. Si este no es el caso, se recomienda volver a leer y practicar de forma lenta y reposada, las actividades realizadas previamente. Es necesario que poco a poco se vayan asimilando cuestiones generales, para poder avanzar en la programacin. As, las cuestiones relativas a dar nombre a los elementos, a cambiar sus propiedades, a entender la sintaxis, a hacer correr el programa, etc. deben estar ya asimiladas. Tambin es recomendable ir guardando una lista de los comando basic que van apareciendo, y desde luego, practicar un ingls elemental o tener a mano un diccionario (el Ultralingua que se encuentra en internet, por ejemplo). Resumiendo: las sesiones cada vez sern menos detalladas en cuanto a cmo dar nombre a una ventana, o cambiar sus dimensiones, etc. De forma que muchos detalles explicados en las primeras sesiones irn desapareciendo ya que se supone que el lector las domina y sabe cmo realizarlas. Lanzamos RealBasic. Comenzamos por darle nombre a la ventana inicial que aparece en el proyecto, cambiando el nombre que aparece por defecto: 'Window1' , por 'Ventana1'. Le damos un tamao a la ventana de 400 de ancho (width) por 200 de alto (height). Aadimos un Pushbutton (botn) a esta ventana. Lo colocamos donde nos plazca y lo denominamos 'BotonQuit'. Como ttulo, ponemos en su propiedad caption 'FIN' Hacemos doble-click sobre el botn y se nos abre el editor, en la SUBRUTINA action. Tecleamos 'quit' que es un comando de basic que debemos recordar, ya que es el cierre de nuestro programa-aplicacin en basic. Aadimos un segundo botn a nuestra 'Ventana1' y le damos como nombre 'Boton1' y como caption escribimos 'Cambio de ventana'. ! A RECORDAR: Las ventanas, los elementos de una ventana, y las variables que veremos ms adelante, no pueden tener en su NOMBRE espacios, smbolos de suma, resta, etc. Pero las CAPTION son texto, y s pueden llevar cualquier tipo de smbolo. Una caption puede ser 'Mi Ventana' pero si queremos llamar as a una ventana o dar ese nombre a

9////137

un elemento debemos usar el guin bajo uniendo las palabras: 'Mi_Ventana'." Nos vamos ahora al Menu File del RealBasic y elegimos 'New window'. Aparece una nueva ventana, cuyo nombre por defecto cambiaremos a 'Ventana2'. Le daremos el mismo tamao 400 x 200 que le dimos a 'Ventana1'. Aadimos a 'Ventana2' un botn al que daremos por nombre 'Boton1', y en cuyo caption pondremos 'Cambio de ventana'. Adems, en la ventana propiedades correspondiente a este botn, ponemos en OFF la propiedad 'enabled' lo que significa que este botn estar inactivo. Para ponerla en OFF punteamos (deseleccionamos) el cuadradito que aparece seleccionado. Si esta propiedad est OFF podemos decir que desde el punto de vista del cdigo basic es equivalente a escribir: Boton1.enabled = false Si est en ON, es equivalente a decir : Boton1.enabled=true (enabled puede traducirse como habilitado)

Tenemos as, dos ventanas, y es la primera la que se usa por defecto, es decir, si el programa 'corre' (Run) , la primera ventana que se abre, la ventana inicial o principal es la que estaba por defecto en el proyecto (aunque esto se puede cambiar si se desea). Una cosa importante: CADA VENTANA ES UN ENTORNO PRIVADO, de forma que los controles (botones, textos, dibujos, etc.) de la 'Ventana1' son propios e independientes de los correspondientes de la 'Ventana2'. De esta forma podemos tener un botn con el mismo nombre en cada ventana sin que se interfieran entre ellos: Ventana1.boton1 Ventana2.boton1 cdigos que hacen referencia a elementos distintos de ventanas distintas. Es importante recordar que los elementos o controles son especficos de ventana.

En la 'Ventana1' hacemos dobleclick sobre el 'Boton1' y se nos abre el editor, en la SUB action. La sub 'action' es un evento, uno de los

10////137

posibles eventos que puede recibir el botn por actividad del ususario. Los posibles eventos se muestran en el editor. Bueno, pues en este evento action tecleamos: SUB action() Ventana2.show END SUB El trmino 'show ' no corresponde a un evento, pues no es una respuesta a la actividad del usuario. Show es un 'mtodo' , es un tipo de accin predeterminada por el RB para el elemento ventana, que fuerza a que la ventana a hacerse visible. Al realizarse este mtodo, la 'Ventana2' se activar y pasa a ser la ventana frontal, la ventana disponible al usuario. Ahora hacemos algo equivalente en el 'Boton1' de la 'Ventana2'. Hacemos dobleclick en el 'Boton1' de la 'Ventana2' y en el editor aparece la SUB action, en la que escribimos: SUB action() Ventana1.show END SUB Lo que estamos 'programando', es que haya un botn en la ventana1 que al pulsarlo se abra y se muestre la ventana2, y en la ventana2 un botn que muestre la ventana1 . As el usuario, al pulsar los botones, cambia la ventana activa. Nos falta hacer algo : recordemos que el 'Ventana2.Boton1' estaba inactivado de inicio (enabled=false) por lo tanto debemos activarlo para que el usuario pueda pulsarlo. Hay varias formas de hacerlo, y entre ellas vamos a usar un evento de la propia ventana a la que pertenece este botn. Este evento es la apertura de la ventana, el evento denominado 'Open', que es el proceso de mostrarse la ventana (este evento puede ocurrir por actividad del usuario o mediante cdigo). Si hacemos dobleclick sobre alguna parte de 'Ventana2' se abre el editor, y aparece justamente la SUB open. Escribimos SUB OPEN() Ventana2.boton1.enabled=true END SUB y cerramos el editor. Con este cdigo estamos modificando la propiedad 'enabled' del 'Boton1' de la 'Ventana2' y haciendo que el botn est disponible por el usuario. Como puede notarse, el evento se dispara cuando la propia ventana2 se abre.

11////137

Bueno, pues parece que est todo dispuesto para hacer 'correr' al programa que hemos escrito. Primero lo grabamos con el nombre que nos parezca, para que si hay algn error gordo, no perdamos el trabajo realizado. Ahora vamos al Menu 'Debug y seleccionamos 'Run'. Se nos aparece la ventana inicial, y si pulsamos el botn 'Cambiar de ventana' se nos aparece de la nada la segunda ventana, que queda en primer plano, etc. Bueno, pues ya empezamos a ver como funcionan las ventanas y sus elementos, y vemos que preparar este tipo de interaccin del usuario con botones y acciones, es relativamente fcil, y bastante intuitivo. Finalizamos nuestro programa con comando+q, o pulsando el boton 'Fin' de 'Ventana1' Un problema que observamos en nuestro programa es que las dos ventanas se superponen en pantalla, lo que es bastante molesto, pues no podemos ver lo que contiene cada una de forma simultnea. Vamos a solucionarlo, modificando ligeramente el cdigo: En la SUB open de 'Ventana2' vamos a aadir una lnea de cdigo debajo de la previamente escrita: (recordemos: cada instruccin o cdigo debe ir en una lnea diferente). SUB Open() Ventana2.top=300 END Sub Que es decirle a 'Ventana2' que su propiedad 'top' (posicin en altura) sea 300 pxeles contando desde la lnea de pantalla superior. Si ahora hacemos un run, vemos que las dos ventanas ocupan espacios distintos y no solapan. Finalizamos pulsando el botn 'Fin' de 'Ventana1'. Por ltimo, vamos a examinar otro 'evento' que es tpico de ventanas y otros elementos. Hacemos doble click sobre el 'BotonQuit' (Fin) de 'Ventana1'. Se abre el editor en la SUB action. Pero nosotros seleccionamos la SUB MouseEnter que corresponde a la actividad del usuario en la cual el cursor del ratn entra o pasa por encima del propio botn. Escribimos: SUB MouseEnter() Beep End Sub

12////137

Beep es otro comando basic que conviene recordar, y que simplemente hace sonar, por una sola vez, el sonido que est activo en nuestro ordenador. Cerramos el editor. Hacemos run. Cuando movemos el ratn y pasamos por encima del botn FIN se oye el sonido una sola vez. Este evento es muy simple, y puede aplicarse a otros elementos. Finalmente, y como otro tipo de evento que muestra la relacin usuario-programa, vamos a aadir un nuevo elemento a 'Ventana1'. Con comando + opcin + 1, abrimos la ventana de controles de RealBasic. Arrastramos sobre 'Ventana1' un elemento que aparece con forma de ovalo. En la ventana propiedades, vemos que se denomina 'Oval1'. Cambiemos su nombre, llamndolo 'Ovalo'. Entre las propiedades de este elemento hay una llamada 'FillColor'. Tocamos sobre esta propiedad y se nos abre una ventana para elegir un color. Elegimos el que nos parezca. Nos vamos a nuestra 'Ventana2' al 'Boton1', y hacemos dobleclick sobre l. En el editor que se nos abre, buscamos la SUB 'MouseEnter, y aadimos una lnea de cdigo: Sub MouseEnter() Ventana1.Ovalo.visible=false End sub Que simplemente dice que el ovalo se hace invisible cuando el ratn dirigido por el usuario entra en la zona que ocupa el botn. Sin cerrar el editor, buscamos el evento o SUB con el nombre 'MouseExit' que como su nombre indica, es el evento relacionado con el momento en que el cursor del ratn abandona la posicin o rea ocupada por el ratn. Este evento est prximo a MouseEnter. En esta SUB MouseExit tecleamos el cdigo: Sub MouseExit() Ventana1.Ovalo.visible=true End sub Ya podemos grabar y hacer Run para ver si todo funciona bien y como esperamos. Observamos como la actividad del usuario dispara acciones en una u otra ventana.

13////137

Hasta ahora hemos visto las propiedades de algunos elementos (botones, ventanas) mediante la ventana propiedades que se muestra/oculta con la combinacin de teclas comando +opcin+2 Pero hay otras propiedades que no se muestran ah, pero que pueden consultarse invocando la Ayuda de RealBasic, mediante la combinacin comando+1 Cuando se abre la ayuda, aparecen un listado de elementos a la izquierda que puede ser por temas o alfabticamente. Si en la parte superior tecleamos 'windowclass' y pulsamos el botn 'search' aparecen un listado de propiedades asociadas a cualquier ventana ( backcolor, backdrop .height. title.zoomicon), de mtodos (AcceptFileDropshowupdateNow) y de eventos (Activate.MouseEnter.resized) . No es preciso conocer como funcionan estas Mtodos y Eventos, ni para que sirven todas las Propiedades de una ventana. Lo importante es saber que cada elemento tiene sus Propiedades, Mtodos y Eventos, y que cuando precisamos alguna caracterstica, podemos CONSULTAR esta ayuda y examinar para que vale y qu hace cada Mtodo y Evento. Algunos Eventos ya los conocemos (MouseEnter) y tambin hemos visto algn mtodo (show). Poco a poco se van aprendiendo segn las necesidades de programacin. En resumen: NO ES NECESARIO aprender primero y luego programar, ya que somos aficionados y no profesionales, y lo que queremos es divertirnos y no estar sufriendo a base de aprender pginas y pginas de comandos, etc. Otro detalle que hemos visto: cuando escribimos cdigo, al teclear el nombre de un elemento existente o de una propiedad del mismo, el RealBasic nos ofrece la posibilidad de aceptar la palabra correcta, mostrando en gris el texto correcto que nos falta por teclear. As, si tenemos una ventana llamada 'MiVentana' y empezamos a teclear 'MiV' el RealBasic nos presenta la opcin de escribir el nombre completo. Para ello, cuando intenta adivinar pulsamos la tecla Tabulador para ver las opciones que interesan. (Lo que pretendo decir, es ms fcil de examinar que de explicar). Es una ayuda bastante til.

Otra caracterstica que hemos visto, o podemos encontrar: Si cometemos un error al teclear el cdigo, cuando hacemos Run el RealBasic detecta el error, se detiene en el punto errneo y muestra algn tipo de mensaje relativo al error cometido.

14////137

Por ejemplo, si en lugar de ventana.Show se teclea por errror Ventana.sohw, el RealBasic se detiene cuando hacemos run y nos muestra un mensaje diciendo que hay una variable desconocida. Se dice que el editor ha entrado en fase de depuracin (Debug) de errores.

15////137

Esta sesin es bastante terica, por lo que conviene leerla con atencin, y si no queda clara, leerla ms de una, y ms de dos veces. Y si incluso as quedan dudas, lo mejor es releerla, ...................... y en ultimo caso comprarse un libro de RealBasic. El autor ha aprendido a programar de forma autnoma, sin direccin ni gua, simplemente batallando a lo de muchos aos con distintas formas de basic y pascal, y quizs no sepa transmitir de forma clara lo que es un programa, cmo se estructura y cules son los elementos ms importantes para el que se inicia. Pero hay que pensar que lo que se explica a continuacin, est muy condensado, y equivale a varios captulos de un libro escrito por un experto en Basic y en Realbasic. BASIC El Basic es un lenguaje de programacin muy antiguo, que utiliza sintaxis simple y fcil de recordar del idioma ingls. Es un lenguaje de alto nivel, en el sentido de que cada instruccin encierra un conjunto de instrucciones ms simples de un lenguaje de nivel inferior, ms bsico, ms cercano a las instrucciones de mquina. El RealBasic es sin embargo un lenguaje moderno, orientado a objetos (ventanas, botones, ratn, teclado, imgenes, etc.), pero que sigue utilizando comandos o sintaxis del basic clsico. Es importante que el usuario nuevo en RealBasic, aprenda el basic clsico, o al menos, que tenga un libro bsico en el que se expliquen los diferentes comandos del basic. La ayuda online del RealBasic (comando+1) explica el uso del Basic y muestra ejemplos de su utilizacin, por lo que conviene acudir a la misma cada vez que se precise. Sugiero que cada comando del basic que aparezca en estas sesiones se apunte en una hoja para recordarlo. Por ejemplo, Quit, Beep SUBRUTINAS Hemos hablado en sesiones anteriores de SUBRUTINAS. Una subrutina, o simplemente una Sub, es un grupo de instrucciones que pueden realizar una o muchas acciones. Una SUB es como una isla, esta aislada del resto de SUBs , realiza una accin pero no tiene por qu afectar a otra Sub. Las Subrutinas son tambin llamadas Mtodos. O a la inversa, un Mtodo es una Sub. Un programa en RealBasic es en esencia un conjunto de Mtodos o subrutinas que ocurren una tras otra completando un circuito. Siempre hay como una carretera que marca el orden en que ocurren los mtodos: primero se abre una ventana, esta

16////137

ventana muestra unos botones, un botn nos lleva a otra ventana a ejecutar una subrutina que cuando finalice nos devuelve al punto de partida, etc., etc. Una caracterstica muy til de las Subs. es que sus variables son privadas, son especficas de la SUB en cuestin. De esta forma, el programador no tiene que estar obsesionado con los nombres que asigna a variables de una SUB, porque no salen de ah. Podemos tener una variable llamada Total en 3 o mas SUBs sin problema alguno, sin que se interfieran las Subrutinas entre s. Igual que ocurre con los elementos de una ventana, que como ya hemos dicho, son especficos de ventana. De esta forma una ventana es un entorno cerrado, al igual que una SUB. Tipos de Datos o Variables Hasta ahora hemos visto algunas Propiedades de ventanas, de pusbuttons, etc. Es muy importante saber que estas propiedades son y se denominan VARIABLES, y que existen diferentes tipos de Variables o Datos. Las variables ms importantes para iniciarse en la programacin son: Las de tipo texto que se denominan STRING Las de tipo numrico que pueden ser

o Nmeros enteros, y se denominan INTEGER o Nmeros reales (con decimales) y se denominan DOUBLE (o SINGLE) Las de tipo verdadero o falso, que se denominan BOOLEAN

EJEMPLOS: (a) Si escribimos Ventana.Left= 200 La propiedad o variable Left es un nmero entero, un INTEGER Por lgica, si la pantalla consta de pxeles y Left indica el nmero de pxeles hacia la izquierda en donde se coloca la ventana, el valor de Left no puede ser 200,35 ya que no existen 0.35 pxeles. As pues, es lgico que Left sea un entero (integer). Las variables numricas (Integer , Single y Double) admiten manipulaciones propias de nmeros: suma, resta, divisin, etc. Tambin es lgico darse cuenta que si necesitamos el resultado de una divisin entre dos nmeros, este resultado debiera asignarse a una variable numrica tipo DOUBLE ya que nos gustar ver los decimales resultantes de la divisin, los cuales no podremos ver si asignamos tipo integer al resultado de la divisin. Por la misma razn, el valor de pi (3.14169) debe estar en una variable DOUBLE (significa doble precisin). 17////137

(b) Si queremos que el Titulo de una ventana sea Mi Ventana y sabemos que este ttulo se debe teclear en la propiedad caption de la ventana, el valor de caption es precisamente el conjunto de letras que configuran la frase Mi Ventana Pero Mi Ventana es un texto , es un STRING, no es un nmero evidentemente. Y los strings tienen caractersticas y admiten manipulaciones distintas a los nmeros. IMPORTANTE: Los textos o strings SIEMPRE se delimitan con comillas dobles: Ventana.caption= Mi Ventana es la forma correcta de asignar el valor Mi Ventana a la variable tipo string Caption. (c) Cuando escribimos Boton.Visible=false , Ventana.enabled=true Estamos usando un tipo de dato BOOLEAN (booleano, del lgebra de Boole) cuyas alternativas ms simples son True (verdadero) y False (falso). Variables de usuario En la programacin no solo se precisan las variables propias de un elemento (propiedades) sino que se necesitan variables definidas por el programador para realizar determinadas acciones que son la finalidad de su programa. Las variables propias de elementos del RealBasic se denominan propiedades, luego una propiedad es en realidad una variable. Cuando se precisa una variable propia o de usuario (que no pertenezca a las ventanas o a sus elementos) es preciso definirla o dimensionarla (es lo mismo). Esto se logra con la palabra de basic DIM (de dimensionar) [RECORDAR] Definir una variable es simplemente decir que existe, dndole nombre y un tipo determinado (integer, boolean, etc,). En una SUB, las definiciones SIEMPRE van AL PRINCIPIO, en las primeras lneas. Esto debe ser as, porque las instrucciones de una SUB se leen o ejecutan desde arriba hasta abajo, de una en una, y naturalmente, antes de usar una variable es preciso decir que existe, que se llama Zutano, y es de tipo Fulano. IMPORTANTE: Las variables, al dimensionarlas, tiene por defecto determinados valores: si es numrica , por defecto vale cero 0

18////137

si es string es un texto vaco, sin ningn carcter, ni siquiera espacios, es decir si es booleana, por defecto es false Como una SUB es un mtodo aislado, privado, se deduce que si se ejecuta una SUB y a una variable numrica se le asigna el valor 47, cuando salimos de esta SUB la variable se pone a cero, y si volvemos a entrar en la misma SUB el valor inicial de esta variable es 0. Es decir, los valores de las variables de una SUB empiezan con los valores de defecto y terminan con esos mismos valores. La informacin no se guarda. Que ocurre si necesitamos una variable (informacin a fin de cuentas) para que sea usada simultneamente por la ventana y por varios de sus elementos? O empleada por varias SUBs a la vez? En este caso, definimos la variable de usuario como una propiedad GENERAL de la ventana (o incluso de todo el proyecto). Supongamos que necesitamos una variable comn para todos los elementos y SUBs de una ventana: entonces la definimos usando, del men Edit del RealBasic, el item New Property. Al invocarlo, se abre una ventana en la que ponemos el nombre de la variable y el tipo que le asignamos. Vamos a verlo en el ejemplo que sigue. Lanzamos el RealBasic (RB) En la ventana inicial window1 aadimos un elemento EditField, que aparece en la ventana de elementos como un rectngulo blanco con una barra vertical negra. Como al aadir un elemento en una ventana podemos ver su nombre inicial en la ventana properties, si no es lo que deseamos (un EditField) simplemente lo seleccionamos y borramos usando la tecla borrar del teclado.. Bueno, pues ahora aadimos un segundo editfield y lo colocamos debajo del primero. Tenemos as, el EditField1 y el EditField2. Aadimos un StaticText y le damos una anchura de 300 y una altura de 46. Finalmente, aadimos dos PushButtons, a los que ponemos, en su propiedad text, los valores o textos Concatenar y Finalizar Nos vamos al editor del botn Finalizar y en la SUB action escribimos: quit para poder finalizar el programa. Vamos ahora a la SUB action del botn Concatenar y escribimos el cdigo: 19////137

SUB Action() Dim palabra1 as string

20////137

Dim palabra2 as string Dim frase as string palabra1 = window1.editField1.text palabra2 = window1.editField2.text frase = frase + palabra1 + palabra2 window1.statictext1.text = frase END Sub Vamos a analizar el significado de estas expresiones o sintaxis de basic. Dim es un comando Basic para inicializar, definir o dimensionar una variable. En nuestro caso, la1 variable la definimos con el nombre palabra1 y tipo string (texto), e igual para la variable palabra2 y la variable frase. El smbolo igual = permite asignar un valor a la variable que aparece a la izquierda, de forma que si se escribe ab = 23, estamos dando el valor 23 a la variable ab. Si la variable ab vale 23, la asignacin ab = ab + 3 hace que el NUEVO valor de ab sea el que tena + 3 , es decir, ahora vale 26. Este es un tipo de sintaxis que a los principiantes les cuesta aprender, parece poco lgica, pero es totalmente usual en basic. Repetimos de nuevo: la variable a la izquierda del smbolo de igualdad = toma el valor correspondiente a lo que se expresa a la derecha del smbolo de igualdad. Si decimos ab = ab /2 estamos diciendo que el nuevo valor de ab es el que tena dividido por 2. Si decimos frase = frase + palabra1 estamos diciendo que la variable tipo string frase es desde ese momento igual a lo que originalmente era frase + lo que contiene palabra1. Las variables, al iniciarse, valen 0, si son numricas, y estn vacas si son de texto. Bueno, pues nuestra 4 lnea de cdigo ASIGNA a la variable palabra1 que es tipo string, el contenido de tipo string que tiene el elemento EditField1 en su propiedad text Si el usuario ha tecleado algo, un texto, en el EditField1, este texto estar en la propiedad text del editfield. Entonces, la asignacin hace que este texto tecleado lo tome la variable palabra1 La lnea 5 hace que la variable palabra2 tome el mismo texto que tiene el editfield2, sea un texto vaco, sea un texto tecleado por el usuario.

21////137

NOTA: Los valores de Window1.EditField1.Text y Window1.EditField2.text no se pierden por el hecho de que hagamos una asignacin de su contenido a otras variables. La lnea 6 de nuestro cdigo hace que frase sea igual a lo que contena frase + lo que contiene palabra1 + lo que contiene palabra2. Pero la variable frase es privada, y eso quiere decir que inicialmente su contenido por defecto es un texto vaco, es decir, nada. Por lo tanto, y a efectos prcticos, frase ser igual a la adicin de lo que contengan palabra1 y palabra2. La ultima lnea de cdigo lo que hace es asignar a la propiedad text del elemento window1.statictext1 lo que se indica a la derecha del smbolo igual, es decir, el contenido o texto de frase. [La adicin de varios textos se denomina concatenacin.] Entonces en Statictext1.text tendremos unidos los textos originalmente tecleados por el usuario en los dos EditFied. Probemos si funciona: del men Debug elegimos Run. Aparece la window1 con dos editfields vacos y un statictext que reza label. Tecleamos tengo en el primer editfield y hambre en el segundo. Pulsamos el botn concatenar y el resultado de nuestro cdigo se muestra en el statictext. Aparece el texto tengohambre. Podemos cambiar los textos de los editfields y ver el resultado de la concatenacin cuantas veces queramos. RECORDEMOS: cada vez que pulsamos el botn concatenar iniciamos la SUB action de este botn, por lo que sus 3 variables privadas (palabra1, palabra2, frase) estn vacas. Finalizamos pulsando el botn Finalizar que sabemos que equivale a quit. Vamos a modificar ligeramente el cdigo anterior: Cambiemos la ultima lnea de la SUB action del botn Concatenar as: window1.statictext1.text = palabra1 + + palabra2 Ahora se concatenan 3 elementos, el texto de palabra1, un texto fijo escrito por nosotros (por lo tanto entrecomillado) que es simplemente un espacio, y el texto de palabra2. Al hacer Run y escribir lo mismo que antes, el resultado que aparece es Tengo hambre.

22////137

Finalizamos el programa. Una cosa que podemos observar es que cada vez que pulsamos el botn Concatenar, se nos muestra la unin de los textos ACTUALES del los dos editfields. El contenido previo de las variables palabra1 y palabra2 se pierde. Esto es lo normal, ya que como se dijo, al pasar por una Sub las variables empiezan vacas por defecto, no guardan informacin previa. Y cada vez que pulsamos Concatenar le decimos al RealBasic que se dirija a la Sub action de este pushbutton. Pero quizs nos interese no perder esta informacin previa. Si este es el caso, necesitamos una variable general de ventana, que no dependa de una Sub determinada, que sea accesible a cualquier sub de la ventana y a cualquier elemento. Vamos a definir una variable GENERAL de ventana, Abrimos el editor de Window1 y nos dirigimos al men Edit del RB, eligiendo el tem New Property. (este tem esta inactivo a menos que se abra el editor). En la ventana que aparece tecleamos frase as string (eliminamos la opcin 'private' suponiendo que est seleccionada) y confirmamos con el botn OK . Hemos creado o dimensionado una propiedad GENERAL DE VENTANA, propiedad que aparece en el apartado propiedades (properties) del editor y que podemos examinar, y editar, haciendo dobleclick sobre ella. (Esta modalidad de dimensionar una variable global de ventana no precisa aadir DIM delante del nombre). Como la variable frase est ahora definida como general, tenemos que eliminar la definicin de frase que est en la SUB action del botn concatenar Cambiemos el cdigo de la Sub action de Concatenar eliminando la lnea 3 que deca Dim frase as string NOTA : si una variable definida como general tiene el mismo nombre que una variable definida en el interior de una Sub (privada, por tanto) , en la Sub se usa la privada, en el resto de Subrutinas de la ventana se usa la general. Bueno, vamos a ver el efecto que tiene declarar frase como variable general

23////137

Ahora, el cdigo frase= frase + palabra1 + palabra2 concatena (une) lo que originalmente tena en su contenido la variable frase + el nuevo texto tecleado por el usuario en los dos editfield. La primera vez que pulsemos concatenar la variable frase est vaca, pero en la segunda ocasin, como su valor no es nulo, al texto anterior se une el texto nuevo de los editField. Y cada vez que pulsemos el botn Concatenar la longitud de frase ser mayor, e ir creciendo hasta que finalicemos el programa. Hagamos run y probemos con distintas palabras o letras. Finalicemos el programa. _________________________________________________ Un pequeo problema: el texto, al crecer, desborda el tamao asignado al elemento window1.Statictext y no lo podemos leer entero. Para solucionarlo: seleccionamos el elemento StaticText y entre sus propiedades vemos una que dice multiline. La seleccionamos. Esta propiedad permite que un texto aparezca en varias lneas.

24////137

En esta sesin vamos a practicar procedimientos utilizados en las sesiones previas, amn de algunas variantes interesantes propias del basic. Hagamos un pequeo programa. Queremos que unas cuantas personas (de 3 a 8 por ejemplo) introduzcan a travs del programa su nombre de pila y su edad. Y que el programa registre y guarde los nombres a la vez que hace un promedio de la edad de las personas que han accedido al programa. Lo primero, es pensar qu es lo que deseamos, y tener las ideas claras de como llevarlo a cabo. Para esto ltimo hay muchas formas, ya que el Basic admite llegar a lo mismo por caminos muy diferentes. Como nosotros todava sabemos muy poco, vamos a usar un mtodo simple. ================================================ Necesitamos: -

un campo donde el usuario teclee su nombre un campo donde teclee su edad un mtodo para tomar la informacin introducida en los campos, y almacenarla. un mtodo que haga el calculo de la edad promedio de las entradas, lo que implica ! sumar todas las edades que se introducen (suma de edades) ! saber cuantas edades se han introducido (numero de entradas) un botn asociado a la recogida de datos y realizacin de los mtodos un botn de salida o finalizacin del programa

-

Este sera el esquema inicial de trabajo. Y hacer este esquema es necesario cuando se pretende programar, de hecho, es una parte importante de la programacin, en ocasiones la ms importante. Parece evidente que necesitamos hacer un ciclo, el cual podr repetirse un nmero determinado o indeterminado de veces. Este ciclo bsico comprender la entrada de datos por el usuario, entrada que implica teclear nombre y edad, y entonces confirmar que ha finalizado. En este ciclo hay una rutina que se repetir varias veces: una vez un usuario teclee nombre y edad, y confirme la entrada, un mtodo tomar el nombre, y edad introducidos. Las variables para hacer esto no necesitan ser muy generales, pueden ponerse a cero en cada ciclo o entrada de datos, es decir, sern variables privadas de la SUB. Otra rutina del ciclo, que tambin se repetir, deber sumar las edades, guardar esta informacin para hacer el promedio, y guardar los nombre propios, por lo que deber mantener su informacin de un ciclo a otro, de una entrada a otra. Las variables no deben ponerse a cero, ya que se perdera las entradas de los usuarios, es decir, sern variables generales del ciclo o ventana. Veamos qu tipo de variables necesitamos: 25////137

El texto que se teclea es SIEMPRE un tipo de dato STRING Bueno, pues queremos que: el nombre de la persona que aparece en el EditField se guarde en una variable tipo String a la que queremos llamar 'nombre'. la edad se guarde en una variable numrica a la que llamaremos 'edad' . Como la edad es un nmero sin decimales, un entero, la asignaremos a una variable tipo INTEGER. el total de entradas lo guardaremos en una variable llamada 'total_entradas' que ser tipo INTEGER y de tipo general o compartido (no privado) la suma de las edades que se introducen lo guardaremos en 'Suma_Edades', que ser tipo INTEGER y de tipo general. el promedio de edades ser numrico pero llevar decimales, por lo que lo asociaremos a una variable DOUBLE a la que llamaremos 'promedio'. los nombres propios de cada usuario se guardarn en una variable general, de tipo STRING a la que llamaremos 'lista'. Necesitamos por lo tanto 6 variables definidas por el usuario. Las variables privadas de una SUB se definen o dimensionan en la misma SUB , y la sintaxis es: Dim nombre as string Dim edad as integer Las variables generales de ventana o globales de todo el proyecto se definen como se vio en la sesin anterior, con el tem New Property del men Edit del RB.

Bueno, pues vamos a empezar el programa. Lanzamos RealBasic. Se abre un proyecto con una ventana inicial window1. Empezaremos por crear las variables globales de ventana. Para ello, primero hacemos dobleclick sobre la ventana inicial Window1 y se abre el editor. Del men Edit del RealBasic elegimos New Property, y en la ventana que aparece tecleamos total_entradas as integer (eliminamos la opcin private suponiendo que est seleccionada) y confirmamos con el botn OK . Hemos creado o dimensionado una propiedad GLOBAL DE VENTANA que aparece en el apartado propiedades (properties) del editor y que podemos examinar, y editar, haciendo dobleclick sobre ella. (Esta modalidad de dimensionar una variable global de ventana no precisa aadir DIM delante del nombre).

26////137

Repetimos creando una New Property que ser: suma_edades as integer (eliminamos la opcin private) y confirmamos con OK. y otra que ser lista as string y confirmamos con OK Si examinamos la ventana editor, aparecen en properties las tres variables que hemos creado. Cerramos el editor. Sobre la ventana inicial Window1 aadimos, desde la ventana de controles, dos EditField (el icono de editfield aparece como un rectngulo en blanco con una lnea vertical negra). A uno le damos de nombre 'NombreEd' y al otro 'EdadEd'. A 'NombreEd' le damos en la ventana propiedades los valores 150 para left y 20 para top, y a EdadEd 150 para left y 50 para top. A la izquierda de 'NombreEd' aadimos un elemento StaticText al que ponemos por text 'Nombre propio ='. A la izquierda de EdadEd aadimos otro StaticText al que ponemos por text 'Aos ='. Aadimos otros 2 elementos statictext que colocamos en la parte inferior de la ventana. A uno le llamamos 'UsuariosSt' y le damos una anchura de 300 y una altura de 60. El 'text' puede ser varios guiones seguidos. Activamos la propiedad 'multiline'. Al segundo le llamamos 'PromedioEdadSt' y de 'text' ponemos un cero. A la izquierda de 'UsuariosSt' aadimos un nuevo StaticText cuyo text sea 'Nombres de usuarios ='. Y a la izquierda del PromedioEdadSt aadimos otro StaticText cuyo text diga 'Promedio de edades ='. Aadimos un pushbutton al que no hace falta cambiar de nombre pero al que pondremos como caption 'Aceptar' y otro pushbutton al que ponemos de caption 'Finalizar'. Hacemos doble click sobre el botn con texto 'Finalizar' y en el editor, en action escribimos Quit. 27////137

Hacemos ahora dobleclick sobre el botn con texto 'Aceptar' y aparece la SUB action asociada a este botn. Aqu es donde vamos a poner un cdigo nuevo. Escribimos SUB action() Dim nombre as string Dim edad as integer Dim promedio as double nombre = nombreEd.text rem el texto del editfield lo asignamos a la rem variable nombre edad = val(Window1.EdadEd.text) rem texto del editfield se asigna a rem variable edad suma_edades= suma_edades + edad rem sumamos la nueva edad a la rem suma de anteriores edades total_entradas=total_entradas + 1 rem total de entradas aumenta una unidad promedio=suma_edades/total_entradas rem se calcula el promedio lista = lista + nombre rem se unen los nombres propios introduci-rem por cada usuario window1.usuariosSt.text = lista rem ponemos la lista de nombres en rem el elemento StaticText window1. promedioEdadSt.text = str(promedio) END SUB (NOTA: puedes copiar el cdigo anterior y pegarlo en la sub correspondiente, pero no copies ni la primera ni la ultima lnea) Vamos a estudiar en detalle aspectos nuevos que aparecen en estas ltimas lneas. REM es una palabra BASIC que permite aadir comentarios del programador. El texto a la derecha de REM y en la misma lnea, no se lee por el Basic, no significa nada, no se interpreta. Es una buena costumbre aadir comentarios al programar, para recordar lo que se pretende, y para entenderlo si ms adelante volvemos al mismo cdigo. El smbolo igual = permite asignar a la variable que aparece a su izquierda, el valor resultante de la expresin que aparece a su derecha. Es por tanto un comando basic. Las variables, al iniciarse, valen 0, si son numricas, y estn vacas si son de texto. Entonces el valor inicial de TODAS nuestras variables es cero o vacas. Si en un momento queremos poner a cero una variable numrica (ab) , nuestro cdigo debe asignar : ab = 0

28////137

Y si es una variable de texto (palabra) ponerla a cero o vaciarla de texto se escribe como palabra = "" Bueno, seguimos con la SUB: La linea 4 asigna a la variable nombre el texto introducido por el usuario en el EditField correspondiente a la entrada de su nombre propio. La linea 5 asigna a la variable edad el VALOR NUMRICO del texto introducido por el usuario. Como la variable edad es numrica, no podemos asignarle un texto. Necesitamos convertir el texto (string) a nmero (Integer). Para ello se usa un comando basic, VAL, cuya sintaxis es: numero = val (string) ejemplo: El val(16) es un nmero que vale 16 Hay un comando basic llamado STR que hace lo contrario: transforma un texto en nmero: string = str (nmero) ejemplo : si una variable string llamada 'sumatorio' lleva el texto "342" entonces el STR(sumatorio) es un texto con los caracteres 346 Este comando se usa en la ltima linea de cdigo, para colocar el valor numrico promedio en la propiedad text de un staticText.

Hacemos RUN y exploramos el programa. Por ejemplo, tecleamos Pedro y 24 y pulsamos el botn 'Aceptar' Etc., etc.

Un problema poco importante: cuando se unen los nombre de dos usuarios, en la lista ambos nombre aparecen sin espacio separador. ! Tarea 1 Modifique Vd. mismo el programa para que cada nombre quede separado del anterior por un guin. 29////137

! Tarea 2 Aada Vd un staticText en la parte superior de window1 que indique al usuario lo que debe hacer: teclear nombre, teclear edad, pulsar botn 'aceptar' (es decir, instrucciones para el usuario). ! Tarea 3 Para saber el nmero de usuarios que han introducido datos, aada Vd uno o dos StaticText que reflejen el numero de usuarios que ya han introducido datos.

Soluciones Si no ha sido capaz de realizar las 3 tareas anteriores, lea las posibles soluciones que se le ofrecen a continuacin: (1) Una solucin es modificar la sentencialista = lista + nombre

y cambiarla por esta: lista = lista + nombre + "-" que aade un carcter guin (como es texto, siempre entrecomillado) al final del nombre aadido a la variable 'lista' (2) Se trata simplemente de desplazar todos los elementos de la ventana inicial hacia abajo, dejando sitio para aadir un StaticText al cual le pondremos en la propiedad 'text' las instrucciones que nos parezcan oportunas. Por ejemplo: Introduzca nombre propio y edad en los campos apropiados y confirme pulsando el botn que dice "Aceptar". (3) Dos StaticText nuevos uno junto a otro en la misma horizontal. El de la izqda. en su 'text' que diga "N usuarios introducidos=" . El de la derecha ser ms estrecho y llevar como 'text' inicial un cero, y por nombre "NumeroUsuariosSt'. Nos falta aadir una linea de cdigo que refleje en este statictext el valor de la variable general 'total_entradas' que es donde guardamos el nmero de usuarios que han pulsado el botn 'aceptar' NumeroUsuariosSt.text = str(total_entradas) Esta lnea la aadimos a la SUB action del botn 'Aceptar' . Es importante la posicin en la que se aade: tiene que ir posterior a la lnea de cdigo total_entradas=total_entradas + 1

30////137

para que la variable refleje el nmero correcto de usuarios que han introducido datos.

Finalizamos con un resumen de comandos Basic examinados hasta esta sesin: Quit Beep Rem = Dim + Val Str

NOTA: RealBasic no acepta comillas tipogrficas, de forma que si se escribe en un procesador de texto debe tenerse cuidado de no usarlas al hacer 'copy' y 'paste'.

31////137

Cuando se hace referencia a elementos de una ventana desde esa misma ventana o desde elementos que pertenecen a la misma, no es necesario incluir el nombre de la ventana. Por ejemplo, en 'window1' tenemos un 'editfield1' y un 'pushbutton1' Si queremos aadir un texto ("Hola") a este editfield desde la SUB action de 'pushbutton1' usualmente escribimos: window1.editfield1.text = "Hola" Pero como ambos elementos, editfield1 y pushbutton1 pertenecen a la MISMA ventana, podemos escribir igualmente: editfield1.text = "Hola" es decir, una ventana es un entorno cerrado, con sus elementos, propiedades, mtodos, etc., y si no se hace referencia al nombre de la ventana se entiende que la llamada es a un elemento de ella. Otra cuestin diferente es que se llame a un elemento de una ventana diferente; en este caso s sera necesario incluir el nombre completo del elemento: window2.editfield1.text ....etc.

Otra cuestin que ahorra un poco de trabajo a la hora de escribir cdigo: al dimensionar variables de usuario, si hay variables del mismo tipo, podemos agruparlas en una misma lnea de cdigo: Dim a, valor, numero, suma, total, calor as integer Dim texto, s, letra as string Esta forma de dimensionar ahorra espacio, pues en una sola lnea estn dimensionadas todas las variables de un mismo tipo. La sintaxis es como se muestra: cada variable se separa de la anterior con una coma. Siempre hay que tener cuidado con la sintaxis, pues escribir algo mal genera un cdigo de error del IDE del RB bajo la forma de un mensaje al lado de la lnea de cdigo errnea. Puede ser que se utilice una variable string para un dato numrico, puede ser que no se haya dimensionado una variable, o puede ser un simple error de sintaxis. Por ejemplo: Dim a, b, c, as integer generar un error, pues la coma despus de la variable c no debiera estar, ya que la coma es un separador de elementos en la definicin de DIM. OJO: Un problema para espaoles, es que la coma NO ES el separador decimal, el separador decimal es el punto. Incluso si en preferencias del sistema se estipula que el punto es el separador decimal, a nivel de los diferentes lenguajes de programacin, incluido el Basic, el punto es el separador decimal. Ojo con posibles errores.

32////137

A veces el mensaje de error no se entiende, uno no sabe a que se refiere, pero la experiencia de aos es que aunque el programador no vea el error y el enfado lleve a proferir todo tipo de insultos contras el maldito programa en basic, y se sospecha de que estar corrompido, endemoniado, o posedo, la realidad es que el error suele estar ante nuestras narices y no lo vemos. Como ancdota, recuerdo un programa que hice para mi uso personal, de estadstica, que despus de una semana de trabajo cometa algn tipo de error que yo era incapaz de descubrir. Pas horas y horas, y das, maldiciendo, repasando paso a paso el cdigo.... sin suerte. Desesperado, pens en un fallo del basic... hasta que le di un listado a un compaero, suplicandole que me buscase el error. A pesar de no haberlo escrito l, mi amigo lo descubri en unos 5 minutos: haba una variable numrica llamada O (letra o mayscula) y en un punto del cdigo, al querer poner a cero una variable, escrib: dato = O. Repasando el cdigo, yo siempre que pasaba por este listado lo que lea era siempre lo mismo: dato = 0 (cero). Claro, yo nunca pona la variable a cero, pues la haca igual al valor de otra variable O. Moraleja: el programa nunca se equivoca, el programador es el que falla. Lo cierto, es que jams volv a usar la letra O como variable ! Las variables que hemos visto hasta ahora son elementos nicos, en el sentido de que 'valor' es una sola variable y no existe otra, en la misma ventana, con ese nombre. Pero hay una definicin diferente que permite crear variables que son vectores, o conjuntos de elementos que llevan el mismo nombre y solo se diferencian en un nmero interno de orden. Un ejemplo vale a veces ms que mil palabras: Dim numero(5) as integer En esta definicin, creamos una variable-vector (array en ingls) llamada 'numero' que tiene 5 elementos, a cada uno de los cuales se le llama por su nmero. Es decir, tenemos 5 variables dimensionadas de una sola vez. Entonces podemos escribir: numero(3) = 23 numero(5) = 13 numero(1) = numero(3) + numero(4) - numero(5) Como puede verse, cada vez que se invoca un elemento de este array o vector, es preciso hacer referencia a su nmero de orden. No podemos escribir numero = 667 porque no existe una variable nica con ese nombre, y el RB nos mostrara un mensaje de error. Tambin podemos dimensionar variables tipo string: Dim letra(1200) as string estamos creando un vector de 1200 elementos de tipo string.

33////137

Estas variables array son muy, pero que muy tiles, y permiten realizar acciones que de otra forma seran prcticamente imposibles. Por ejemplo, si preciso de 1200 variables para almacenar cada palabra de un texto que he recibido de una base de datos, no voy a dimensionar 1200 variables cada una con un nombre distinto. Las dimensiono todas a la vez, con un mismo nombre y un nmero de orden. Cuando se hace referencia a una variable de un array, no es preciso escribir el nmero de orden explcitamente, ya que este nmero puede ser una variable numrica de tipo integer. Por ejemplo: dim a as integer dim letra(1200) as string Como 'a' es una variable integer, es un nmero entero, nos puede servir como referencia de orden de un elemento de 'letra' Si queremos hacer una referencia al elemento 527 de letra podemos escribir letra(527) = "Pepe" pero tambin podemos hacer lo siguiente: a = 527 letra(a) = "Pepe" y el resultado es idntico. Ojo: no podemos usar una variable DOUBLE para llamar un nmero de orden de un array, ya que las referencias de orden son enteros. NOTA: Los array tambin tienen el elemento cero: letra(0), numero(0), etc., por lo que si dimensionamos letra(1200) realmente estamos creando 1201 elementos. Siempre hay un elemento cero que se puede usar sin problemas. Vamos ahora a aprender uno de los comandos ms tpicos del basic. Es un comando que implica realizar un ciclo ms de una vez, esto es, un nmero determinado de veces. Es el ciclo For...Next. La sintaxis aparece en la ayuda del RB. For a = 1 to 5 Next Lo que dice es : desde el valor inicial de la variable 'a' que lo defino como 1, hasta el valor final de 'a' que lo defino como 5, realiza las lneas de cdigo que van hasta el vocablo Next (siguiente). y luego vuelve al inicio del ciclo, a la posicin del vocablo For 34////137

Inicialmente, la variable 'a' vale uno (a = 1) pero cada vez que se llega a Next, el valor de 'a' se incrementa una unidad. Cuando 'a' valga 5 al llegar a Next ya no se vuelve a For, y se realiza la lnea siguiente al ciclo. Es un ciclo que se realizar 5 veces, tomando la variable 'a' los valores 1, 2, 3, 4 y 5. Si escribimos For a = 4 to 14 el ciclo se realizar 11 veces, con los valores de la variable desde 4 hasta 14 inclusive. IMPORTANTE : La variable del ciclo For....Next debe ser integer, o habr error. Vamos a hacer un programa que utilice este ciclo For...Next as como variables vector o array. Queremos, a partir de un conjunto de nmeros, obtener sus valores al cuadrado; y luego, un sistema para visualizar el cuadrado del nmero que introduzcamos. Los nmeros pueden ser desde el 1 hasta el 9. Para hacer este proyecto usaremos una sola ventana. En ella necesitaremos los siguientes elementos: un botn de fin de programa, un botn para crear los nmeros al cuadrado, un editfield para introducir un nmero, un statictext para visualizar el cuadrado de este nmero, y un botn para confirmar la entrada. Lo primero ser crear los nmeros al cuadrado y almacenarlos. Para almacenarlos ser necesario usar una variable tipo general. Y adems ser tipo integer ya que son nmeros enteros, y ser un array o vector. Llamaremos a la variable 'cuadrados' y al dimensionarla le adjudicaremos 9 elementos. Necesitaremos un botn para iniciar el programa y crear y almacenar los nmeros al cuadrado. Este botn le podemos poner por caption 'Calcular'. Una vez creados los cuadrados, no necesitamos ms el botn 'Calcular' de forma que lo haremos invisible. Para ahora introducir un nmero y ver su cuadrado, necesitamos 1. un editfield, en el cual teclear el nmero que queramos entre 1 y 9, 2. un botn que tome esta informacin del editfield y muestre el cuadrado del mismo, botn al que pondremos por caption 'Ver cuadrado' 3. un statictext en donde veamos el cuadrado del nmero introducido. Estos 3 elementos no necesitan estar visibles al inicio, para no confundir al usuario. Pero deben hacerse visibles inmediatamente que creemos los valores al cuadrado. Por ultimo, un botn, siempre visible, con caption 'Fin' que nos permita finalizar el programa.

35////137

Hasta aqu, estamos creando un proyecto, con un lpiz y un papel, pensando lo que se precisa, cmo ser el flujo del programa, qu aspectos son necesarios para que el usuario lo entienda, etc. A partir de entonces, si las ideas estn claras, empezamos a progrmar el cdigo necesario. Empecemos lanzando el RB. En la ventana inicial 'window1' aadimos un pushbutton, le ponemos por nombre 'Boton1' y le ponemos por caption 'Calcular' Aadimos otro y le llamamos 'Boton2 y con caption 'Ver cuadrado' cuya propiedad 'visible' estar deseleccionada (off, false). Y un tercer pushbutton que llamaremos 'BotonFin' con caption 'Fin'. Aadimos un editfield y un statictext, y en ambos la propiedad 'visible' estar off. Empezamos con el cdigo. Hacemos dobleclick sobre el botn 'Fin' y en la SUB action que aparece en el editor escribimos quit Sin cerrar el editor, vamos al men edit y al tem New Property, y en el dialogo que se nos presenta escribimos: cuadrados(9) as integer y confirmamos con OK. Ya tenemos la variable cuadrados dimensionada como array integer de nueve elementos (diez si contamos el elemento cero). Vamos a la Sub action del botn 'Calcular' y escribimos: SUB action () Dim a as integer For a = 1 to 9 cuadrados(a) = a * a Next boton1.visible = false boton2.visible=true editfield1.visible=true statictext1.visible=true END SUB Tenemos un ciclo For...Next. Vamos a interpretar qu es lo que hace. Se utiliza una variable integer 'a' para contar los ciclos. El total de ciclos es 9. En el primer ciclo, el valor de 'a' es 1. Entonces, cuando pasamos por la 3 lnea , al elemento 1 de la variable cuadrados le asignamos el resultado de la expresin a la derecha, esto es, a * a ( el valor de 'a' al cuadrado). La linea 4 es Next, que aumenta el valor de la variable 'a' en una unidad y vuelve el flujo de programa a For comenzando el segundo ciclo.

36////137

Ahora 'a' vale 2 por lo que el elemento 2 de la variable cuadrados, cuadrados(2), se le asigna el valor de a * a que es 2 x 2 = 4 . Etc. Cuando 'a' toma el valor 9 se obtiene en cuadrados(9) el valor 81. Y al llegar a Next, como 'a' tiene el limite 9 indicado en For, se finalizan los ciclos y se pasa a la linea siguiente a Next. Las lneas que siguen, hacen invisible el propio 'Boton1' y hacen visibles los 3 elementos necesarios para la interaccin del usuario con el programa. Ahora necesitamos el cdigo en el botn 'Ver cuadrado'. Hacemos dobleclick sobre el y en la Sub action escribimos Sub action() Dim n as integer n= val (editfield1.text) rem asigna el valor introducido por usuario a la rem variable n statictext1.text = str(cuadrado(n)) rem pone el valor del elemento n del array rem en el statictext End sub Ya tenemos el proyecto finalizado. Hagamos Run y veamos como funciona.

Hay un pequeo problema y es que cuando el usuario introduce un nmero para hallar su cuadrado, el mximo que puede introducir es 9, ya que hemos dimensionado la variable 'cuadrados' hasta 9 elementos. Esto quiere decir, que si un usuario introduce el nmero 23 y pulsa 'Ver cuadrado', el cdigo busca el elemento 'cuadrado(23)' que no existe, ni est dimensionado, lo que origina un parn del programa y la aparicin de un cdigo de error. Una forma de evitar este inconveniente es limitar la entrada de caracteres en el editfield, haciendo que solo admita un carcter. De esta forma evitamos introducir un nmero mayor de 9, o un nmero negativo. Para ello, seleccionemos el editfield y en la ventana de propiedades, bajo el apartado 'behavior' aparece la propiedad 'LimitText' que por defecto es cero. Este valor cero indica que no hay lmite a la longitud del texto que puede teclearse en el editfield. Si ponemos el valor 1 estamos estableciendo un lmite de 1 carcter: slo puede introducirse un nuevo carcter borrando el anterior. Esta propiedad puede tambin cambiarse mediante cdigo, como cualquier otra propiedad, simplemente escribiendo, en la SUB open del editfield, lo siguiente: editfield1.limitText = 1 Probemos que ahora nuestro programa funciona para los numeros 1 a 9 y no admite nmeros mayores que este ltimo. Hay otras alternativas para evitar el error que comentbamos sin necesidad de limitar la longitud de la entrada de texto. Vamos a ver una forma distinta de abordar el mismo problema que nos permitir aprender comandos nuevos del Basic. Para empezar, desharemos la modificacin anterior de la propiedad 'LimitText' , volviendo a 37////137

poner el valor cero que es el valor por defecto de esta propiedad.

38////137

Hay un comando basic que es RETURN y que significa abandonar inmediatamente una SUB y volver al punto de inicio, al punto desde donde fue llamada la SUB. Cuando iniciamos un proyecto, el punto de inicio es la propia ventana inicial. Eso quiere decir, que si en la Sub asociada a un elemento se encuentra un RETURN, se vuelve a la ventana inicial. Otro comando basic es LEN que nos informa de cual es la longitud de un string, y nos lo dice dando valor a una variable integer. La sintaxis es : variable [tipo integer] = len(string) Por ejemplo, tenemos una variable string que contiene el texto "Hola que tal" y una variable tipo integer llamada 'longitud'. La lnea de cdigo longitud = len (texto) hace que longitud valga 12 (sumando letras y espacios). Y por ltimo, uno de los comandos ms bsicos del basic es un condicional, basado en que slo si se cumple una determinada condicin, se realizan las acciones de unas lneas de cdigo: IF condicin = true THEN ---------------------END que se lee: SI una condicin de tipo booleano es cierta, ENTONCES Por ejemplo: Dos variables 'p' y 'q' son integer con valores p=5 y q= 8 Si escribimos: IF p = q then beep End Como la condicin p = q NO ES CIERTA, las lneas de cdigo situadas entre THEN y END no se realizan. Pero si escribimos IF p < q then 39////137

beep End

40////137

ahora la condicin p < q es cierta y la linea con el comando 'beep' es interpretada. Las condiciones ms simples son; A=B A>B A=B A = B quiere decir que la condicin es true si A es mayor o igual a B. Al lado derecho de la condicin booleana puede escribirse una expresin mas o menos compleja. Por ejemplo vale decir: If A > B/2 + C *7. La expresin se evala y el resultado se compara con A para decidir si es true o false. Tambin la sintaxis admite variantes. La ms notable es la palabra ELSE que viene a decir que si NO se cumple la condicin lo que se realiza es lo que sigue al termino ELSE hasta alcanzar END. If a < b then 12 ELSE 345 END En este ejemplo, si la condicin es true el flujo de programa pasa por 1, 2 y luego salta a la lnea siguiente al final END. Pero si no se cumple, el flujo salta a 3, 4 y 5 y luego a la linea tras END El trmino ELSE podra traducirse como "en caso contrario"Volvamos a nuestro programa. Queremos ahora que si el usuario introduce un nmero mayor de 9 no ocurra un error. Como cualquier nmero mayor de 9 tendr dos cifras (dos caracteres) podemos poner como condicin que si la longitud del nmero tecleado por el usuario es de longitud mayor que 1 no se haga nada, pero si el nmero es de longitud uno, se calcule su cuadrado. Vamos a ello: En la Sub action del botn 'Ver cuadrado' debajo de la lnea dim n As integer41////137escribimos lo siguiente: dim s as string s=editfield1.text IF len(s) < 2 then el resto se deja como estaba, y al final de la Sub, como ultima linea escribimos End Ahora tenemos una condicin: cuando el usuario pulsa el botn 'Ver cuadrado' lo primero que hace nuestro cdigo es tomar el texto escrito por el usuario en el editfield y asignarlo a la variable tipo string 's'. Luego se pone una condicin en la cual se evala la longitud (Len) de este texto y slo en el caso de que sea menor de 2 (por lo tanto de una sola cifra) se sigue el cdigo que permite obtener el cuadrado del nmero. Si el texto es de 2 o ms cifras el flujo del RB se salta esas lneas hasta despus de End, y como detrs de este End slo queda End Sub, se vuelve entonces a la ventana inicial. Hagamos los cambios en nuestro proyecto, grabemos, y hagamoslo correr con Run. Comprobemos que si en editfield escribimos 3 funciona dndonos el valor 9. Pero si introducimos +3 ya no funciona pues el smbolo + junto con el 3 tienen una longitud de texto de 2 caracteres.Y ahora probemos la otra alternativa, el comando RETURN. Dijimos que este comando hace que una vez encontrado, el flujo vuelva (return=retorno) al punto del cdigo desde donde se envi el flujo a la SUB. En nuestro caso, llegamos a la sub action del botn cuando lo pulsamos desde la ventana inicial, luego si encontramos return en esta sub, volveremos a la ventana inicial. Bueno, pues cambiamos el cdigo que modificamos antes de una forma simple: cambiamos la lnea: IF len(s) < 2 then por esta otra: IF len(s) > 1 then return end y eliminemos el trmino 'end' del final de la sub. Comprobemos que tambin este cambio funciona bien.En esta sesin hemos aprendido dos elementos del basic muy importantes: El ciclo ' FOR .... NEXT ' que nos permite realizar tareas repetitivas de forma simple, y nos permite manejar variables de tipo array con cientos de elementos.42////137La condicin ' IF ................. THEN ......... ELSE ........ END' que permite dirigir el flujo de actividad de nuestro programa segn nos interese, y segn se cumplan determinadas situaciones de todo tipo. Y tambin hemos usado dos nuevos comandos de basic: LEN RETURN Recordemos que un ciclo FOR ....... siempre lleva un NEXT, o se generar un error. Tambin un ciclo condicional IF ............... lleva asociado un END.43////137En esta sesin vamos a seguir con el programa anterior para conocer y usar nuevas opciones y funcionalidades del basic que facilitan la accin del usuario y del programador. En primer lugar, el programa que hicimos en la sesin anterior para obtener los cuadrados de los nmeros 1 a 9 puede simplificarse. Nosotros usamos un array llamado 'cuadrados' de 9 elementos, simplemente para conocer un poco del funcionamiento de los array. Pero ahora vamos a usar rutinas ms simples y directas y que no nos limiten a los nmeros del 1 al 9. Comencemos por lanzar el RB y cargar el programa de la sesin anterior tal como lo dejamos. Eliminemos la variable cuadrados, simplemente abriendo el editor, yendo a properties, haciendo doble click sobre el nombre de la variable y seleccionando 'delete' del men edit. Eliminemos el botn 'calcular', lo cual elimina el elemento y todas las subrutinas asociadas con l. Para ello lo seleccionamos y lo borramos con la tecla borrar. Seleccionamos los 4 elementos de la ventana y hacemos que su propiedad 'visible' est seleccionada (true). Abrimos la sub action del botn 'Ver cuadrado'. Borramos todo lo que estaba escrito y luego escribimos: SUB action() statictext1.text = str(val(editfield1.text)*val(editField1.text)) END Qu estamos diciendo con este extrao y largo cdigo? Estamos asignando mediante el signo = un texto al elemento StaticText1.text Este texto es un string, ya que usamos la palabra del basic STR que convierte nmeros en string. Lo que convertimos a string est entre parntesis, y corresponde a una multiplicacin de dos nmeros iguales; por lo tanto es equivalente a elevarlos al cuadrado. Cada nmero proviene del editfield1.text, es decir, el texto introducido por el usuario. Este texto se convierte a un nmero mediante la funcin VAL. En resumen, estamos hallando el cuadrado del nmero del editfield, convirtiendo este resultado en un string mediante la funcin STR y finalmente asignando este string al statictext1 para que sea visible en la ventana. Como podemos ver, no necesitamos ni variables ni otra lnea de cdigo. Y adems, podemos introducir cualquier nmero de dos o ms cifras sin problema.La lista de edicin (ListBox) o simplemente Lista, es un nuevo elemento que podemos aadir a nuestra ventana. Permite almacenar informacin, igual que una 44////137variable array, pero podemos adems visualizarla e incluso editarla. Es por lo tanto de una grandsima utilidad. La lista (ListBox) se organiza como una tabla de filas y columnas. El nmero mnimo de columnas es 1, evidentemente, pero puede aumentarse segn se precise. El nmero de filas inicial es cero, y debemos ir aadiendo filas al ir creando la lista. En base a las filas y columnas podemos decir que la listbox est formada por celdas y que cada celda (cell) est determinada por una fila (row) y una columna (column). Por ejemplo la cell 6,3 sera la celda de la fila 6 columna 3. NOTA: Siempre el orden en que se llama una cell es fila, columna. IMPORTANTE: toda listbox tiene como primera la fila (row) nmero cero, y como primera columna, la columna 0. Entonces, la primera cell es la 0,0. Vamos a utilizar una ListBox para ver nuestros nmeros y sus cuadrados. E incluso vamos a calcular el cubo del nmero introducido. Lo primero es eliminar el elemento StaticText de la ventana. Luego, colocamos el editfield y el botn 'Ver cuadrado' en la parte superior de la ventana. Cambiamos el caption del botn por este otro: 'Ver cuadrado y cubo'. Ponemos el botn 'Fin' en la parte inferior derecha de la ventana. Aadimos ahora un elemento listbox, y lo alargamos todo lo que permita nuestra ventana, es decir, que ocupe desde el tope hasta la parte inferior. De 'width' ponemos al menos 275. Una propiedad del listbox que podemos examinar en la ventana 'properties' es 'columncount' que es el nmero de columnas. Ponemos tres. En la propiedad 'initialValue' tocamos en donde pone 'edit' y se nos abre un dilogo. Escribimos tres palabras: "Numero Cuadrado Cubo" y las separamos una de otra por un tabulador (no escribir las comillas) Vemos que el listbox muestra 3 columnas cada una encabezada por una de las palabras introducidas. La propiedad 'InitialValue' es la que nos permite dar un ttulo a las columnas. Ahora vamos a la SUB action del botn y escribimos: SUB action () dim n as integer n=val(editfield1.text) listbox1.addRow "" listbox1.cell(0,0)=str(n) listbox1.cell(0,1)=str(n*n) listbox1.cell(0,2)=str(n*n*n) End sub La primera linea es simplemente dimensionar una variable integer. La segunda es un mtodo propio de la listbox que aade una fila a las existentes. Inicialmente45////137una listbox no tiene filas. Es preciso aadir fila tras fila antes de colocar informacin en un listbox. Si queremos aadir fila e informacin de forma simultnea, escribiremos un texto detrs de 'addrow' (por ejemplo, listBox.addrow = "Luisa") pero si slo queremos aadir la fila, escribimos un texto vaco "". NOTA: si se intenta leer el texto de una celda o llenarla sin antes haberla creado mediante el mtodo 'addrow', se nos genera un error que puede colapsar el programa. Una vez aadida la fila, que ser la nmero cero (0), podemos rellenar las tres cell de esta fila. Como las 3 columnas son la 0, la 1 y la 2, las 3 cell llevan como elementos fila, columna, los valores (0,0), (0,1) y (0,2). Bueno, pues nuestro cdigo toma el valor 'n' introducido por el usuario en el editfield, pone este valor en la cell de la columna 0 (como string), y luego eleva este nmero 'n' al cuadrado y al cubo , poniendo los resultados, como string (usamos str), en las dos cell de las columnas 1 y 2. Si hacemos run, vemos que aparecen el nmero, su cuadrado y su cubo en cada columna. Pero hay un problema, y es que cada valor que metemos borra el resultado anterior. Cual es la razn? Repase el cdigo y piense un momento sobre ello, a ver si encuentra la solucin ................Tiempo !! Bueno, pues la razn es que el cdigo siempre se dirige a las mismas celdillas, las de la fila cero, por lo que tendremos que usar una variable de tipo general (para que mantenga su valor) que indique a que fila deben dirigirse los datos. Vamos a crear una variable general que llamaremos 'filas' de tipo integer. Y ahora modifiquemos el cdigo de la sub action del botn. SUB action() dim n as integer n=val(editfield1.text) listbox1.addRow "" listbox1.cell(filas,0)=str(n) listbox1.cell(filas,1)=str(n*n) listbox1.cell(filas,2)=str(n*n*n) filas = filas + 1 rem aumenta el valor en una unidad cada ciclo End sub Ahora, la variable filas retiene el valor que se le da, ya que es una variable general. Su primer valor es cero, por lo que rellenamos la cell inicial, pero luego, en la ltima lnea lo aumentamos en una unidad, por lo que en la segunda llamada a la sub el valor de filas es 1; y ser 2 en la siguiente, etc.46////137Si hacemos run, cada nmero aparece en la fila correspondiente. Y podemos notar que si se repite la entrada un nmero alto de veces, automticamente aparece una barra de scroll en la listbox. Grabemos nuestro proyecto para futuras cambios. Aunque hay ms cuestiones interesantes en relacin con las ListBox, vamos a finalizar aqu est sesin, pues necesitamos introducir unas cuestiones muy bsicas pero absolutamente necesarias para entender la forma de trabajar del Real Basic: Mtodos, SubRutinas y Funciones.47////137SUBRUTINAS, MTODOS y FUNCIONES A lo largo de las sesiones previas hemos visto que existen algunas subrutinas asociadas a una ventana o a sus elementos. Si hacemos dobleclick sobre nuestra ventana, se abre el editor y podemos ver una serie de 'events' (eventos) que estn asociados a la ventana. Los eventos reflejan las acciones que el usuario puede realizar con el ratn y el teclado. Unos eventos llevan asociadas SUBRUTINAS, como 'activate' o como 'mouseEnter', pero otros eventos llevan asociadas FUNCTIONS como es 'keydown', 'mousedown' o 'cancelclose'. Subrutinas y funciones pueden considerarse Mtodos, conjunto de instrucciones de cdigo que realizan actividades programadas. Las Subrutinas empiezan con SUB y acaban con END SUB, mientras que las funciones empiezan con FUNCTION y acaban en END FUNCTION Cuando se llama a un mtodo, el flujo del programa se transfiere a ste, se realizan las lneas de cdigo del mtodo, y luego se vuelve (return) al punto desde dnde se hizo la llamada. Un mtodo puede a su vez llamar a otro mtodo. En este caso, se llega al segundo mtodo, se realiza, y se vuelve al mtodo que lo llam, justo a la lnea de cdigo inmediatamente posterior a la llamada. MUY IMPORTANTE: Subrutinas y funciones pueden recibir informacin procedente de la sub o function que los invoca, que los llama. Esta informacin son simplemente variables de tipo numrico, o texto, etc. Por ejemplo, si un mtodo precisa calcular el cuadrado de un nmero, en lugar de hacerlo por s mismo puede llamar a otro mtodo que lo haga, y este segundo mtodo, slo necesita que se le enve, como informacin, la variable en cuestin. Esta informacin la recibe el mtodo en la (o las) variable que aparece entre parntesis inmediatamente despus del nombre de la SUB (o de la function). Si examinamos los eventos de una ventana, vemos que 'close' es una SUB y que aparece un parntesis inmediatamente detrs del nombre 'close' pero est vaco. Evidentemente, si cerramos una ventana usando el ratn, la SUB asociada no precisa variables. Pero si miramos la sub 'dropObject' que es el evento asociado a que el usuario arrastre y deje caer un objeto dentro de la ventana, veremos que entre parntesis aparece la variable 'obj' (objeto) como tipo 'dragitem'. En este caso tiene sentido que la informacin (el objeto arrastrado) llegue a la SUB para poder "trabajar" con este objeto. La diferencia ms notable entre un Mtodo-SubRutina y un Mtodo-Funcin es que las Function SIEMPRE devuelven un valor al mtodo que las llama, mientras que una Subrutina puede no devolver nada, o devolver uno o ms valores pero de una forma diferente. Vamos a empezar a emplear Mtodos, para lo cual, en esta sesin 7, examinaremos cmo es una Function. Vamos a crear un proyecto muy simpln. Por ejemplo, queremos calcular el cuadrado de un nmero cualquiera. Lancemos el RB y en la ventana inicial 'window1' aadamos un EditField, un StaticText, y dos botones. Un botn ser 48////137'FIN' con el comando 'quit' en su action, y el otro botn llevar como caption 'Elevar al cuadrado'. En la SUB action de este botn ponemos el cdigo necesario para tomar el valor introducido por el usuario en el EDITFIELD, elevarlo al cuadrado y pasarlo, como string, al STATICTEXT, tal como sigue: SUB action() dim n as integer n = VAL(EditField1.text) REM obtiene el valor numrico del texto n= n * n REM la variable 'n' almacena ahora el cuadrado StaticText1.text = str (n) REM ponemos el string de 'n' en el StaticText End Sub Podemos probar que este proyecto funciona. Pero podemos hacer que el cuadrado del nmero lo realice un Mtodo-Function independiente. Vamos a crear esta Function, a la que llamaremos 'Obtener_Cuadrado' y que simplemente calcular el cuadrado de un nmero que le enviaremos y nos devolver este nuevo valor. En el men edit del RealBasic seleccionamos el tem New Method, el cual es el mismo para crear un mtodo o una funcin. Se nos abre un cuadro de dilogo. En la primera casilla escribimos el nombre elegido por nosotros, en este caso 'Obtener_cuadrado'. En la segunda celda del dilogo, que se titula 'parameters', es donde escribimos las variables que "MANDAN" informacin al mtodo, y las que queremos que "DEVUELVAN" informacin. Como queremos calcular el cuadrado de un nmero entero slo necesitamos una variable, que ser integer. Podemos llamarla 'dato' escribiendo en esta celda: dato as integer Por ltimo, la tercera celda, elegimos simplemente el TIPO de variable de retorno. Como el cuadrado de un nmero entero es otro entero, seleccionamos o escribimos 'integer'. Pulsamos OK y aparece una function de esta forma: Function Obtener_cuadrado(dato as integer) as integer End Function Este mtodo es una function, ya que hemos rellenado la tercera celdilla del dialogo donde deca 'Return type' (si la dejamos en blanco, crearamos una Sub). El ttulo de esta Function est claro. Luego, entre parntesis, aparece la variable que NECESITA para trabajar, que se llamar 'dato' y es de tipo integer. OJO: Ya no hace falta dimensionarla dentro de la function, ya est dimensionada al crear la function. Por ltimo, despus del parntesis aparece 'as integer', que es la variable que se retorna o devuelve.49////137Ahora nos falta rellenar las lneas de cdigo de esta nueva Function. Escribimos lo siguiente: Function Obtener_cuadrado(dato as integer) as integer dim alcuadrado as integer REM usaremos una variable propia de la Function, y REM por eso la dimensionamos en la propia Function alcuadrado = dato * dato REM ya tenemos el cuadrado en esta variable Return alcuadrado End Function El valor de la variable 'alcuadrado' es el valor que se devuelve mediante 'return' Bueno, pues vamos a ver cmo se invoca, como se llama a esta function. Vayamos al botn que lleva por caption 'Elevar al cuadrado' y en su SUB Action escribimos: SUB Action () dim n, cuadrado as INTEGER n = val (EditField1.text) REM toma el string introducido en el editField y REM lo transforma en un valor numrico integer como REM es el caso de la variable n cuadrado = Obtener_cuadrado(n) StaticText1.text = str(cuadrado) End Sub Bueno: pues la lnea cuadrado = Obtener_cuadrado(n) es una llamada a una function existente, a la cual se le enva el VALOR que tiene la variable que se indica entre parntesis, es decir, 'n'. Este valor es recibido por la Function en la variable 'dato', es decir, si 'n' vale 8, la variable 'dato' valdr tambin 8. Entonces la Function ejecuta sus lneas de cdigo, es decir, obtiene el cuadrado de 'dato'; y por ltimo mediante el comando 'Return' devuelve el valor de su variable 'alcuadrado' que es recibido de vuelta por la variable 'cuadrado'. Llamemos 'variable origen' a la variable que se usa para enviar un valor a la Function. Y llamemos 'variable destino' a la que recibe ese valor en la Function. Toda esta explicacin parece liosa pero no lo es tanto. Vamos a poner un esquema grfico que nos ayude a entenderlo:50////137SUB de llamada Sub Action ( ) dim n, cuadrado as integer n= val(editfield1.text) cuadrado = Obtener_cuadrado (n) StaticText.text = str(cuadrado) End SubFunction que recibe la llamada Function Obtener_cuadrado (dato as Dim alcuadrado as integer alcuadrado = dato * dato , return alcuadrado END function Cuando se hace la 'llamada', el valor de 'n' pasa a 'dato', el cual se utiliza para obtener 'alcuadrado'. El valor de 'alcuadrado' es el que se 'devuelve' a la variable 'cuadrado' mediante Return. Bueno, pues slo falta probar nuestro proyecto, y comprobar que la function cumple bien su misin. Damos por hecho que todo funciona como se espera, y en tal caso seguimos adelante en la sesin.La utilidad de una Function es que se puede reutilizar con cualquier programa que precise obtener el cuadrado de un nmero. No hace falta escribir el cdigo de nuevo. La Function trabaja autnomamente, slo precisa un valor inicial que se le enva desde la Sub de llamada. Adems no tenemos que preocuparnos de los nombres de las variables origen y destino, sabemos que se llamen como se llamen, la function va a devolver un dato correcto.IMPORTANTE: la function recibe un 'valor', no recibe una variable. Es decir, el valor que tiene la variable origen cuando se hace la llamada es lo que realmente se enva. Eso quiere decir que la Function no puede cambiar el valor de la variable origen, puede usarlo para los clculos, pero no modificarlo. Realmente lo que se recibe es una constante, un valor fijo. Y la variable destino que lo recibe en la Function, no es realmente una variable, es como un alias del valor recibido, ya que no puede modificarse.51////137En nuestro ejemplo, la variable 'dato' de la Function no es una variable verdadera, es un alias del valor que tiene la variable origen, en nuestro ejemplo, el valor de 'n' en el momento de la llamada. IMPORTANTE: Si en la FUNCTION se omite el comando RETURN, lo que se devuelve es cero, para variables numricas, y vaco "" para las variables string. IMPORTANTE: Una vez se alcanza un comando return, el flujo del programa abandona la FUNCTION y vuelve al punto de llamada, aunque no se hayan realizado todas las lneas de cdigo de la Function. El comando return es por lo tanto, una salida incondicional. Y por cierto, en una function puede hacer mas de un comando return. Tal sera el caso de una situacin condicional, de un comando If... then....else....end. Si una condicin es correcta se puede devolver un valor mediante return, pero si la condicin no se cumple se puede devolver, mediante otro return, un valor diferente.En el ejemplo que hemos puesto antes, slo se enva un dato correspondiente al valor de una variable. Pero pueden enviarse todos los valores que la Function necesite para trabajar. Por ejemplo, cuando se hace una llamada de este tipo: resultado = calcular (valor_1, valor_2, divisor) a una Function que se llame 'calcular' y que est definida as: Function Calcular(a as integer, b as integer, c as integer) as double dim solucin as double solucin = (a + 2 * b) / c return solucin End function se envan 3 datos, los valores de las variables valor_1, valor_2 y divisor, valores que se reciben en EL MISMO ORDEN, por las variables a, b y c de la FUNCTION. Y es importante recordar este orden, porque si se cambia en origen, la function devolver un valor que no es el que pretendemos.A la vista de todo lo expuesto hasta aqu, debe estar claro que la Function no puede modificar la variable que enva su valor, pues de hecho la variable no se enva . Pero hay una forma de obviar este problema, de permitir que la function pueda modificar a la variable origen. Y es enviar realmente la variable en cuestin, en lugar de enviar su valor actual. Se dice que en este caso la variable se enva 'como referencia'. Y la modificacin sintctica consiste en escribir la palabra 'byref' antes de dimensional la variable de la Function. Por ejemplo, vamos a definir una function que calcule el valor en euros y en libras de una variable que es el precio en pesetas que cuesta un artculo, y a la vez nos devuelva la propiedad 'verdadero' si los euros superan un total de 500 y por tanto es un producto caro, y 'falso' si los euros no llegan a 500 y52////137por tanto es barato . Vamos a crear un mtodo seleccionando el tem New Method, y demos el nombre 'cambio' al mtodo. En la segunda celda, en parameters, escribimos: pesetas as double, byref euros as double, byref libras as double. En la tercera celda, en return type, elegimos boolean, que recordemos es un tipo de variable que devuelve verdadero o falso. Cerramos el dilogo. Nos aparece una Function que tiene 3 variables de tipo double. La primera, que es pesetas recibir un valor, pero la segunda y tercera, que llevan la palabra byref antes del nombre, recibirn una referencia a la variable origen, es decir, la propia variable, que entonces puede modificarse. Podemos probarlo con un ejemplo rpido. Abrimos el RB y aadimos tres statictext, un editfield, y un pushbutton en la ventana inicial. El editfield es para que el usuario introduzca el total en pesetas. Dos de los tres statictext son para representar el valor correspondiente en euros y en libras, y el tercer statictext es donde el programa escribir si el precio es caro o barato, segn supere o no el total de 500 euros. El pushbutton es para lanzar la actividad del programa. As pues, en la action de este botn escribimos: Sub action() dim pelas, euromonedas, librasinglesas as double dim esmuycaro as boolean pelas = val(editfield1.text) esmuycaro = cambio(pelas,euromonedas,librasinglesas) staticText2.text=str(euromonedas) staticText3.text=str(librasinglesas) if esmuycaro = true then statictext1.text = "Muy caro" else statictext1.text = "Es barato" end End Sub En la Function que hemos creado aadimos las lineas de cdigo siguientes: Function cambio(pesetas as double, byref euros as double, byref libras as double) as boolean euros = pesetas / 166.386 libras = pesetas / 251 if euros > 500 then return true else return false end END FUNCTION Notemos que en el cdigo se modifican las variables euros y libras que hacen referencia a las variables origen euromonedas y librasinglesas.53////137Vemos tambin que hay una condicin del tipo IF ....THEN....ELSE que permite devolver a la variable boolean de origen los valores true o false. Probemos si funciona correctamente. Hacemos correr el programa, y en el campo de edicin introducimos 30000 como valor en pesetas, y luego pulsamos el botn. En el statictext aparecer el resultado. Introduzcamos otro valor diferente, y pulsemos de nuevo el botn, etc. El programa no es muy amigable, pues la interface, lo que el usuario tiene delante, no nos dice ni tan siquiera cual editfield son euros y cual pesetas. Bueno, pues modifique Vd. mismo el programa