Sei sulla pagina 1di 16

Programacin Visual con

Gambas

Juan Matas Olmos 2010

CAPITULO I Programacin y Lenguajes de Programacin


Un programa informtico es un conjunto de instrucciones que una vez ejecutadas realizarn una o varias tareas en una computadora. Al conjunto general de programas se le denomina software, y as se refiere al equipamiento lgico o soporte lgico de una computadora digital. La programacin es un proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el cdigo fuente de un programa informtico. Un lenguajes de programacin es un conjunto de smbolos y reglas sintcticas y semnticas que definen su estructura y el significados de sus elementos y e presiones. !s la forma en que el "ombre se comunica con la mquina para realizar una determinada tarea. Al conjunto de lneas de te to que describen por completo el funcionamiento de un programa se conoce como cdigo fuente, y es este te to lo que escribe un programador en alg#n lenguaje de programacin para resolver cierto problema. As como e isten diversos lenguajes, tambi$n "ay distintas formas de programar una aplicacin, a lo que le llamamos paradigmas de programacin. Un paradigma representa un enfoque particular o filosofa para la construccin del soft%are. &ada paradigma tiene sus ventajas y desventajas, y dependiendo de la clase de problema a resolver, uno de ellos puede ser ms adecuado que otro. La programacin imperativa 'tambi$n conocida como programacin secuencial( es un paradigma de programacin que describe la programacin en t$rminos del estado del programa y sentencias que cambian dic"o estado. )e desarrolla de forma ordenada, cada lnea de cdigo se ejecuta una por una. Algunos lenguajes que se utilizan para este tipo de programacin son !nsamblador, *ortran, &obol y +asic, entre otros. ,tro paradigma de programacin com#n es la programacin orientada a eventos , en la que tanto la estructura como la ejecucin de los programas van determinados por los sucesos que ocurran en el sistema, definidos por el usuario o que ellos mismos provoquen. )e deben definir los eventos que manejarn el programa y las acciones que se realizarn al producirse cada unos de ellos, lo que se conoce como el administrador de evento. Al comenzar la ejecucin del programa se llevarn a cabo las inicializaciones y dems cdigo inicial y a continuacin el programa quedar a la espera de alguna accin del usuario o del sistema, es decir, de un evento. !l mejor ejemplo de este tipo de sistema es -isual +asic, el primo privativo de .ambas. Actualmente, el paradigma de programacin ms usado debido a m#ltiples ventajas respecto a los dems, es la programacin orienta a o jetos o /,, ',,/ seg#n sus siglas en ingl$s(. 0onde el elemento fundamental es el o jeto, ya que se basa en la idea natural de la e istencia de un mundo lleno de objetos, entre los cuales se definen sus interacciones para llevar a cabo una tarea. )u uso se populariz a principios de la d$cada de los a1os 2334. !ntre sus principales caractersticas estn la "erencia, abstraccin, polimorfismo y encapsulamiento5 y sus ventajas claves son la reusabilidad y e tensibilidad.

Programacin Orientada a O jetos


!ntre los conceptos fundamentales de la programacin orientada a objetos se destacan6

1. Clase6 definiciones de las propiedades y comportamiento de un tipo de objeto concreto. 2. 3. 4. 5. 6.

La instancia es la lectura de estas definiciones y la creacin de un objeto a partir de ellas. O jeto6 entidad provista de un conjunto de datos o atributos 'propiedades( y de comportamiento o funcionalidad 'm$todos(, los mismo que consecuentemente reaccionan a eventos. !s una instancia de una clase. Propiedad 'o atributo(6 contenedor de un tipo de dato asociado a un objeto 'o a una clase de objetos( y lo define. !l acceso a ellos se "ace a trav$s de los m$todos del mismo objeto. !"todo6 algoritmo asociado a un objeto 'o a una clase de objetos(, normalmente empleado para modificar las propiedades del mismo objeto. 0esde el punto de vista del comportamiento, es lo que el objeto puede "acer. #vento6 !s un suceso en el sistema 'tal como una interaccin del usuario con la mquina, o un mensaje enviado por un objeto(. !l sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. Instancia6 cada objeto es creado a partir de una clase, se dice que tal objeto es una instancia de esa clase. !ntonces, crear una instancia de una clase se conoce como instanciar la clase.

! iste un acuerdo acerca de qu$ caractersticas contempla la orientacin a objetos, las ms importantes son6

1. A straccin6

es la propiedad que permite representar las caractersticas esenciales de un objeto, sin preocuparse de las dems 'no esenciales(. 0efinir una abstraccin significa tomar la mejor descripcin de una entidad del mundo real y utilizarla en un programa. 2. #ncapsulamiento6 el objeto es considerado una cpsula, debe responder a peticiones a trav$s de sus m$todos sin la necesidad de e poner los medios utilizados para llegar a brindar sus resultados. !sta cualidad deriva en una de las ventajas de la /,,, la reusabilidad de objetos. 3. Polimorfismo6 es la capacidad del lenguaje para referirse a un m$todo com#n a varios objetos de diferentes clases 'por ejemplo, objetos de diferentes subclases derivadas de una clase base( llamndolo con el mismo nombre. 4. $erencia6 es la facilidad mediante la cual una clase "ereda cada unos de las propiedades y m$todos de otra clase, como si esas propiedades y m$todos "ubiesen sido definidos por la primer clase.

Introduccin a %am as
.ambas fue inicialmente creado por +eno7t 8inisini, es un ambiente libre de desarrollo en Linu basado en un int$rprete +asic con e tensiones de objetos, parecido a -isual +asic de 9indo%s 'pero es importante aclarar que :, es un clon(. .ambas es un entorno de desarrollo que se distribuye con la licencia .:U ./L '.eneral /ublic Licence(, conocida en espa1ol como Licencia /#blica .eneral de .:U, con lo cual el proyecto de 8inisini gan muc"a popularidad. Los programas de computadora suelen distribuirse con licencias propietarias o cerradas, $stas son intransferibles y no e clusivas, es decir, no eres propietario del programa, slo tienes derec"o a usarlo en un ordenador o tantos como permita e presamente la licencia y no puedes modificar el programa ni distribuirlo. La licencia ./L, desarrollada por la *)*, o *ree )oft%are *oundation '*undacin para el )oft%are Libre(, es todo lo contrario. 0efine la libertad de los usuarios sobre su producto adquirido y, por lo tanto, una vez obtenido puede ser usado, copiado, estudiado, cambiado y redistribuido con o sin modificaciones libremente. )in embargo, no es obligatorio que el soft%are libre sea siempre gratuito 'free%are(, ya que tambi$n puede ser distribuido comercialmente. !sto significa que un soft%are es libre si garantiza las siguientes libertades6 Li ertad &6 La libertad de usar el programa con cualquier propsito. Li ertad '6 La libertad de estudiar cmo funciona el programa y modificarlo, adaptndolo a las propias necesidades. Li ertad (6 La libertad de distribuir copias del programa, con lo cual puedes ayudar a tu prjimo. Li ertad )6 La libertad de mejorar el programa y "acer p#blicas las mejoras a los dems, de modo que toda la comunidad se beneficie. Las libertades 2 y ; implican que se tenga acceso al cdigo fuente para poder estudiarlo y modificarlo.

!l lenguaje est creado para soportar los gestores de ventanas ms comunes, como lo son .nome y <0!. !sto significa que una aplicacin puede ser compilada para ser ejecutada en los diferentes escritorios sin tener que modificar el cdigo fuente, ms bien "abra que elegir las libreras propias de ese escritorio y el programa se comportar como una aplicacin nativa de ese entorno. !s una caracterstica #nica entre los entonces de programacin para Linu . La versin estable actual 'al momento de la edicin de este te to( es la versin =.=2.4, liberada el => de ?ulio de =424, agregando soporte para Arc"Linu . 8ientras que para 8icrosoft 9indo%s o 8ac, la portabilidad est a#n en desarrollo.

Ar*uitectura de %am as
&ada programa escrito en +asic .ambas est compuesto por un conjunto de arc"ivos que forman un proyecto. &ada arc"ivo en el proyecto describe una clase. !stos arc"ivos de clases se compilan inicialmente y a continuacin son ejecutados por el int$rprete de .ambas. !sto se parece muc"o a ?ava, justamente, es el lenguaje sobre el que tambi$n se "a inspirado 8inisini. Los componentes necesarios para el desarrollo con .ambas son los siguientes6

Un compilador, un peque1o ejecutable capaz de transformar todo el cdigo fuente y


arc"ivos que formen parte del proyecto "ec"o en .ambas, en un programa ejecutable.

Un int"rprete, encargado de "acer que los programas "ec"os en .ambas sean


ejecutados por el sistema operativo.

Un entorno de desarrollo, que facilite la programacin y dise1o de las interfaces grficas


de los programas.

Componentes que agregan funcionalidades al lenguaje. )on libreras especficas que


permiten e tender las posibilidades del lenguaje, por ejemplo, para el uso de )0L, ,pen.L, ,0+&, cone iones de red, etc. @odos estos componentes son desarrollados por diferentes programadores que aportan al proyecto de .ambas. !n resumen, gracias al estilo de programacin, que toma lo mejor del lenguaje +asic y al cual se le agreg programacin orientada a objetos, permiti a .ambas ganar rpidamente muc"a popularidad, modernidad, estabilidad y portabilidad entre los desarrolladores de Linu .

Instalando %am as
&omo "abamos dic"o anteriormente, la #ltima versin estable disponible desde la pgina %eb oficial de .ambas es la versin =.=2.4, mientras que la versin de desarrollo es la ;.4. !n dic"o sitio se e plican con detalle la instalacin de ambas versiones a partir del cdigo fuente, la direccin es +ttp,--gam as.sourceforge.net-en-main.+tml . La solucin ms rpida y eficiente para el principiante de Linu es recurrir al .estor de /rogramas de tu distribucin Linu . /or ejemplo, para Linu 8int 3, en el repositorio podemos encontrar la versin =.23.4 de .ambas, aceptada como estable en los repositorios oficiales de dic"a distribucin.

0esde el .estor de /rogramas de Linu 8int 3, solo tenemos que seleccionar la aplicacin y presionar el botn de instalacin. 0e la misma forma se puede desinstalar muy fcilmente.

Luego tendremos el acceso a .ambas desde el !en/ Programacin %am as( 0%am as almost means 1asic2 como se puede ver en la siguiente figura.

#l #ntorno de Programacin de %am as

!sta imagen es la pantalla de presentacin del !ntorno de 0esarrollo Antegrado de .ambas. &omo se puede ver, lo primero es determinar sobre qu$ proyecto trabajaremos. &omo primera opcin podemos crear un nuevo proyecto 'o aplicacin(, podemos abrir un proyecto ya e istente desde una ubicacin del disco duro, podemos elegir uno de los proyectos usados recientemente, o podemos abrir uno de los tantos ejemplos incluidos en la ayuda de .ambas. )i prefieres comenzar ms tarde, tienes el botn para salir. Los ejemplos estn clasificados por categoras, en el transcurso de este te to revisaremos algunos de ellos. /ara acceder a ellos entonces elegimos la opcin #jemplos.

!n la instalacin de .ambas, se crea una carpeta en el Bome del usuario, en este caso es C"omeCmatiasC%am as(. !n esta carpeta se guardan todos los arc"ivos que utilices en tu proyecto, y cada proyecto tiene su propia carpeta, cuyo nombre es el nombre que le pongas al proyecto cuando creas uno. !n el caso que est$s copiando un proyecto desde otra computadora o descargando de Anternet, solo tienes que copiar esa carpeta en el directorio .ambas=. Luego eliges la opcin A rir proyecto... en la pantalla de bienvenida de .ambas y vers cada uno de tus proyectos, pero no como carpetas, ms bien se ven como un arc"ivo com#n que contiene tu proyecto. &on una imagen lo entenders mejor.

/ara ver un primer ejemplo, seleccionaremos la opcin 3uevo proyecto..., nos aparecer la siguiente ventana.

)implemente seleccionamos la primera opcin Aplicacin grfica para crear un formulario, y presionamos el botn 4iguiente. A continuacin, el asistente nos preguntar qu$ directorio usar para guardar el proyecto, por defecto estar seleccionada la carpeta mencionada .ambas=, pero podemos elegir otra, o bien crear una nueva.

!sta pantalla nos brinda el botn Agregar, con el cual podemos crear un acceso directo a la carpeta actualmente seleccionada que ser ubicado en la lista de la izquierda, debajo de Bome, !scritorio y )istema. 0ejamos seleccionada la carpeta .ambas= y presionamos 4iguiente.

!n la siguiente ventana de dilogo se requiere ingresar un nombre y un ttulo para el proyecto. Decuerda el nombre del proyecto no puede contener el carcter !)/A&A, y la carpeta del proyecto tendr este mismo nombre. !ntonces escribimos primerProyecto como nombre y !i primer proyecto como ttulo del proyecto. Luego presionamos O5 para finalizar el asiste, se nos confirmar que el proyecto "a sido creado.

A"ora se nos presentar la #ntorno Integrado de 6esarrollo de %am as 'A0!, Antegrated 0evelopment !nvironment(, el cual presenta varios componentes. A"ora, al igual que cada vez que abramos el A0! veremos una ventana que nos brindar un consejo, es una breve nota sobre un caso particular del uso del lenguaje, la cual cambiar cada vez. !n caso que lo desees, puedes usar los botones Previo y 4iguiente para ver los diferentes consejos, puedes evitar que se abra esta ventana quitando la marca en el opcin !ostrar consejos al inicio. Luego cerramos la nota con el botn Cerrar.

10

!n el resto del captulo usaremos en ejemplo para ir mostrando las capacidades que nos brinda este entorno de programacin, la idea es crear una ventana como la siguiente.

Componentes del I6# de %am as


Una vez que estemos en el A0!, "aremos doble clicE sobre *main en la ventana del lado izquierdo, con esto podremos ver nuestro formulario y componentes para dise1arlo como podemos ver a continuacin.

!l primer cuadro de la izquierda es el #7plorador de Proyecto, la principal ventana del entorno. :os muestra un rbol de directorios con todos los tipos de arc"ivos del proyecto 'arc"ivos de clases, formularios, mdulos y otros tipos de arc"ivos como imgenes, iconos o datos(. Anmediatamente arriba tenemos la 1arra de $erramientas con las principales funciones. &omo ser crear un proyecto nuevo, abrir otro o guardarlo5 crear ejecutable, correrlo, depurarlo5 ver u ocultar los elementos del A0!, etc. )obre la barra de "erramientas tenemos la 1arra de !en/, que no da acceso a todas las caractersticas del entorno a trav$s de sus men#s desplegables. -olviendo al e plorador de proyecto, podemos ver que la raz del rbol es el nombre del proyecto, en nuestro caso primerProyecto. 0e la raz salen cuatro ramas que describimos a continuacin6

11

Clases6 :os mostrar todo los arc"ivos de clases que tengamos en el proyecto.
+sicamente son modelos que pueden ser usados para crear objetos en tiempo de ejecucin, con cdigo para definir las propiedades, m$todos y controladores de eventos de cada uno de los objetos que se creen. !dulos6 :os mostrar los mdulos escritos para el proyecto. !stos mdulos son un conjunto de subrutinas o funciones que suelen utilizarse varias veces desde el programa principal. :o se pueden crear objetos con ellos, y por lo tanto, no tienen controladores de eventos. 8ormularios6 /resenta todos los formularios que "ayamos dise1ado. )on las ventanas con las que el usuario puede interactuar, las cuales las dise1amos insertndole objetos como cuadros de te to, botones, casillas de verificacin, listas, etc. 6atos6 /resenta los dems arc"ivos que usemos en el proyecto, como ser imgenes, iconos, te to, arc"ivos B@8L, m#sica, etc.

?usto debajo del e plorador de proyecto "ay un peque1o espacio vaco llamada 1arra de #stado, en la cual veremos luego que nos indicar si .ambas est realizando alguna operacin, por ejemplo &ompilando proyecto primerProyecto..., durante unos segundos cuando iniciemos la ejecucin del proyecto. !n la zona central del A0! tenemos el 6ise9ador de 8ormulario, el cual contiene la apariencia del formulario que estamos dise1ando, sobre el cual arrastraremos y soltaremos los componentes grficos. 0e aqu sale la principal ventaja de la programacin visual, donde podemos rpidamente crear la interfaz del usuario y tenerla lista antes de escribir cualquier cdigo para definir las operaciones de la aplicacin. Al "acer doble clicE sobre el formulario, o alguno de los controles que agregues, se mostrar en la misma regin el #ditor de Cdigo, donde escribiremos el cdigo necesario para cada uno de los controles que agreguemos al formulario y que determinar el comportamiento de ellos. &omo podrs notar durante la creacin de este primer proyecto, el editor de cdigo tiene importantes caractersticas que facilitan la codificacin y depuracin. Algunas de esas caractersticas son AutoFcompletado de &digo, Desaltado de )inta is, +uscar y Deemplazar. )obre el costado derec"o del A0! tenemos dos componentes importantes para el dise1o de los formularios. !n la mitad superior tenemos el :isor de Propiedades, donde podemos ver todas las caractersticas del formulario o del control que tengamos seleccionado es ese momento. &on el mismo visor de propiedades podemos modificar esas caractersticas para conseguir que los controles se ajusten en apariencia seg#n nuestras necesidades. !n la mitad inferior tenemos la Caja de $erramientas, la que contiene todos los elementos grficos que podemos programar en .ambas, los cuales ya fuimos mencionando y son prcticamente todos los elementos .UA disponibles en Linu 'botones, cuadro de te tos, etiquetas, etc(. 0esde esta caja podemos obtener los controles para arrastrarlos al formulario. -olviendo a las barra de men#s y botones, con ello controlamos todas las tareas principales del A0!. La versin actual tiene G men#s que se muestran a continuacin.

12

!l men# Arc+ivo con permite crear un proyecto nuevo, abrir uno desde el disco, guardar, ver alg#n ejemplo o salir de .ambas. !l men# Proyecto nos "abilita para definir las propiedades del proyecto y compilarlo para crear un ejecutable, arc"ivo fuente, o paquete de instalacin. &on el men# 6epuracin podemos controlar las interrupciones en la ejecucin del programa, ejecutar linea por linea, etc. &on el men# :ista podemos ocultar o "acer visibles cada unos de los componentes del A0!. 0esde el men# $erramientas tenemos acceso al .estor de +ases de 0atos, las /referencias respecto al A0! y otras ms. *inalmente, desde el men# ; 'Ayuda( podemos acceder a la documentacin que se instala junto con el entorno. La +arra de Berramientas nos brinda acceso rpido a las funciones de ms uso. 0ejando el puntero del mouse sobre los botones nos aparecer un cuadrito con el nombre.

A"ora que conocemos el entorno de programacin, sigamos con el dise1o del formulario que tenemos creado. !n la caja de "erramientas, seleccionamos la pesta1a 8orm5 all podremos ver los controles ms comunes para los formularios. /ara este ejercicio utilizaremos una etiqueta 'la el( y un botn ' utton(. !ntonces seleccionamos con un clicE el control la el de la caja de "erramientas, luego movemos el puntero del mouse sobre el formulario, presionamos el botn izquierdo para comenzar a marcar la zona donde queremos que se dibuje la etiqueta, arrastramos el puntero y lo soltaremos para fijar el tama1o que queramos. La segunda opcin es "aciendo doble clicE sobre el control label en la caja de "erramientas, aparecer el control dibujado en la esquina superior derec"a del formulario. Una tercera opcin es arrastrar el

13

control desde la caja de "erramientas "asta el rea del formulario donde deseamos dejarlo. !n cualquier caso, podemos reubicar y redimensionar un control seleccionndolo en el dise1ador del formulario y utilizando los cuadritos blancos que lo rodean. Bacemos lo mismo para ubicar el control utton, el botn. 0eberas conseguir la siguiente apariencia. ,bserva que alrededor del te to Label2 "ay una regin sin puntos. !sos puntos sobre todo el formulario se llaman grilla, y nos ayudar a ordenar los controles. La etiqueta se "a estirado un poco, por lo que se ve sin puntos "acia la derec"a del te to. !so es para que entre todo el te to que prendemos mostrar ms adelante. /rueba escribiendo tu te to en la propiedad @e t en el visor de propiedades para ajustar el tama1o de la etiqueta.

A"ora editaremos las propiedades de cada objeto para conseguir nuestro objetivo comenzando con el formulario6 !n el e plorador de proyecto "acemos clicE derec"o sobre el #nico formulario que tenemos y elegimos la opcin <enom rar... 08(2, y escribimos frm#jercicio'. !n el visor de propiedades buscamos la propiedad Te7t y escribimos !i primer formulario con %am as. !n el botn modificaremos las propiedades desde el visor de propiedades5 entonces 3ame, tn!ostrar y Te7t, !ostrar te7to. )i el botn no tiene el tama1o adecuado, el te to podra ocultarse parcialmente5 en tal caso solo redimensiona su tama1o. !n la etiqueta modificaremos las mismas propiedades que en el botn, usando como nombre l l4aludo y al te to de la propiedad Te7t lo borramos. ,btendremos la siguiente apariencia. A"ora debemos codificar la accin que queremos al presionar el botn. /ara abrir el editor de cdigo tenemos cuatro maneras, la ms rpida sera "aciendo doble clicE sobre el botn. La segunda opcin es "acer clicE derec"o y elegir la opcin Abrir cdigo '&trlH9(. !stas dos opciones nos lleva al editor de cdigo donde veremos que automticamente se escribieron las instrucciones PU1LIC 4U1 y #36 correspondientes al evento Clic5 de nuestro botn. !ntre ellas escribiremos la accin de nuestro botn, la cual sera l l4aludo.Te7t = >?1ienvenido a la programacin con %am as@A. :otars que al escribir el nombre de la etiqueta, te mostrar un peque1o cuadro con el nombre completo de nuestra etiqueta, es el autoBcompletado, para aprovec"arlo puedes usar la tecla Ta o Intro para continuar escribiendo el I.I, no funcionar con la barra de espacio como puedes "acerlo en otros editores. Al escribir el punto, te saldr una lista con todas las propiedades y m$todos del control 'de la etiqueta en nuestro caso(, elegimos o escribimos @e t, y completamos el te to que vamos a mostrar.

14

!s un buen momento para guardar nuestro proyecto. Aqu podemos cerrar el entorno, luego de volver a abrir nuestro proyecto, tendremos las cosas tal cual lo vemos a"ora. 0e todos modos este paso no es necesario a"ora, ya que podemos directamente ejecutar nuestra aplicacin. Antes de ejecutarse nuestro cdigo, debe guardarse y compilarse5 todo eso se "ace de forma automtica al presionar el botn #jecutar o la tecla 8C, con lo cual ya no necesitamos guardar el proyecto. *inalmente podremos ver nuestra ventana funcionando.

/ara cerrar la aplicacin podemos presionar el botn con la D '&errar la ventana( que nos ofrece el gestor de ventanas o con el botn Parar de la barra de "erramientas del A0! de .ambas. 8s adelante usaremos un botn en el formulario programado para terminar la ejecucin de la aplicacin.

Basta a"ora "emos editado dos tipos de arc"ivos, como podemos ver justo arriba del editor de cdigo. Los arc"ivos que creamos son frm#jercicio'.form, donde tenemos todos los datos del formulario5 y el arc"ivo frm#jercicio'.class, que contiene todo nuestro cdigo. Baciendo clicE sobre la pesta1a con el nombre frm!jercicio2.form volveremos al dise1ador de formulario, y "aciendo clicE sobre frm!jercicio2.class volveremos al editor de cdigo. !sta #ltima es la tercera forma de acceder al cdigo de nuestro control. )i abrimos nuestro navegador de arc"ivos preferido y accedemos a la carpeta de nuestro proyecto, podremos ver que all se encuentran nuestros dos arc"ivos. Decordemos que ambos tiene el nombre que elegimos para nuestro formulario.

15

!n el siguiente captulo veremos los fundamentos de la programacin en +asic, los tipos de datos que se utilizan y la sinta is de las instrucciones bsicas que se utilizan en cualquier lenguaje de programacin.

1i liografEa6 8g. Ang. *tima del &. 8artnez5 =44J5 KAntroduccin a -isual +asicL5 @ucumn5 Argentina Luis ?oyanes Aguilar5 233G5 K/rogramacin ,rientada a ,bjetosL5 8c.ra%FBill5 8adrid5 !spa1a ?o"n 9 Ditting"ouse5 =44M5 KA +eginnerIs .uide to .A8+A)L 9iEipedia5 K/rogramacinL5 "ttp6CCes.%iEipedia.orgC%iEiC/rogramacion5 accedido 2=CoctC=424 9iEipedia5 K)oft%are LibreL5 "ttp6CCes.%iEipedia.orgC%iEiC)oft%areNlibre5 accedido 2=CoctC=424

16

Potrebbero piacerti anche