Pregunta:
¿ Alguien q sepa un lugar donde pueda bajar un buen tutorial de visual basic 2005 ?
Ogir
2006-10-06 03:45:16 UTC
¿ Alguien q sepa un lugar donde pueda bajar un buen tutorial de visual basic 2005 ?
Cuatro respuestas:
2006-10-06 10:22:28 UTC
Ahi te va una parte del seg. capitulo(son veinte cap). Lo baje de

http://www.telecable.es/personales/jrubi/index.htm?curso.htm



OBJETOS VISUAL BASIC PROPIEDADES, PROCEDIMIENTOS Y METODOS



Vamos a ver en este capítulo como podemos realizar una aplicación en Visual Basic. Comencemos por abajo.



Una aplicación VB es una aplicación que, generalmente, tiene una interface gráfica. Es decir, es una aplicación de las típicas de Windows. Y esa interface gráfica está formada por un formulario y dentro de él, controles. Tanto al formulario como a los controles les denominamos genéricamente Objetos. Hay objetos VB que no los podemos ver en la interface gráfica. No podemos verlos porque pese a que son objetos VB, no tienen ninguna representación en la ventana. Son por ejemplo, los objetos de acceso a datos que veremos profusamente más adelante.



Todos los objetos de Visual Basic tienen Propiedades. (Por ejemplo, el nombre de ese objeto es una de sus propiedades). Los objetos que tienen parte gráfica tienen además Eventos. Y muchos de ellos tienen también Métodos



Propiedades, Eventos, Procedimientos y Métodos



Típica pregunta de examen de VB elemental. Veamos que es cada una de estas cosas.



Las propiedades son aquellas características de un objeto que lo define "físicamente", bien por su forma o color, por su contenido, por la forma en la que va a trabajar… Las propiedades pueden modificarse cuando estamos diseñando la interface gráfica, mediante lo que llamamos caja de propiedades, o durante la ejecución del programa. En este caso hay que hacerlo con código escrito en el propio programa. Veamos ya dos definiciones que se repetirán profusamente a lo largo del curso



-Tiempo de diseño. Es cuando realizamos una operación durante el diseño. Por ejemplo, podemos cambiar el color de un control durante el diseño de la aplicación, accediendo a su propiedad BackColor en la caja de propiedades.

-Tiempo de ejecución. Es cuando esa operación se realiza durante la ejecución del programa. Si tenemos una línea de código como esta



MiControl.BackColor =RGB(255,0,0)



al ejecutarse esa línea, se cambiará el color del control de nombre MiControl. Hemos cambiado la propiedad BackColor de ese control en tiempo de ejecución.



Las propiedades pueden ser de lectura y escritura, (se puede cambiar y se puede leer el valor de la propiedad), sólo de lectura (solamente se puede leer el valor de la propiedad) ó solo de escritura (hay muy pocas de este tipo). Puede que una propiedad, que es de lectura y escritura en tiempo de diseño, sea sólo de lectura en tiempo de ejecución (esto es lo que le pasa por ejemplo, a la propiedad Name - Nombre)



Un evento es todo aquello que le puede ocurrir a un objeto con parte gráfica (Control o Formulario) Por ejemplo, es un evento el hecho de hacer click sobre ese control, el hecho de pasar el ratón por encima de él, el hecho de que un control cambie de tamaño…. Los controles tienen muchos eventos, unos de ellos comunes a casi todos los controles (Evento click, por ejemplo) y otros exclusivos de un determinado control (El evento Timer solamente lo tiene el control Timer) Puede ver los eventos de un control haciendo doble click sobre ese control en tiempo de diseño. Le aparecerá la ventana de código.





Fig. 2.1 Ventana de código



La ventana de código es el lugar donde deberá escribir el código de su aplicación. Puede ver que existen en ella dos listas desplegables, una a la izquierda (sin desplegar) donde se ve el nombre del control del cual estamos visualizando el código (en este caso Command1) y otra a la derecha, donde se despliegan todos los eventos que tiene ese control. Haciendo click en la línea de uno de esos eventos, aparecerá la ventana de código dedicada a ese evento.



Nota. Fíjese en la parte inferior izquierda de la ventana de código. Hay dos botones, uno que permite visualizar el código correspondiente a un solo evento, (el de más a la izquierda) y otro que permiten ver en la misma ventana el código de todos los eventos. Cada programador tiene su costumbre para ver uno o todos. La práctica le dirá lo que es más práctico para Vd.



Un Procedimiento es el código que introducimos dentro de un evento. No pretendo hacer escuela con definiciones, puesto que el concepto de evento y procedimiento se confunde con mucha frecuencia, y no pasa nada por ello. El código introducido en la ventana de código del evento click será el procedimiento click, el que se introduzca en el evento MouseUp será el procedimiento MouseUp. No se sorprenda si a lo largo de este libro nos referimos a evento o a procedimiento de forma equivocada. En el lenguaje coloquial es muy habitual ese error y como decíamos, no pasa nada por ello.



Estos procedimientos forman parte del programa. Podría hacerse una aplicación que no tuviese mas código que el introducido en los procedimientos, y muchas veces esa es la realidad.



Un procedimiento puede pasar parámetros. Se dice que pasa parámetros cuando el sistema aporta datos automáticamente al procedimiento. Por ejemplo, el procedimiento MouseUp, que se ejecuta cuando levantamos el botón del ratón (también existe el evento MouseDown), pasa los siguientes parámetros: Número del botón que se ha pulsado, (1=Izdo, 2=Dcho, 3=Central), si está pulsada la tecla mayúsculas (Shift, 1 si está pulsada, 0 si no está pulsada) y los valores X e Y de la posición del cursor del ratón. Podemos ver los parámetros que pasa en la propia definición del procedimiento, que nos da Visual Basic



Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)



End Sub



Observe que los parámetros están entre paréntesis, y que queda definido el tipo de variable que es cada uno de ellos. Podemos usar ese valor dentro del código del procedimiento como un dato más.



Un Método es una operación que la realiza Visual Basic sin necesidad de escribir código para realizarla. Por ejemplo, si queremos dibujar una línea en un formulario o en la impresora utilizaremos el método Line. Si queremos dibujar una circunferencia usaremos el método Circle. Si queremos escribir texto, utilizaremos el método Print. No necesitamos decirle como lo tiene que haver, puesto que eso ya lo sabe hacer VB sin necesidad de que se lo expliquemos. A los métodos les tenemos que pasar datos. A eso le llamamos también pasarle parámetros. Los métodos solo permiten introducir los parámetros que necesita el método para ejecutarse. (En el caso de una línea, el punto inicial y el final, en el caso del circulo, el radio y las coordenadas del centro. Pueden pedir parámetros optativos, como el puede ser el color de la línea o circulo.



Espero que le quede claro cada una de estas definiciones. Tendrá tiempo suficiente a lo largo del curso para verlas, y dentro de muy poco tiempo le serán muy familiares estos conceptos.





EL FORMULARIO



El primer objeto Visual Basic con que nos encontramos es el FORMULARIO. De hecho, cada vez que iniciamos Visual Basic (VB) nos presenta en pantalla un nuevo formulario, que tiene por defecto el nombre de Form1



El Formulario es un objeto, que sirve de soporte de otros objetos. El nombre de FORMULARIO lo toma precisamente porque, al igual que un formulario de papel contiene textos escritos, lugares donde podemos escribir, figuras, cajas donde podemos elegir una u otra opción, etc., en este cuadro gráfico que llamamos formulario, podemos introducir textos escritos, lugares donde podemos escribir, figuras, cajas donde podemos elegir una u otra opción ....



En realidad un formulario es lo que normalmente conocemos por VENTANA. El nombre de formulario le viene muy bien cuando ese formulario es una ventana donde vamos a introducir datos alfanuméricos. Cuando en vez de introducir datos, lo que tenemos es, por ejemplo, una ventana donde se reproducen exactamente los controles de operación de una máquina, parece en principio que sería mas correcto el nombre de "ventana". De alguna forma lo hay que llamar, y esa forma es FORMULARIO. Posiblemente a lo largo de estos apuntes nos referiremos al formulario con el nombre de ventana, o incluso, pantalla. Procuraremos usar el nombre apropiado: FORMULARIO.







Fig. 2.2 Forma inicial del formulario.





Fig. 2.3 Un formulario que parece un equipo de radio (Programa realizado por el autor)



Ejemplo de un formulario para una aplicación industrial. Este formulario reproduce el panel de control de un transmisor - receptor de radio. En este caso, parece que el nombre de ventana le viene mejor que el de formulario. Observe que dentro del formulario existen gran cantidad de objetos. Botones, que hacen la misma función que el botón real en el equipo de radio, y un par de displays, que muestran un texto, en este caso las frecuencias de transmisión y recepción.



Como cualquier objeto Visual Basic, un formulario tiene propiedades, procedimientos y métodos.



Vamos a ver las propiedades del formulario, pero solo veremos las que son específicas para un formulario. El resto las podrá ver al final del capítulo. Aquí haremos referencia a esas propiedades con un asterisco (*) que significa que esa propiedad no tiene una notación especial para los formularios. Seguiremos esta norma con todos los controles.



PROPIEDADES.



NameNombre



Define al objeto durante la ejecución del programa. Se introduce en tiempo de diseño y no se puede variar durante la ejecución. Nombre por defecto: Form1 (Form2 y sucesivos) Este nombre por defecto debe cambiarse, (debería cambiarse por norma en el momento de introducir el formulario), ya que de no hacerlo corremos el riesgo de borrar el código existente de otro formulario del mismo nombre en el momento de guardar la aplicación.



CaptionTítulo



Es el texto que aparecerá en la barra de Título cada vez que aparezca en pantalla este formulario. No tiene otra función dentro del programa. El programa no accede a este formulario por el título, sino por el nombre. Puede cambiarse en tiempo de ejecución.



NOTA.- No confundir Nombre (Name) con Título (Caption)



Control BoxMenú de Control en la parte sup. Izda.Valor por defecto : True



Propiedad Booleana que admite los valores de true (verdadero) o False (Falso). Si esta propiedad es True, aparecerá en la esquina superior izquierda el icono (el "menos" en W-3.11) para desplegar el menú de control de este formulario. Si esta propiedad se pone como False, no aparece dicho icono y por tanto no se puede desplegar dicho menú.



MinButton

MaxButtonValor por defecto: True



Botones de minimizar y maximizar este formulario. Son igualmente propiedades booleanas, que admiten el valor True o False. Si están en true, aparecerá la flecha correspondiente. Si están en False, no aparecerá dicha flecha. Deben configurarse de una u otra forma, dependiendo si se quiere minimizar / maximizar este formulario durante la ejecución.



Nota. En los formularios MDI child, es necesario poner a true las propiedades ControlBox, MinButton y MaxButton para poder maximizar el formulario hijo. De no ponerlas a true, sí se pretende maximizar el formulario hijo, (Propiedad WindowState=2) el formulario no aparece.



BorderStyleTipo de borde



Define el tipo de borde que tendrá el formulario durante la ejecución. No se puede cambiar en tiempo de ejecución. Admite los siguientes valores:



0 - None El formulario no tiene borde alrededor



1 - Fixed Single

El formulario tendrá un borde fino, y no podrá cambiarse su tamaño durante el tiempo de ejecución. Con este valor, el formulario puede tener un menú de control, barra de título y botones de maximizar y minimizar. Solo podrá cambiarse de tamaño utilizando estos botones.

2-Sizable

El formulario tendrá borde grueso, y se podrá cambiar su tamaño en tiempo de ejecución mediante los botones de maximizar y minimizar, y mediante el arrastre de uno de los bordes con el ratón.



3 - Fixed Dialog

El formulario tendrá borde grueso, y no se podrá redimensionar durante la ejecución. No puede tener los botones de maximizar ni minimizar.



4 - Fixed ToolWindow

En las versiones de 16 bits de Windows y Windows NT 3.51 y anteriores se comporta como Fixed Single. No puede cambiar de tamaño. En Windows 95 muestra el botón Cerrar, y el texto de la barra de titulo aparece con un tamaño de fuente reducido. El formulario no aparece en la barra de tareas de W95.



5 - Sizable ToolWindow

En las versiones de 16 bits se comporta como Sizable. En W95 muestra el botón Cerrar y el texto de la barra de titulo aparece con un tamaño de fuente reducido. El formulario no aparece en la barra de tareas de W95.



Valor por defecto: 2 . Sizable



Nota: Al cambiar a determinados valores, las propiedades MaxButton y MinButton se ponen a False. Pueden cambiarse a True posteriormente.



AppearanceAparienciaValor por defecto: 3D



Admite los valores 0 (=Flat, plano) y 1 (=3D) Si tiene el valor 1 (3D), el formulario aparecerá con cierto efecto tridimensional, y los controles que le introduzcamos a este formulario aparecerán como esculpidos dentro de él. Con valor 0 (Flat) en esta propiedad, el formulario aparecerá durante la ejecución como una superficie plana. El color de fondo se ve afectado al cambiar esta propiedad. Si se cambia a 3D, el fondo (Backcolor) toma el color definido en Windows en el Panel de Control. Si se cambia a Flat, toma el color blanco



AutoredrawValor por defecto: False



Propiedad Booleana. Esta propiedad, estando en True, permite actualizar el contenido del formulario y de sus controles incluso cuando no están visibles. Imaginemos que en este formulario existe un texto, que se haya cambiado por programa mientras este formulario no estaba visible. Si esta propiedad Autoredraw está en False, al hacer visible este formulario, aparecerá sin reflejar ese cambio. Si esta propiedad está en True, aparecerá actualizado.



BackcolorColor del fondo



Establece el color del fondo del formulario. Puede cambiarse en tiempo de ejecución.



Valor por defecto: El establecido en el Panel de Control de Windows.









ClipControlsValor por defecto: False



Propiedad Booleana. Establece si un evento Paint vuelve a dibujar el objeto entero (True) o si solamente dibujan las partes que han sufrido cambios (False)



DrawMode



Establece un valor que determina el aspecto de la salida de un método gráfico o el aspecto de un control Shape o Line. Verá mas adelante los efectos de esta propiedad.



DrawStile(*)Valor por defecto : 0



DrawWidth(*)Valor por defecto: 1



Enabled(*)



ForeColorValor por defecto: Negro



Establece el color del primer plano del formulario. Es el color que tendrán las letras si escribimos en él, o los dibujos, si lo que hacemos es dibujar. En tiempo de diseño, determina el color de la rejilla,.



FillStyleTipo de relleno(*)



FillColor Color del relleno(*)



FontTipo de letraValor por defecto: El determinado en la personalización.



Especifica el tipo y tamaño de la letra que se usará en el formulario al utilizar el método Print. Al seleccionar esta propiedad en la ventana de propiedades, aparece un cuadro de dialogo donde se eligen ambos parámetros.

Cuando introduzca nuevos controles en el Formulario, la propiedad Font de estos controles tomará el valor que tenga esta propiedad en el Formulario. Puede servirle este pequeño truco para utilizar en todos los controles una determinada fuente sin tener que teclearla para cada control.



FontTranparentTexto TransparenteValor por defecto: True



Establece si el texto o gráfico de fondo del formulario se muestra (True) o no se muestra entre los caracteres de texto escritos en el propio formulario.



FontSize Tamaño de letra(*)



FontBold, FontItalic, FontStrikethru, FontUnderline(*)



HeightAltura(*)



HelpContextIDIdentificador de contexto de la Ayuda(*)



IconIcono



Esta propiedad define el icono que va a representar a este formulario cuando esté minimizado. Si el formulario es el formulario padre o formulario de inicio de una aplicación, este icono es el que toma el Asistente de Instalación para colocarlo como icono de apertura del programa en el grupo de programas Windows correspondiente. Como valor de esta propiedad se le puede asignar directamente el icono o el nombre de un archivo (con su path correspondiente) que lo contiene, haciéndolo directamente sobre la caja de propiedades.



Valor por defecto: el icono que se le haya programado en la personalización.



KeyPreviewValor por defecto: False



Propiedad Booleana. Cuando un formulario tiene dentro de sí varios controles, uno de ellos es el que está activo. En estas condiciones, si se pulsa una tecla, esa pulsación la recibe en primer lugar el control que esté activo, y si éste no la procesa, pasa esa pulsación al formulario. Para hacer que esa pulsación pase previamente por formulario, debe ponerse esta propiedad en True. Esta propiedad la usará frecuentemente cuando quiera realizar alguna función pulsando una letra. Pone KeyPreview a True, y puede conocer que tecla se ha pulsado en el procedimiento KeyPress del formulario. Si la tiene a False, ese procedimiento no se ejecuta ya que la pulsación “no pasa” por el formulario.



LeftPosición del Borde Izquierdo



Indica la posición del borde izquierdo del formulario respecto a la parte izquierda de la pantalla. (Lo verá mas adelante, la pantalla será para VB el objeto Screen). Normalmente no se introduce como valor numérico, sino que lo toma automáticamente de la posición que tenga el formulario en el tiempo de diseño. Puede cambiarse en tiempo de ejecución, para mover el formulario.



LinkModeValor por defecto: 0



Permite que una aplicación destino inicie una conversación DDE con el formulario (origen de datos). Puede tomar los siguiente valores:



0 - No hay interacción DDE

1 - Source. Indica que este Formulario es origen de una comunicación DDE. El dato que se va a traspasar en esa comunicación DDE estará en un TextBox, en un Label o en un PictureBox de este Formulario.



LinkTopic



Establece el tema al que este formulario va a responder a una conversación DDE, cuando funciona como origen. Es por este tema por el que se debe llamar a este formulario cuando actúa de origen en una conversación DDE



MDIChildValor por defecto: False



Establece que este formulario es un formulario Hijo dentro de un formulario MDI. No se puede cambiar en tiempo de ejecución. Es una propiedad Booleana



True = es formulario hijo False =No lo es



MouseIcon(*)



MousePointer(*)Valor por defecto: flecha



PictureGráfico



Mediante esta propiedad podemos poner un gráfico como fondo del formulario. El gráfico puede ser un bit-map o un fichero .ICO



ScaleHeight, ScaleWidth, ScaleMode,



Indican la unidad de medida de dimensión de altura y anchura del Formulario. ScaleMode indica en qué unidades de medida se van a medir esas dimensiones. Acepta Twips (1), Point(2), Pixel (3), Character (4), Pulgadas (Inch) (5), Milímetros (6), Centímetros (7). Si colocamos la propiedad ScaleMode en cualquiera de estos valores, las propiedades ScaleHeight y ScaleWidth nos vendrán dadas automáticamente dependiendo del ancho del Formulario, y no se extrañe si encuentra para estas propiedades valores tan peregrinos como 4815 y 7423. Al haber elegido la unidad de medida, los valores de ancho (ScaleWidth) y alto (ScaleHeight) serán los que tengan que ser, medidos en la unidad que hemos elegido. Podemos elegir una cifra para el ancho y el alto del Formulario de forma que podamos controlar mejor las distintas posiciones que van a ocupar en él los controles, los textos o los dibujos. Podemos poner, por ejemplo, que el Formulario mida 400 de ancho (ScaleWidth = 400) y 300 de alto (ScaleHeight = 300) forzándole estas propiedades, bien en tiempo de diseño en la caja de propiedades, o en tiempo de ejecución mediante código. Entonces sabemos que el formulario, independientemente de las dimensiones físicas que tenga sobre la pantalla, medirá 400 de ancho y 300 de alto, y si en estas condiciones queremos colocar un control o un dibujo justo en el medio del Formulario, sabemos que tenemos que colocarle en las coordenadas 200, 150. ¿Que unidad de medida estaremos utilizando entonces en el Formulario ? Unas definidas por el usuario (distintas para el ancho y el alto) que serán las necesarias para que el Formulario mida de ancho lo que le hayamos puesto en la propiedad ScaleWidth y de alto lo que le hayamos puesto en la propiedad ScaleHeight. Observe que la propiedad ScaleMode se ha cambiado automáticamente a User (0) al introducir las dimensiones de ancho y alto que nosotros queremos.



Estas unidades de medida afectarán a los controles que metamos en este Formulario. Se medirán en su ancho y alto con la unidad de medida definida para el ancho y alto del Formulario. Lógicamente también afectará a las propiedades Left y Top de los controles, pero estas propiedades se verán afectadas además por las propiedades ScaleLeft y ScaleTop del Formulario que se verán a continuación.



ScaleLeft, ScaleTop



Estas propiedades, medidas en la unidad de medida elegida para el ancho y alto mediante las propiedades ScaleMode, ScaleWidth y ScaleHeight anteriores, expresan las coordenadas iniciales de la parte izquierda y de la parte superior respectivamente del Formulario. Estas propiedades no afectan a la posición del Formulario en la pantalla (Si está maximizado seguirá ocupando toda la pantalla, si está en “Normal” ocupará el mismo sitio que se dio en tiempo de diseño). Supongamos que se le asigna a un Formulario, las propiedades ScaleWidth = 400, y ScaleHeight = 300. Si colocamos un control justamente en el centro del Formulario tendrá sus propiedades Top =150 y Left=200. Si ponemos ahora las propiedades del Formulario ScaleLeft a 30 y ScaleTop a 10, ese control, para seguir en el centro del Formulario deberá tener sus propiedades Top a 160 (150 + 10) y Left a 230 (200 + 30).



Recuerde que las medidas de un formulario crecen, desde la esquina superior izquierda, según avanzamos hacia abajo y hacia la derecha.



Como aclaración de las relaciones entre distintas unidades de medida, puede ver en la siguiente table la correspondencia entre cada una de ellas y la unidad imaginaria Twip.



1 Point=20 Twips ; 1Pixel=15 Twips : 1 Charecter=240 Twips ; 1 Inch (pulgada) =1440 Twips 1mm=56,52 Twips 1 cm=566 Twips



Tag(*)



TopPosición del borde superior



Esta propiedad establece la posición del borde superior del formulario respecto a la parte superior de la pantalla (Objeto Screen). Normalmente no se introduce como valor numérico sino que lo toma automáticamente de la posición que tenga el Formulario durante el tiempo de diseño Este valor puede cambiarse durante la ejecución para, conjuntamente con Left, variar la posición del Formulario. Los valores de Top y Left definen la esquina superior izquierda del Formulario.



Visible(*)Valor por defecto: True



WidthAncho(*)



WindowState



Establece el estado en el que aparecerá el formulario cuando se activa y presenta en pantalla. Admite tres opciones:

0 - Normal El formulario recupera la posición y tamaño que tenía en el tiempo de diseño.

1 - Minimizado El formulario aparece minimizado, representado por su icono.

2 - Maximizado El formulario aparece maximizado, ocupando toda la pantalla.





EVENTOS DEL FORMULARIO



Se explican a continuación los eventos de un formulario. Recuerde que un evento es lo que le puede ocurrir a un formulario o control (p.e. Evento Click) y un procedimiento es el código escrito en ese evento, que se ejecutará cuando ocurra el evento.



Evento ActivateActivación

Este evento se ejecuta al convertirse el formulario en formulario activo. Esto sucede múltiples veces cuando tenemos en el programa mas de un formulario. Sólo uno de ellos puede ser el formulario activo. Este procedimiento no pasa parámetros. No debe emplearse para los parámetros iniciales del formulario. Úsese para este fin el evento Load o el Initialize.



Evento ClickClick

Este evento se ejecuta cuando hacemos Click (con cualquier botón del ratón) en una parte del formulario que no esté ocupada por un control. Para que se ejecute el evento Click es necesario que no se ejecute el procedimiento MouseDown. (Que no tenga código escrito en el evento MouseDown). Existe una diferencia entre el evento click del formulario y el de cualquier control : en el formulario se ejecuta con cualquiera de los botones del ratón, y en los controles, solamente con el botón izquierdo. Este evento no pasa parámetros.



Evento DblClickDoble click

Este evento se ejecuta cuando hacemos doble click con cualquier botón del ratón sobre una parte del formulario que no esté ocupada por un control. Este evento no se ejecuta si tenemos escrito código en el procedimiento Click. No pasa parámetros.



Evento DeactivateDesactivación

Se produce cuando el formulario deja de ser el formulario activo. Vea Activate. No pasa parámetros.



Evento DragDrop Acción de Soltar durante el Drag & Drop(*)

Evento DragOverPasar el ratón por encima en una operación de Drag & Drop (*)



Evento GotFocusEl formulario obtiene el foco



Este evento ocurre cuando el formulario toma el foco. Cosa un poco difícil, ya que para que el formulario tome el foco debe ocurrir, o que no tenga ningún control capaz de tomar el foco, o que todos los controles existentes en el formulario y que puedan tomar el foco, estén desactivados. No se suele usar este procedimiento.



Evento InitializeInicialización del formulario



Se produce al cargar por primera vez el formulario. Esto significa que si en una aplicación cargamos ese formulario una vez (la primera) se realiza este evento, pero si descargamos el formulario (con Unload Formxx) y luego lo volvemos a cargar (con Formxx.Show), esta segunda vez (y sucesivas) no se produce este evento



Evento KeyDown Pulsar una tecla (Instante en que se ha pulsado)

Evento KeyPressPulsar una tecla

Evento KeyUpSoltar una tecla(Instante en que se levanta)



Estos tres eventos solamente se producirán en el formulario cuando la propiedad KeyPreview está a True. (Vea propiedad KeyPreview)



Estos tres procedimientos son excluyentes y tienen la jerarquía con el orden siguiente: KeyDown, KeyPress y KeyUp. Si el procedimiento KeyDown tiene código que pueda realizar una operación, no se ejecutará el procedimiento KeyPress ni el KeyUp. Si es el procedimiento KeyPress quien tiene el código que ejecuta una operación, no se ejecutará el KeyUp. Para que realice esta exclusión es necesario que el código pueda realizar alguna operación.



Pasa los siguientes parámetros:



KeyDown : KeyCode As Integer, Shift As Integer

KeyPress : KeyAscii As Integer

KeyUp : KeyCode As Integer, Shift As Integer



KeyCode es el código ASCII de la tecla pulsada. KeyAscii es el código ASCII de la tecla pulsada.

La diferencia entre KeyCode y KeyAscii es que el primero se refiere a las teclas del teclado (Todas las letras y números, teclado numérico, Alt, F1 a F12, etc.) mientras que KeyAscii solamente tiene valor cuando se pulsa una tecla de letra o número. Puede observar que el KeyCode de un número tecleado en el teclado numérico es distinto del KeyCode de ese mismo número pulsado en el teclado alfanumérico. No se confunda con el hecho de que el KeyCode de algunas teclas coincida con el KeyAscii. No es lo mismo.

Shift indica si está pulsada la tecla “Mayúsculas”. Contiene un 1 si está pulsada, 0 si no lo está.



Evento LinkErrorError de enlace

Evento LinkExecuteEjecución de un enlace de datos

Evento LinkOpenRomper el enlace



Estos tres procedimientos ocurren cuando el formulario forma parte de un enlace DDE. Vea el capítulo del DDE para mas detalles.



Evento LoadCargar el formulario



Este evento es se ejecuta en el momento de la carga del formulario. Es el que presenta en la ventana de código por defecto, es decir, uno de los mas usados en el formulario. Y es el mas usado porque es el mas apropiado para introducirle a ese formulario los valores y parámetros iniciales, abrir bases de datos, etc.

Se ejecuta después del evento Initialize del formulario, pero este evento Load, al contrario que el Initialize, se ejecuta cada vez que cargamos el formulario. Para introducir código de inicialización debe utilizar este evento Load. Este evento no pasa parámetros.



Evento LostFocusPerder el foco

Ocurre cuando el formulario pierde el foco. Y un formulario solo puede perder el foco cuando lo tenía. Cosa que no es fácil que ocurra, tal como se explicó en el Evento GotFocus.



Evento MouseDownPulsar una tecla del ratón

Ocurre cuando se pulsa cualquier botón del ratón, estando el cursor encima de un punto del formulario libre de controles. Pasa como parámetros Button (Botón pulsado, 1 = Izquierdo, 2 = Derecho, 3 = Central), Shift (Tecla de Mayúsculas) y la posición del puntero del ratón sobre el formulario (X e Y). Este evento puede usarse para muchas cosas. Una de ellas, muy típica, iniciar una operación de Drag & Drop manual, usando la particularidad de que como pasa la tecla Shift como parámetro, puede obligarse a pulsar esa tecla para iniciar el D & D, evitando así cualquier activación accidental.



Evento MouseMoveMover el ratón (Detecta la posición del ratón sobre el formulario)

Se produce cada vez que se mueve el ratón sobre el formulario. Tenga cuidado al usar este evento, ya que cualquier movimiento del ratón lo va a desencadenar. Por eso, siempre se usa con una condición (que esté pulsada la tecla de mayúsculas, que esté pulsado uno de los botones del ratón, etc.). Los parámetros que pasa son Button As Integer, Shift As Integer, X e Y As Single.



Evento MouseUpSoltar una tecla del ratón

Este evento sucede cuando se levanta la tecla pulsada del ratón. Pasa como parámetros Button (Botón pulsado, 1 = Izdo, 2 = Dcho, 3= Central) Shift (Mayúsculas), X e Y (Single) como posición del puntero del ratón

Este evento suele usarse para mostrar PopupMenús, deshacer una operación iniciada con MouseDown, etc.



Evento PaintRedibujar tras un cambio de tamaño

Se produce al cambiar el tamaño del formulario, tras el evento Resize, excepto cuando se minimiza. Puede aprovecharse para redibujar el contenido del formulario (de ahí su nombre) tras un cambio de tamaño. No pasa parámetros



Evento QueryUnloadConfirmación de descarga

Este procedimiento se ejecuta cuando el formulario recibe la instrucción de descargarse. Todavía estamos a tiempo de evitar que se descargue. Por lo tanto es aquí donde suele colocarse una caja de mensaje donde se obliga al usuario a ratificar o revocar la orden de descarga del formulario. En caso de que en realidad no queramos descargarlo, basta con poner Cancel = True (o Cancel = 1) y no se producirá la descarga. Pasa como parámetros Cancel As Integer, UnloadMode As Integer.



Cancel es un parámetro que debemos introducir para abortar la descarga del formulario. Si se pone a un valor distinto de 0, se detiene la descarga.



UnloadMode es un valor o constante que nos da el sistema, dependiendo de la causa que ha provocado la descarga del formulario.



ConstanteValor

vbFormControlMenu0El usuario eligió el comando Cerrar del menú Control del

formulario o hizo click en el X del mismo.

vbFormCode1Se invocó la instrucción Unload desde el código.

vbAppWindows2La sesión actual del entorno operativo Microsoft Windows

está finalizando.

vbAppTaskManager3El Administrador de tareas de Microsoft Windows está cerrando la

aplicación.

vbFormMDIForm4Un formulario MDI hijo se está cerrando porque el

formulario MDI padre también se está cerrando.



Este procedimiento no se ejecuta cuando sale de la aplicación mediante la instrucción End. Solamente se ejecuta cuando con la instrucción Unload, o con el comando Cerrar del menú Control del formulario, o haciendo click en el X del mismo. El evento QueryUnload se utiliza con frecuencia para guardar la configuración actual de la aplicación.









Evento ResizeCambio de tamaño



Se ejecuta cuando cambia el tamaño del Formulario, bien porque le cambia con las flechas del ratón arrastrando uno de sus bordes, bien porque lo maximizamos, ponemos a tamaño intermedio o minimizamos. Puede usar este evento para redistribuir o cambiar el tamaño de los controles. No pasa parámetros.



Evento Terminate



Este evento se produce al descargar el formulario, después de QueryUnload y Unload. Aquí ya no podemos abortar la descarga. Solamente podremos, por ejemplo, guardar la configuración usada por la aplicación, para que vuelva a arrancar con la última configuración usada.



Este evento no se produce si sale de la aplicación con la instrucción End. Solamente si lo hace mediante Unload (Unload Me, p.e.) o con el comando Cerrar o el X del formulario. Me permito recomendarle que No termine sus aplicaciones mediante End. No podrá usar los eventos QueryUnload, Unload ni Terminate.



Evento UnloadDescargar el formulario



Este evento se produce en el momento en el que se descarga el formulario. Pasa como parámetro Cancel, al igual que lo hace QueryUnload. Es la última oportunidad de cancelar la descarga del formulario, haciendo Cancel = True o Cancel = cualquier valor distinto de 0.



Este procedimiento no se ejecuta cuando sale de la aplicación mediante la instrucción End. Solamente se ejecuta cuando con la instrucción Unload, o con el comando Cerrar del menú Control del formulario, o haciendo click en el X del mismo.



Eventos del OLE



Existen varios eventos relacionados con el OLE de Windows. Se estudiarán cuando se estudie el OLE. De momento se enumeran con los parámetros que pasan.



Evento OLECompleteDrag (Effect As Long)

Evento OLEDragDrop (Data As DataObject, Effect As Long, Button As Integer, Shift As _

Integer, X As Single, Y As Single)

Evento OLEDragOver (Data As DataObject, Effect As Long, Button As Integer, Shift As _

Integer, X As Single, Y As Single, State As Integer)

Evento OLEGiveFeedback (Effect As Long, DefaultCursors As Boolean)

Evento OLESetData (Data As DataObject, DataFormat As Integer)

Evento OLEStartDrag (Data As DataObject, AllowedEffects As Long)







LOS CONTROLES MAS ELEMENTALES DE VISUAL BASIC



Una vez introducido un Formulario, se pueden colocar los objetos (controles) que forman parte de la aplicación. Estos controles se irán viendo en próximos capítulos.



Los controles, lo mismo que el Formulario, tienen Propiedades, Procedimientos y Métodos.





Para colocar un control en un Formulario, basta con “tomarlo” de la caja de herramientas existente en la parte izquierda de la pantalla de VB y llevarlo al Formulario. Si no existiese el control deseado en la caja de herramientas, deberemos ir a “cogerlo” a Proyecto | Componentes de la barra de menú de VB. Se elige el nuevo control, marcando la caja de opción a la izquierda de su nombre, y haciendo click en ACEPTAR. Este control ya pasa a la caja de herramientas.



No se deben introducir mas controles de los necesarios. Sobre todo, cuando vaya a compilar el proyecto. Si tiene metido en la caja de herramientas un control que no necesita, lo introducirá en los discos de distribución igual que si lo necesitara.



COMMAND BUTTONBOTON DE COMANDO



El Command Button es un objeto que sirve para introducir datos a través de la pantalla. El Botón de Comando tiene la siguiente forma:





El botón de comando puede usarse para la entrada de datos con el ratón, o para validar cualquier operación. El tamaño puede cambiarse a voluntad, pero la forma siempre es rectangular. En la figura anterior vemos dos botones de comando, uno de ellos (el Command2) marcado con unos puntos en su contorno. Estos puntos nos permiten variar su tamaño en tiempo de diseño. También puede cambiarse su tamaño y posición en tiempo de ejecución.



(Las propiedades marcadas con (*) no varían de la descripción general, hecha al final del capítulo)



PROPIEDADES



NameNombre(*)



CaptionTítulo(*)

Es el texto que aparece en el botón. Puede cambiarse en tiempo de ejecución. No tiene otra función dentro del programa.



AppearanceApariencia(*)



BackcolorColor de fondo(*)

Esta propiedad permite cambiar el color del botón cuando la propiedad Style está puesta a Graphycal. Si la propiedad Style esta puesta a Standars, esta propiedad solamente controla el color de un pequeño cuadrado que aparece rodeando el título. Puede cambiarse en tiempo de ejecución.



Cancel

Establece un valor que indica si un botón de comando es el botón Cancelar de un formulario. Es una propiedad booleana, y admite los valores True o False. Puede utilizar la propiedad Cancel para dar al usuario la opción de cancelar los cambios que no se han hecho efectivos y devolver el formulario a su estado anterior. En un formulario sólo puede haber un botón de comando con la propiedad Cancel = True.



Causes Validation



Esta propiedad habilita o deshabilita la ejecución del evento Validate del control que tenía el foco antes de cambiar el foco a este control. El evento Validate de un control se ejecuta inmediatamente antes de que pierda el foco. (Se dice que un control tiene el foco cuando es ese control el que está activado). Al hacer click sobre el botón de comando, siempre habrá algún control que pierda el foco para que lo tome el botón de comando. Si el botón de comando tiene la propiedad Causes Validation a True, se ejecutará el evento validate de ese control que acaba de perder el foco. Si está a false, no se ejecutará. Observe que esta propiedad afecta a un control diferente del que ostenta la propiedad.



Default

Establece un valor que determina el control CommandButton que es el botón de comando predeterminado de un formulario. Sólo un botón de comando de un formulario puede ser el botón de comando predeterminado. Cuando Default se define a True para un botón de comando, se define automáticamente a False para el resto de los botones de comando del formulario. Cuando la propiedad Default del botón de comando está establecida a True y su formulario primario está activo, el usuario puede elegir el botón de comando (invocando su evento Click) presionando ENTRAR. Cualquier otro control que tuviera el enfoque no recibe evento de teclado (KeyDown, KeyPress o KeyUp) de la tecla ENTRAR a menos que el usuario haya movido el enfoque a otro botón de comando del mismo formulario. En este caso, al presionar ENTRAR se elige el botón de comando que tiene el enfoque en lugar del botón de comando predeterminado.



DisabledPicture, DownPictureEstas propiedades solamente están disponibles cuando se pone la propiedad Style a Graphycal. Permiten poner un icono diferente para el estado de deshabilitación del botón (Cuando está la propiedad Enabled = False) o cuando el botón está pulsado respectivamente. Juntamente con la propiedad Picture permite hacer un juego de imágenes sobre el botón que varían de acuerdo a su estado o posición.



DragIconIcono en la operación de arrastre(*)



DragModeModo de iniciar el Drag & Drop(*)



EnabledHabilitado (*)



FontFuente(*)



HeightAltura(*)



HelpContextIDNúmero de Contexto para la Ayuda(*)



IndexIndice(*)



LeftPosición de su parte izquierda. (*)



MaskColorEstablece cual es el color de la imagen del botón que actuará como máscara para producir zonas transparentes. Para ello, la propiedad UseMaskColor debe estar a true. (¡)



MouseIconIcono para el puntero del ratón(*)



MousePointerPuntero ratón(*)



Picture. Solamente está disponible cuando la propiedad Style está puesta a Graphical. Pone un icono sobre el botón.



Style Define el estilo del botón, aceptando dos valores: Graphycal y Standard. Poniendo esta propiedad a Graphycal podemos cambiar el color del botón 8con la propiedad Backcolor) e incluso introducir un fráfico (en la propiedad Picture, DownPicture o DisabledPicture.



UseMaskColorDetermina si el color asignado en la propiedad MaskColor se usa como máscara para crear zonas transparentes. No he sido capaz de sacar partido a esta propiedad.





TabIndexNº de orden para tabulador(*)



TabStopSale del control de la tecla TAB(*)



TagValor auxiliar(*)



ToolTipTextEtiqueta de información (W95)(*)



Top Posición de la parte superior(*)



VisibleVisible(*)



WhatsThisHelpID(Propiedad, Windows 95)(*)



Width Ancho(*)





PROCEDIMIENTOS DEL BOTON DE COMANDO



ClickDragDropDragOverGotFocus

KeyDownKeyPressKeyUpLostFocus

MouseDownMouseMoveMouseUp



¡ El botón de Comando no tiene el procedimiento DbClick !













LABEL ETIQUETA





Una etiqueta es un control que nos permite presentar un texto. La etiqueta debe usarse en aquellos casos en los que exista una información estática o dinámica que no deba ser cambiada por el operador.



Puede adoptar estas formas: con borde tridimensional, borde plano o sin borde, y el texto justificado a la izquierda, a la derecha o centrado.







Se ha incluido la trama para poder observar los límites de la etiqueta sin borde.





PROPIEDADES



AlignmentJustificación



Establece si el texto se justifica a la izquierda, a la derecha, o se centra sobre la etiqueta.



AppearanceAparienciaPlana o tridimensional. (*)



AutosizeSi está a True, el tamaño de la etiqueta se ajusta al tamaño del texto de su propiedad Caption



BackcolorColor de fondo(*)



BackStyleTipo de fondoOpaco o transparente.



Cuando se selecciona transparente, se ve solamente el texto de la etiqueta, dejando ver como fondo entre las letras, el color o Picture del formulario. Cuando se selecciona opaco, este texto se vé sobre un fondo gris.



BorderStyleTipo de borde



Sin borde o con borde. En caso de haber elegido en la propiedad Appearance el modo tridimensional, y eligiendo con borde en esta propiedad, el aspecto adopta una forma como incrustada en el formulario.



CaptionTítulo(*)



DataSource DataField



Establecen el control data asociado y el campo de la base de datos que se presentará en la propiedad Caption. Estas propiedades permiten presentar los datos de una Base de Datos mediante un procedimiento muy sencillo, con la ayuda de un control Data (Se verá mas adelante)



DragIconDragModeEnabledFontForeColorHeight

IndexLeft(*)



LinkItem LinkMode LinkTimeout LinkTopic



Estas propiedades establecen la forma en que debe llevarse a cabo una conexión DDE con otra aplicación. Se verán con mas detalle al estudiar los enlaces DDE



MouseIconMousePointerNameTabIndexTagToolTipText

Top (*)



UseMneumonic



Es una propiedad Booleana. Devuelve o establece un valor que indica si al incluir el signo (&) en el texto de la propiedad Caption del control Label se define una tecla de acceso.



Los valores que puede tomar son True o False.



True(Predeterminado) Los caracteres (&) que aparezcan en el texto de la propiedad Caption definen al carácter siguiente como tecla de acceso. El signo (&) no aparece en el Caption del control Label.

FalseLos caracteres (&) que aparezcan en el texto de la propiedad Caption aparecen como tales en el Caption del control Label.



En tiempo de ejecución, al presionar ALT+ la tecla de acceso definida en la propiedad Caption del control Label, el enfoque se desplaza al control siguiente al control Label en el orden de tabulación.



VisibleWhatsThisHelpIDWidth (*)



WordWrap



Devuelve o establece un valor que indica si un control Label con el valor True en su propiedad AutoSize se expande vertical u horizontalmente para adaptarse al texto especificado en su propiedad Caption. Es una propiedad Booleana.



True El control Label se expande o contrae horizontal y verticalmente para adaptarse al texto y al tamaño de la fuente. Contempla para la expansión horizontal la colocación de los espacios del texto.

False(Predeterminado) El texto no se ajusta a la siguiente línea; el control Label se expande o contrae horizontalmente para adaptarse a la longitud del texto y verticalmente para adaptarse al tamaño de la fuente y al número de líneas.



Nota Si se establece False en AutoSize, el texto siempre se ajustará a la línea siguiente, independientemente del tamaño del control Label y del valor de la propiedad WordWrap. Esto puede ocultar parte del texto, ya que el control Label no se expande en ninguna dirección.





PROCEDIMIENTOS DEL LABEL



ClickChangeDbClickDragDrop

DragOverLinkCloseLinkErrorLinkNotify







TEXT BOX CAJA DE TEXTO





Las cajas de texto son los controles en los que Visual Basic presenta o introduce textos. Es por tanto un control bidireccional. Normalmente se usan para introdución de textos, o para la presentación de aquellos que el operador pueda cambiar. Para cambiar o escribir un texto en una caja de texto, basta con conseguir que esa caja de texto tenga el foco y teclear el texto en el teclado. Esto se puede lograr, bien haciendo click con el ratón en esa caja de texto, bien con la tecla TAB, bien por programa.



La caja de texto no se debe usar nunca para presentar textos que el operador de la aplicación no deba cambiar. Úsese para ello la etiqueta, control no bidireccional, que además tiene la ventaja de ocupar menos memoria de programa.



Las cajas de texto pueden tener una o varias líneas, según esté la propiedad Multiline. La capacidad máxima de una caja de textos es de 64 Kbytes.



La forma de una caja de texto es la siguiente, dependiendo de las propiedades BorderStyle y Appearance:











PROPIEDADES



AlignmentJustificación



Establece si el texto se justifica a la izquierda, a la derecha, o se centra sobre la etiqueta. Esta propiedad solamente tiene efecto cuando la propiedad Multiline está a True, ignorándose en caso contrario. Es decir, permite colocar el texto justificado a la derecha cuando ese texto puede ser de varias líneas. Si la propiedad Multiline está a False, se justifica siempre a la izquierda.

Esta propiedad no puede cambiarse en tiempo de ejecución, pero sí puede leerse en que condición está.



AppearanceBackcolor(*)







BorderStyleTipo de borde



Sin borde o con borde. En caso de haber elegido en la propiedad Appearance el modo tridimensional, y eligiendo con borde en esta propiedad, el aspecto adopta una forma como incrustada en el formulario.



DataField Nombre de un Campo

DataSource Nombre de un control Data

Establecen el control Data y el campo donde está el texto que se llevará a la propiedad Text. Estas propiedades permiten presentar de una forma muy sencilla datos de una Base de Datos. Se verán cuando se estudie el control Data y el motor de bases de datos



DragIconDragMode(*)



EnabledHabilitado

Propiedad Booleana que habilita o deshabilita la etiqueta Cuando está deshabilitado (Enabled = False), no tienen efecto los eventos que se produzcan sobre el TextBox. No se puede escribir el él ni pasarle el foco, pero sí se le puede cambiar el texto mediante el programa. Puede ser una buena alternativa para impedir que el usuario pueda cambiar un determinado texto. Esta propiedad puede variarse en tiempo de ejecución.



FontForeColorHeightHelpContextIDIndexLeft (*)



LinkItem LinkMode LinkTimeout LinkTopic

Estas propiedades establecen la forma en que debe llevarse a cabo una conexión DDE con otra aplicación. Se verán con mas detalle al estudiar los enlaces DDE



Locked

Establece si el texto se puede editar, es decir, cambiar. Cuando se pone esta propiedad a True, el texto existente en la caja puede resaltarse con el ratón, e incluso copiarlo al portapapeles, pero no puede variarse tecleando un nuevo texto. Se puede cambiar por programa, cambiando la propiedad Text.

Si está en False, puede cambiarse el texto mediante teclado.



MaxLenght

Indica, si se establece, la longitud máxima del texto. Si no se establece o si se pone valor 0, permite cualquier longitud de texto.



MouseIconPuntero del ratón personalizado(*)

MousePointerPuntero ratón

Lo típico para esta propiedad es el I-Beam (barra vertical)



NameNombre(*)



PasswordChar

En ocasiones, es conveniente que no se pueda leer lo que se escribe en la caja de texto, caso por ejemplo de la entrada de un password o palabra de paso. Esta propiedad nos permite indicar un carácter que sustituye a cualquier carácter que tenga la caja de texto. (Típicos el * o ?). El texto que tenga en la propiedad Text no cambia por el hecho de presentar en pantalla un carácter distinto. Esta propiedad puede cambiarse en tiempo de ejecución. Para quitar el PasswordChar basta con forzarlo al carácter nulo : Text1.PasswordChar = “”



La propiedad PasswordChar se ignora cuando la propiedad Multiline está a True.



ScrollBars

Cuando la propiedad Multiline de la caja de texto está a True, se pueden colocar barras de desplazamiento del texto hacia arriba y abajo, o hacia los lados. Esto nos permite tener una caja de texto de tamaño reducido y poder leer en ella un texto mayor que la propia caja. Esta propiedad puede tomar los siguiente valores :



0 - No salen barras

1 - Barras de desplazamiento horizontal

2 - Barras de desplazamiento vertical

3 - Ambas barras.



TabIndexTag (*)



TextTexto

La caja de texto no tiene la propiedad Caption. Su equivalente es la propiedad Text que es el texto que tiene en su interior.



Top VisibleWhatsThisHelpIDWidth (*)



PROCEDIMIENTOS DE LA CAJA DE TEXTO



ClickChangeDblClickDragDropDragOverGotFocus

KeyDownKeyPressKeyUpLinkClose







FRAME RECUADRO



Se obtiene directamente de la caja de herramientas







Tiene la siguiente forma :







Un control Frame proporciona un agrupamiento identificable para controles. También puede utilizar un Frame para subdividir un formulario funcionalmente por ejemplo, para separar grupos de controles OptionButton.



Para agrupar controles, en primer lugar trace el control Frame y, a continuación, meta los controles dentro de Frame. De este modo podrá mover al mismo tiempo el Frame y los controles que contiene. Si traza un control fuera del Frame y, a continuación, intenta moverlo dentro de éste, el control se colocará sobre el Frame, pero no pertenecerá a el. Es decir, si es un OptionButton este se comportará como si estuviese fuera del Frame, aunque físicamente esté dentro de el.



Cuando un control Frame tiene dentro otros controles, y hacemos invisible al Frame, mediante su propiedad Visible = False, los controles interiores al Frame quedan también invisibles. Los controles Frame se utilizan para poner dentro de ellos diversos controles, que solo aparecerán en el programa cuando se cumpla una determinada condición. Cuando esa condición se cumpla, se pone la propiedad Visible del Frame a True y se verán todos los controles que tiene dentro. Si no se cumple esa condición, se pone la propiedad Visible del Frame a False y no se verá ni el Frame, ni los controles que contiene.



PROPIEDADES

Las señaladas con (*) no presentan novedades respecto a las ya comentadas para los controles precedentes.



AppearanceBackcolorCaption(*).



ClipControls

Si esta propiedad está a True, los métodos gráficos en eventos Paint vuelven a dibujar el objeto entero. Antes del evento Paint se crea una zona de recorte alrededor de los controles no gráficos del formulario. Si esta propiedad está a False dibujarán solamente las áreas últimamente expuestas. En tiempo de ejecución, esta propiedad es de sólo lectura.



DragIconDragMode(*)



Enabled

Cuando esta propiedad está a False, tanto los procedimientos asociados al propio control Frame como todos los controles dentro del Frame estarán inhabilitados. Si esta propiedad está a True, todos ellos están habilitados.



Font(*)

ForeColor

Color de las letras del título del Frame.



HeightHelpContextIDIndexLeftMouseIconMousePointer

NameTabIndexTagTop(*)



Visible

Cuando un Frame está con la propiedad Visible = False, tanto el propio Frame como todos los controles interiores a el serán invisibles.



WhatsThisHelpIDWidth(*)



PROCEDIMIENTOS DEL FRAME



ClickDblClickDragDropDragOverMouseDown

MouseMoveMouseUp



CHECK BUTTON Y OPTION BUTTON (BOTONES DE ELECCION Y OPCION)



Se obtienen directamente de la caja de herramientas.





Dada la similitud de ambos controles, se comentan conjuntamente.



El control CheckBox, o casilla de verificación, permite elegir una opción (activada/desactivada, True/False) que el usuario puede establecer o anular haciendo click. Una X en una casilla de verificación indica que está seleccionada, activada, o con valor True. Cada casilla de verificación es independiente de las demás que puedan existir en el formulario, pudiendo tomar cada una de ellas el valor True o False, a voluntad del operador.



Un control OptionButton muestra una opción que se puede activar o desactivar, pero con dependencia del estado de otros controles OptionButton que existan en el formulario.



Generalmente, los controles OptionButton se utilizan en un grupo de opciones para mostrar opciones de las cuales el usuario sólo puede seleccionar una. Los controles OptionButton se agrupan dibujándolos dentro de un contenedor como un control Frame, un control PictureBox o un formulario. Para agrupar controles OptionButton en un Frame o PictureBox, dibuje en primer lugar el Frame o PictureBox y, a continuación, dibuje dentro los controles OptionButton. Todos los controles OptionButton que están dentro del mismo contenedor actúan como un solo grupo, e independientes de los controles OptionButton de otros grupos distintos.

Aunque puede parecer que los controles OptionButton y CheckBox funcionan de forma similar, hay una diferencia importante: Cuando un usuario selecciona un OptionButton, los otros controles del mismo grupo OptionButton dejan de estas disponibles automáticamente. Por contraste, se puede seleccionar cualquier número de controles CheckBox.









En el ejemplo de la figura, existen tres grupos de OptionButton, uno en un PictureBox, que actúa, al tiempo que como cuadro de imagen, como contenedor de controles OptionButton. Otro grupo está en el interior de un control Frame, y el otro grupo está en el formulario. Los tres grupos son independientes entre sí, pero interiormente al grupo solamente puede seleccionarse uno de los OptionButton que lo componen.



En el formulario también existen tres CheckBox, que como puede verse, se pueden seleccionar los que se desee, sin ningún tipo de exclusión entre ellos.





PROPIEDADES



Las señaladas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes.



AlignmentComún a ambos controles.



Admite los siguientes valores :



0 - Left Justify

1 - Right Justify



Cuando se elige el valor 0, justificado a la izquierda, el título del control aparece a la derecha del botón, pegado a la figura del botón. Cuando se elige el valor 1, justificado a la derecha, el título (Caption) aparece a la izquierda del botón, comenzando en la parte izquierda del cuerpo total del control, es decir, no tiene porqué aparecer con su parte derecha pegado al botón, caso que el cuerpo total del control se haya hecho mas largo que la palabra del título.



AppearanceBackcolorCaption(*).



DataField DataSourcePropiedades del CheckBox solamente.

Establecen el control Data asociado y el campo donde están los datos (True / False) que se llevarán a la propiedad Value . Al igual que en los controles Label y TextBox esta propiedad nos permite visualizar datos de una base de datos de una forma muy sencilla. En este caso, el CheckBox solamente permite presentar (logicamente) datos de tipo Booleano.



DragIconDragModeEnabledFontForeColor(*)



HeightComún a ambos controles.

La altura del control solamente afecta a la colocación del Titulo (Puede ponerse un título largo en varias líneas), no al tamaño del botón, que es invariable.



HelpContextIDIndexLeftMouseIconMousePointerName

TabIndexTabStopTagTop(*)



ValueComún a ambos controles

El valor de esta propiedad indica si el control está seleccionado (Value = 1) o no seleccionado (Value = 0 ó Value = False). Esta propiedad puede cambiarse en tiempo de ejecución. Mediante esta propiedad, podemos tanto forzar el valor como leerlo.



Atención. Presenta una diferencia entre uno y otro control respecto a la forma de expresarse respecto a su valor cuando está seleccionado. Para forzar que el control NO esté seleccionado, o para leer el Value cuando no está seleccionado, podemos utilizar tanto Value = 0 como Value = False. Sin embargo, cuando lo que se quiere es poner la propiedad a True hay una diferencia entre ambos controles.

Para el OptionButton podemos utilizar indistintamente las siguiente formas :



Option1.Value = TrueOption1.Value = 1



Con cualquiera de ellas seleccionaremos ese control por programa.

Para el CheckBox solamente se podrá usar para este propósito la instrucción :



Check1.value = 1



El poner como Value el valor True nos dará en este control un error.



Para la lectura del Value, existe una diferencia entre el valor devuelto por el CheckBox y el devuelto por el OptionButton.



Para leer el dato existente en un CheckBox es necesario utilizar la forma :



variable = Check1.Value donde variable tomará el valor 1 (no True)



Para el control OptionButton emplearemos una instrucción igual :



variable = Option1.Value donde variable tomará el valor True (no 1)



VisibleWhatsThisHelpIDWidth(*)



PROCEDIMIENTOS





ClickDblClick (Solo OptionButton)DragDropDragOverGotFocus

KeyDown KeyPress KeyUpLostFocus







LIST BOX Y COMBO BOX



Estos dos controles, debido a su similitud, se estudian conjuntamente.



Se obtienen directamente de la caja de herramientas :







Un control ListBox muestra una lista de elementos en la que el usuario puede seleccionar uno o más. Si el número de elementos supera el número que puede mostrarse, se agregará automáticamente una barra de desplazamiento al control ListBox.



Un control ComboBox combina las características de un control TextBox y un control ListBox. Los usuarios pueden introducir información en la parte del cuadro de texto y seleccionar un elemento en la parte de cuadro de lista del control. En resumen, un ComboBox es la combinación de un ListBox, que se comporta como si de un ListBox se tratase, y de un TextBox, con comportamiento análogo a un TextBox sencillo, con la particularidad aquí de que el texto se le puede introducir por teclado, o elegir uno de los que figuran en la parte ListBox del Combo.



Estos controles toman la siguiente forma :









Puede verse en la figura un ejemplo de presentación de un ListBox (izquierda), un ComboBox con la lista desplegada (Centro) y un ComboBox con la lista sin desplegar (Combo2 a la derecha).



La lista tiene varios elementos. Cada línea de esta lísta es un elemento de la lista. Como el número de elementos de la lista tiene mas elementos de los que le podían caber, generó automáticamente la barra de desplazamiento vertical.



El ComboBox está normalmente sin desplegar. Se despliega cuando se hace click con el ratón en la flecha que tiene en su parte derecha (véase fig. Anterior). Al desplegarse, muestra la lista con todos sus elementos. Haciendo click con el ratón en cualquiera de sus elementos, el elemento elegido pasa a la parte TextBox del Combo y la lista vuelve a replegar.



El ListBox (y por tanto el ComboBox) tiene unas propiedades y métodos particulares que solamente se pueden aplicar durante el tiempo de ejecución :



Propiedades

ListCount - Indica el número de elementos que tiene la lista

ListIndex - Indica el número de orden del elemento seleccionado dentro de la lista.

Text - Obtiene el elemento seleccionado.

List (n) - Obtiene el elemento cuyo orden dentro de la lista es n.

Métodos

AddItem - Añade un elemento a la lista.

RemoveItem - Elimina un elemento de la lista.

Clear – Borra todos los elementos de la lista



ListCount valdrá 0 si la lista no tiene ningún elemento, y n si tiene n elementos.



Para seleccionar un elemento de la lista, basta con hacer click con el ratón sobre él. Ese elemento se resaltará con fondo en azul. Una vez seleccionado un elemento, la propiedad ListIndex tomará el valor del número de orden que ocupa ese elemento en la lista, comenzando por el 0 para el elemento que ocupa el primer lugar. Si no se selecciona ningún elemento, el valor de la propiedad ListIndex será -1. El primer elemento de la lista es ListIndex 0, y el valor de la propiedad ListCount siempre es uno más que el valor mayor de ListIndex.



En el ComboBox la propiedad Text contiene el texto que contenga la parte TextBox del Combo, bien haya sido introducida desde teclado o mediante la recuperación de un elemento la parte ListBox del mismo.





Ejemplos



Supongamos que tenemos un ListBox llamado List1, y un ComboBox llamado Combo1. Se enumeran distintas formas de obtener información de ellos.



Variable = List1.Listcount

Variable contendrá un número con el número total de elementos de la lista List1.



Variable = List1.ListIndex

Variable contendrá un número con el número de orden del elemento de la lista seleccionado en ese momento.



List1.AddItem “ELEMENTO NUEVO”

Añade un elemento a List1. En este caso, el elemento añadido es la palabra ELEMENTO NUEVO.



Variable = “VISUALBASIC”

List1.AddItem Variable

Añade un elemento a List1. En este caso, el elemento añadido es la palabra VISUALBASIC.



Variable = List1.Text

Variable contendrá el elemento que estaba seleccionado en List1. (Variable será una cadena de caracteres)



Variable = List1.List (n)

Variable contendrá el elemento que ocupa el número de orden n dentro de la lista.



Variable = List1.List (List1.ListIndex)

Variable contendrá el elemento que estaba seleccionado en List1. Se ha utilizado la propiedad List para obtener el elemento, y en vez de introducir un número para definir el elemento que se desea, se introdujo el valor ListIndex de List1, que es concretamente, el número de orden del elemento seleccionado en ese momento. Observe que poner List1.List (List1.ListIndex) es idéntico a poner List1.Text.



List1.RemoveItem (n)

Elimina el elemento n de List1.



List1.RemoveItem (List1.ListIndex)

Elimina el elemento que estaba seleccionado en ese momento.



List1.listIndex = n

Selecciona el elemento n de List1 (Se resalta en azul el elemento n)



PROPIEDADES DE ListBox y de ComboBox



Las señaladas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes.



AppearanceBackcolor(*)



ColumnsPropiedad de ListBox solamente.



Determina si los elementos se presentan en una sola columna o en varias columnas, y la forma de presentar los elementos en el ListBox. Si esta propiedad se pone a 0 la lista tendrá solamente una columna, y presentará los elementos uno debajo de otro. Cuando los elementos sean mas que los que se pueden presentar en la lista, aparecen automáticamente unas barras de desplazamiento vertical.

Si la propiedad se pone a un número distinto a 0, el ListBox es de tipo multicolumna, presentará en cada columna los elementos que le quepan dependiendo de su dimensión vertical, y tendrá tantas columnas como sea necesario para albergar el número de elementos que tenga. Presentará en su cuadro tantas columnas como se le indique en el valor de esta propiedad, y si no puede presentar todos los elementos en las columnas que muestra, le aparecerán barras de desplazamiento horizontales para poder movernos por todas las columnas que tenga.

Recuerde : El número que se le asigna a la propiedad Columns no indica el número de columnas que tendrá el ListBox sino el número de columnas que presenta.



Esta propiedad puede asignarse en diseño, mediante la caja de propiedades, o en tiempo de ejecución mediante una instrucción como esta :



Nombrelista.Columns = número

.

Esta propiedad no puede definirse a 0 o cambiada desde 0 en tiempo de ejecuciones decir, no se puede convertir en tiempo de ejecución un ListBox de múltiples columnas en un ListBox de columna única o un ListBox de columna única en un ListBox de múltiples columnas. Sin embargo, sí es posible cambiar durante la ejecución el número de columnas de un ListBox de múltiples columnas.



DataField DataSource.

Establecen el control Data asociado y el campo donde están los datos que se llevarán al TextBox o ComboBox para presentar datos procedentes de una Base de Datos.



DragIconDragModeEnabledFontForeColorHeight HelpContextIDIndex(*)

ItemDataPropiedad muy importante.



Devuelve o establece un número específico para cada elemento de un control ComboBox o ListBox.



SintaxisNombreDeLaLista.ItemData(índice) [= número]





NombreDeLaListaNombre del ListBox o ComboBox.

índiceEl número de un elemento concreto del objeto.

númeroEl número que se asocia con el elemento especificado.



La propiedad ItemData es una matriz de valores enteros largos cuyo número de elementos es el valor de la propiedad ListCount del control. Los números asociados con cada elemento se pueden usar para cualquier fin. Por ejemplo, se puede usar en la confección de una lista de teléfonos, el número de identificación de un empleado, etc. Cuando se rellena el ListBox, también se rellena los elementos correspondientes de la matriz ItemData con los números correspondientes.

La propiedad ItemData se usa a menudo como índice de una matriz de estructuras de datos asociados con los elementos de un control ListBox.



Nota Cuando se inserta un elemento en una lista con el método AddItem, el elemento también se inserta automáticamente en la matriz ItemData. Sin embargo, el valor no se reinicializa a cero; retiene el valor que estaba en esa posición antes agregar el elemento a la lista. Cuando se usa la propiedad ItemData, asegúrese de establecer su valor al agregar nuevos elementos a la lista.



Left(*)



ListEs el contenido de la lista.

Si la lista de elementos es corta e invariable, pueden introducirse los elementos en el cuadro de propiedades durante el diseño.



MouseIconMousePointerName(*)



Sorted



Establece o devuelve un valor que indica si los elementos de un ListBox o ComboBox se colocan automáticamente en orden alfabético. Los valores que puede adoptar son True o False.



TrueLos elementos de la lista se ordenan alfabéticamente (sin distinguir entre mayúsculas y minúsculas).

False(Predeterminado) Los elementos de la lista no se ordenan alfabéticamente.



Cuando esta propiedad tiene el valor True, Visual Basic se encarga de casi todo el procesamiento de cadenas necesario para mantener el orden alfabético, incluyendo el cambio de los números de índice cuando se agregan o eliminan elementos.



Nota El uso del método AddItem para agregar un elemento en una posición específica de la lista puede romper el orden alfabético, y los elementos agregados con posterioridad pueden no ordenarse correctamente.



TabIndexTabStopTagTopVisible WhatsThisHelpID Width (*)





PROCEDIMIENTOS





ClickChange (Solo ComboBox)DblClickDragDropDragOver

DropDown (Solo ComboBox)GotFocus KeyDown KeyPress

KeyUpLostFocusMouseDown (Solo ListBox)MouseMove (Solo ListBox)

MouseUp (Solo ListBox)



NOTA MUY IMPORTANTE



El procedimiento Change del ComboBox solamente se efectúa cuando el cambio se produce mediante la entrada de un texto DESDE EL TECLADO, no por un cambio en la parte Text de este control, producido al llevar un elemento desde la parte List a la parte Text.





CONTROLES HScrollBar y VScrollBar



Son dos controles similares, para introducir un dato cuasi-analógico en una aplicación. Se toman directamente de la caja de herramientas, y tienen un aspecto parecido al de un control de volumen de un equipo de música. El HScrollBar está en posición horizontal, y el VScrollBar en posición vertical.







Mediante estos controles se pueden introducir datos variando la posición del cursor.



PROPIEDADES de HScrollBar y VScrollBar



Las señaladas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes.





DragIconDragModeEnabledHeightHelpContextID Index (*)



LargeChange

Esta propiedad establece la variación de la propiedad Value cada vez que se hace click en el interior de la barra de desplazamiento, en la parte por donde pasa el cursor.



Left(*)



Max

Esta propiedad establece el valor máximo para la propiedad Value, es decir, el valor de esta propiedad cuando el cursor está en su parte máxima. (Recuerde que el cursor está en el máximo, cuando está mas a la derecha, caso del HScrollBar, o cuando está en la parte mas baja, caso del HScrollBar.



Min

Esta propiedad establece el valor mínimo para la propiedad Value, es decir, el valor de esta propiedad cuando el cursor está en su parte mínima. (Recuerde que el cursor está en el mínimo, cuando está mas a la izquierda, caso del HScrollBar, o cuando está en la parte mas alta, caso del HScrollBar.



MouseIconMousePointerName(*)



SmallChange

Esta propiedad establece la variación de la propiedad Value cada vez que se hace click en las flechas superior o inferior de la barra de desplazamiento.



TabIndexTabStopTagTop(*)



Value

Esta propiedad lee o establece el valor dado por la posición del cursor. Este valor tiene un mínimo, establecido por Min y un máximo, establecido por Max. Esta propiedad es la que se debe leer para conocer la posición del cursor.



VisibleWhatsThisHelpIDWidth(*)





PROCEDIMIENTOS DE HScrollBar y VScrollBar



ChangeDragDropDragOverGotFocusKeyDownKeyPress

KeyUpLostFocusScroll



ComentarioEl Procedimiento Change se produce cuando, tras mover el cursor, se suelta el botón del ratón. Esto produce el efecto de que el cambio que se tenga que producir con el movimiento del cursor no se realiza de una manera continua. El procedimiento Scroll se realiza en el instante que se está moviendo el cursor. Por lo tanto, es este procedimiento el que se debe usar para conseguir el efecto de un cambio continuo mientras se está moviendo el cursor.





TIMER TEMPORIZADOR



Este objeto permite establecer temporizaciones. Presenta una novedad respecto a los controles estudiados hasta ahora. El control Timer solamente se ve durante el tiempo de diseño. En tiempo de ejecución, el control permanece invisible.



La temporización producida por el Timer es independiente de la velocidad de trabajo del ordenador. (Casi independiente. El timer no es un reloj exacto, pero se le parece)



Se toma directamente de la caja de herramientas, y tiene el aspecto siguiente :







PROPIEDADES



EnabledIndex(*)



Interval

El valor de esta propiedad nos dará el intervalo de tiempo (en milisegundos) en que se producirá un evento Timer y consecuentemente, realizará el procedimiento asociado a este evento. Si el valor de la propiedad Interval está a 0 (Predeterminado), no se produce el evento Timer. (El control Timer está deshabilitado cuando la propiedad Interval = 0)



LeftNameTagTop(*)





PROCEDIMIENTOS



Timer



Se produce cada vez que se cumple un intervalo completo.





CONTROL SHAPE



Se toma directamente de la caja de herramientas :









Shape es un control gráfico que se muestra como un rectángulo, un cuadrado, una elipse, un círculo, un rectángulo redondeado o un cuadrado redondeado.



Un control Shape no actúa como contenedor de controles. (Esto quiere decir que un control Shape nunca le servirá, por ejemplo, para albergar varios OptionButton y pretender que sean independientes de otros controles OptionButton que se encuentren fuera del control Shape.



Este control no tiene Procedimientos. En realidad, solamente sirve para mostrar un determinado gráfico, envolver gráficamente a otros controles, pero no tiene ninguna aplicación en cuanto a programa. Es un “adorno” para sus aplicaciones.



PROPIEDADES



Backcolor(*)



BackStyle

Esta propiedad establece si Shape permite ver a su través (Transparent) o n lo permite (Opaque)



BorderColor

Establece el color del borde.



BorderStyle

Establece el tipo de borde. Puede ser : Transparent, (No se ve el borde), Solid, (Borde de línea continua),Dash, (línea a rayas), Dot, (línea a puntos), Dash-Dot, (línea de raya - punto), dash-Dot-Dot, (línea de raya - punto - punto), InsideSolid, (raya continua)



El efecto de establecer la propiedad BorderStyle depende del valor de la propiedad BorderWidth. Si BorderWidth no es 1 y BorderStyle no es 0 o 6, BorderStyle se establece como 1.



BorderWidth

Establece el ancho de la línea.



DrawModeFillColorFillStyleHeightIndexLeftName(*)



Shape

Establece la forma del control. Puede ser : Rectangular, cuadrado, redondo, ovalado, cuadrado con esquinas redondeadas y rectangular con esquinas redondeadas.



TagTopVisibleWidth(*)





PROCEDIMIENTOSNo tiene.





CONTROL LINE



Se toma directamente de la caja de herramientas







Line, al igual que Shape, es un control gráfico que solamente sirve para poner una línea en un formulario. Del mismo modo, no tiene procedimientos, por lo que no sirve para aportar código al programa. Solo sirve para aportar una característica gráfica, es un adorno.



PROPIEDADES



BorderColor

Establece el color de la línea.



BorderStyle

Establece el tipo de línea : Puede ser : Transparent, (No se ve la línea), Solid, (Línea continua),Dash, (línea a rayas), Dot, (línea a puntos), Dash-Dot, (línea de raya - punto), dash-Dot-Dot, (línea de raya - punto - punto), InsideSolid, (raya continua)



BorderWidth

Establece el ancho de la línea.



DrawModeIndexLeftNameTagVisible(*)

X1, X2Y1, Y2Establece las coordenadas y del inicio y final



PROCEDIMIENTOSNo tiene.

AÑADIR CONTROLES A LA CAJA DE HERRAMIENTAS



Los controles descritos hasta ahora son parte de los que aparecen en la caja de herramientas mas elemental de Visual Basic. Estos, otros que se estudiarán en el capítulo 4 (Controles para mostrar imágenes), el control Data y el contenedor OLE que se estudiarán en la segunda parte del curso, son los que están incluidos en la caja de herramientas mas elemental. La razón es que estos controles vienen como lo más elemental de Visual Basic, como lo que es imprescindible para que funcione una aplicación realizada en VB. La pregunta es ahora, ¿qué es lo más elemental de VB?



Son tres DLLs, Visual Basic For Aplications (MSVBVM60.DLL), Visual Basic Runtime Objets And Procedures (MSVBVM60.DLL\3) y Visual Basic Objets And Procedures (VB6.OLB). Una aplicación, por muy elemental que sea, necesita esos tres ficheros. Pero posiblemente no haya ninguna aplicación práctica que se pueda realizar con esos controles. Hay más. Lo que ocurre es que hay que introducirlos en la caja de herramientas. Para ello, basta con desplegar el menú de Proyecto de la barra de menú:









Eligiendo el elemento Componentes de este menú desplegado nos muestra todos los componentes existentes en el disco, que podremos sacar a nuestra caja de herramientas para poder utilizarlos. En la siguiente figura puede ver el cuadro con los controles existentes en el PC del autor. Puede observarse que está seleccionado el control Calendar, y en la parte de abajo puede verse la ubicación y nombre del fichero que contiene ese control (MSCAL.OCX). No todos los controles son de Microsoft. Observe que hasta Kodak realiza (o le realizan) controles. Existen muchas empresas que venden controles, unas con mejor calidad que otras. En este tema debe tener especial precaución con los controles que se distribuyen de forma gratuita por Internet. No utilice nunca un control adquirido por este procedimiento si no tiene plena confianza en el origen del mismo y lo ha probado concienzudamente. Suelen fallar con bastante frecuencia y, lógicamente, no tienen ninguna garantía. Sea prudente y utilice solamente aquellos controles de firmas de reconocido prestigio, y que le puedan aportar garantía de funcionamiento. Obviamente estos controles suelen ser de pago.













Estos controles que adquiere con posterioridad a la instalación del Visual Basic hay que registrarlos. No se asuste. No se trata de registrarlos ante el fabricante para poder utilizarlos. Se trata de introducirlos en el registro de Windows. Con ello Windows conoce el CLSID de ese control, su ubicación en el disco duro (los controles suelen estar en C:\Windows\System, pero pueden estar en cualquir otra carpeta). Windows necesita registrarlos para poder encontrarlos. Para registrar un control se utiliza el programa Regsvr32.exe. Para registrar un control basta con ejecutar este programa, pasandole como parámetro el nombre y ubicación del control a registrar. Esto se hace en Inicio | Ejecutar. Por ejemplo, para registrar el conjunto de controles VB_GuiaEst.Ocx introduciríamos ese fichero Ocx en C:\Windows\System y a continuación ejecutamos:



regsvr32 c:\windows\system\ VB_GuiaEst.Ocx
Miguel M
2006-10-06 13:53:09 UTC
Depende del nivel que requieras.



Si es muy básico podés obtenerlo en

www.lawebdelprogramador.com.



En lo personal cuando necesito algo de buen nivel recurro al e-mule. Hay de todo y en todos los idiomas.
antisocial e
2006-10-06 11:14:50 UTC
www.solotutoriales.com



www.abcdatos.com/tutoriales/



son dos opciones que te puedo dar
lasiniestra22
2006-10-06 11:05:35 UTC
www.lawebdelprogramador.com alli encontraras muchisimos tutoriales manuales y aplicaciones, aparte de codigos de ejemplo


Este contenido se publicó originalmente en Y! Answers, un sitio web de preguntas y respuestas que se cerró en 2021.
Loading...