Monografias.com > Computación > Programación
Descargar Imprimir Comentar Ver trabajos relacionados

Manual de Visual Basic




Enviado por javier0730



    1. Objetivos
    2. Nombres Automáticos en
      VB
    3. Valores
    4. Resumen de tipos de
      datos
    5. Subrutinas y
      Funciones
    6. For…Next
      (Instrucción)
    7. Mejoras a
      la interfaz

     

    OBJETIVOS:

    • Facilidad para extender e interactuar con otras
      aplicaciones.
      • Llamadas al API
      • Soporte de componentes de terceros
    • Contiene Herramientas
      integradas al ambiente
      para depuración e incremento de productividad.

    Ediciones de VB

    • Aprendizaje
    • Profesional
    • Empresarial

    Edición de Aprendizaje

    • Creación de aplicaciones para Windows
      95/98/Me/NT/XP
    • Controles Intrínsecos
    • Controles Adicionales
    • Curso de "Aprenda Visual Basic
      6.0 Ya"
    • Librería de documentación en Pantalla

    Edición Profesional

    • Todo lo de la Edición de Aprendizaje,
      menos el curso de visual basic
    • Controles Adicionales
    • Generación de Controles
    • Generación de Aplicaciones para
      IIS
    • Herramientas para modelado y acceso a datos.

    Edición Empresarial

    • Todo lo de la Edición Profesional
    • Generación de Aplicaciones
      Distribuidas
      • Aplicaciones que se ejecutan en un Navegador de
        Internet.
    • Componentes del BackOffice
      • SQL Server
      • MTS (Microsoft Transaction Server)
      • IIS (Internet Information Server)
      • SNA (System Network Architecture)
      • Visual Source Safe
      • ASP (Active Server Pages)

    Ejemplo de programación en base a Eventos

    1.5.1 Nombres
    Automáticos en VB

    Prefijos

    Para ver el gráfico seleccione la
    opción ¨Descargar
    trabajo¨
    del menú superior

    Ejemplo

    lblSalir = Etiqueta con el Nombre Salir.

    MsgBox (Función)

    Muestra un mensaje en un cuadro de diálogo,
    espera a que el usuario haga clic en un botón y devuelve
    un tipo Integer correspondiente al botón elegido por el
    usuario.

    Sintaxis

    MsgBox(prompt[, buttons][, title][, helpfile,
    context])

    La sintaxis de la función MsgBox consta de
    estos argumentos con
    nombre
    :

    Para ver
    el gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Valores

    El argumento
    buttons tiene estos valores:

    Para ver
    el gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    El primer grupo de
    valores (0 a 5) describe el número y el tipo de los
    botones mostrados en el cuadro de diálogo; el segundo
    grupo (16, 32, 48, 64) describe el estilo del icono, el tercer
    grupo (0, 256, 512) determina el botón predeterminado y el
    cuarto grupo (0, 4096) determina la modalidad del cuadro de
    mensajes. Cuando se suman números para obtener el valor final
    del argumento buttons, se utiliza solamente un número de
    cada grupo.

    Nota   Estas constantes
    las especifica Visual Basic for
    Applications. Por tanto, el nombre de las mismas puede utilizarse
    en cualquier lugar del código
    en vez de sus valores reales.

    Valores devueltos

    Para
    ver el gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Comentarios

    Cuando se proporcionan tanto helpfile como context, el
    usuario puede presionar F1 para ver el tema de Ayuda
    correspondiente al context. Algunas aplicaciones
    host
    , por ejemplo Microsoft
    Excel, también agregan automáticamente un
    botón Ayuda al cuadro de diálogo.

    Si el cuadro de diálogo cuenta con un
    botón Cancelar, presionar la tecla ESC tendrá el
    mismo efecto que hacer clic en este botón. Si el cuadro de
    diálogo contiene un botón Ayuda, se suministra
    ayuda interactiva para ese cuadro de diálogo. Sin embargo,
    no se devuelve valor alguno hasta que se hace clic en uno de
    estos botones.

    Nota   Si desea especificar más
    que el primer argumento con nombre, debe utilizar MsgBox en
    una expresión.
    Si desea omitir algún argumento de
    posición, debe incluir el delimitador de coma
    correspondiente.

    InputBox (Función)

    Muestra un mensaje en un cuadro de diálogo,
    espera que el usuario escriba un texto o haga
    clic en un botón y devuelve un tipo String con el
    contenido del cuadro de texto.

    Sintaxis

    InputBox(prompt[, title][, default][, xpos][, ypos][,
    helpfile, context])

    La sintaxis de la función InputBox consta de
    estos argumentos con
    nombre
    :

    Para ver
    el gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Comentarios

    Cuando se especifica tanto helpfile como context, el
    usuario puede presionar F1 para ver el tema de Ayuda
    correspondiente a context. Algunas aplicaciones
    host
    , por ejemplo, Microsoft Excel,
    también agregar automáticamente un botón
    Ayuda al cuadro de diálogo. Si el usuario hace clic en
    Aceptar o presiona Entrar , la función InputBox devuelve
    lo que haya en el cuadro de texto. Si el usuario hace clic en
    Cancelar, la función devuelve una cadena de caracteres de
    longitud cero ("").

    Nota   Si desea especificar más
    que el primer argumento con nombre, debe utilizar InputBox en
    una expresión.
    Si desea omitir algunos argumentos
    de posición, debe incluir el delimitador de coma
    correspondiente.

    Descripción del alcance de las
    variables

    El alcance de una variable define qué partes del
    código son conscientes de su existencia. Cuando declara
    una variable en un procedimiento,
    sólo el código de dicho procedimiento puede tener
    acceso o modificar el valor de la variable; tiene un alcance que
    es local al procedimiento. A veces, sin embargo, se necesita usar
    una variable con un alcance más general, como aquella cuyo
    valor está disponible para todos los procedimientos
    del mismo módulo o incluso para todos los procedimientos
    de toda la aplicación. Visual Basic le permite especificar
    el alcance de una variable cuando la declara.

    Establecer el alcance de las variables

    Dependiendo de cómo se declara, una variable
    tiene como alcance un procedimiento (local) o un
    módulo.

    Para ver el gráfico seleccione la
    opción ¨Descargar trabajo¨ del menú
    superior

    Variables utilizadas en un procedimiento

    Las variables a
    nivel de procedimiento sólo se reconocen en el
    procedimiento en el que se han declarado. Se las conoce
    también como variables locales. Se declaran mediante las
    palabras clave Dim o Static. Por ejemplo:

    Dim intTemp As Integer

    –o bien–

    Static intPermanent As Integer

    Los valores de variables locales declaradas con Static
    existen mientras se ejecuta la aplicación, mientras que
    las variables declaradas con Dim sólo existen mientras se
    ejecuta el procedimiento.

    Las variables locales resultan una elección
    apropiada para cálculos temporales. Por ejemplo, puede
    crear una docena de procedimientos distintos que contengan una
    variable llamada intTemp. Como cada intTemp se ha declarado como
    una variable local, cada procedimiento sólo reconoce su
    propia versión de intTemp. Cualquier procedimiento puede
    alterar el valor de su intTemp local sin que ello afecte a las
    variables intTemp de los demás procedimientos.

    Variables utilizadas en un módulo

    De forma predeterminada, una variable a nivel de
    módulo está disponible para todos los
    procedimientos del módulo, pero no para el código
    de otros módulos. Cree variables a nivel de módulo
    declarándolas con la palabra clave Private en la
    sección Declaraciones al principio del módulo. Por
    ejemplo:

    Private intTemp As Integer

    A nivel de módulo, no hay diferencia entre
    Private y Dim, pero es preferible Private porque contrasta con
    Public y hace que el código sea más fácil de
    comprender.

    Variables utilizadas por todos los
    módulos

    Para hacer que una variable a nivel de módulo
    esté disponible para otros módulos, utilice la
    palabra clave Public para declarar la variable. Los valores de
    las variables públicas están disponibles para todos
    los procedimientos de la aplicación. Al igual que todas
    las variables a nivel de módulo, las variables
    públicas se declaran en la sección Declaraciones al
    principio del módulo. Por ejemplo:

    Public intTemp As Integer

    Nota   No puede declarar variables
    públicas en un procedimiento, sólo en la
    sección Declaraciones de un módulo.

    Para obtener más información   Para obtener
    más información acerca de las variables, vea "Temas
    avanzados sobre variables" en este capítulo.

    Dim (Instrucción)

    Declara variables y
    les asigna espacio de almacenamiento.

    Sintaxis

    Dim [WithEvents] nombre_variable[([subíndices])]
    [As [New] tipo] [, [WithEvents]
    nombre_variable[([subíndices])] [As [New] tipo]] . .
    .

    La sintaxis de la instrucción Dim consta de las
    siguientes partes:

    Para ver el
    gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Comentarios

    Las variables declaradas con Dim en el nivel de
    módulo
    están disponibles para
    todos los procedimientos disponibles sólo dentro de
    ese módulo.
    En el nivel de
    procedimiento
    , las variables sólo
    están disponibles dentro de ese procedimiento.

    Utilice la instrucción Dim en el nivel de
    módulo o de procedimiento para declarar el tipo de datos
    de una variable. Por ejemplo, la siguiente instrucción
    declara una variable como Integer.

    Dim NúmeroDeEmpleados As Integer

    También puede utilizar una instrucción Dim
    para declarar el tipo de objeto de una variable. La siguiente
    línea declara una variable para una nueva instancia de una
    hoja de
    cálculo.

    Dim X As New Worksheet

    Si no utiliza la palabra clave New al declarar una
    variable de objeto, la variable que se refiere al objeto debe
    asignarse a un objeto existente mediante la instrucción
    Set antes de su uso. Hasta que se le asigne un objeto, la
    variable de objeto declarada tiene el valor especial Nothing, el
    cual indica que no se refiere a ninguna instancia en particular
    de un objeto.

    También puede utilizar la instrucción Dim
    con paréntesis vacíos para declarar matrices
    dinámicas. Después de declarar una matriz
    dinámica, use la instrucción ReDim
    dentro de un procedimiento para definir el número de
    dimensiones y elementos de la matriz. Si intenta volver a
    declarar una dimensión para una variable de matriz cuyo
    tamaño se ha especificado explícitamente en una
    instrucción Private, Public o Dim, ocurrirá un
    error.

    Si no especifica un tipo de datos o un tipo de objeto y
    no existe ninguna instrucción Deftipo en el módulo,
    la variable predeterminada será Variant.

    Cuando se inicializan variables, una variable
    numérica se inicializa con 0, una cadena de longitud
    variable se inicializa con una cadena de longitud 0 ("") y una
    cadena de longitud fija se llena con ceros. Las variables Variant
    se inicializan con Empty. Cada
    elemento de una variable de un tipo definido por el usuario se
    inicializa como si fuera una variable distinta.

    Nota   Cuando utiliza la
    instrucción Dim en un procedimiento, generalmente pone la
    instrucción Dim al principio del mismo.

    Public (Instrucción)

    Se usa en el nivel de
    módulo
    para declarar variables
    públicas y asignarles espacio para
    almacenamiento.

    Sintaxis

    Public [WithEvents]
    nombre_variable[([subíndices])] [As [New] tipo]
    [,[WithEvents] nombre_variable[([subíndices])] [As [New]
    tipo]] . . .

    La sintaxis de la instrucción Public consta de
    las siguientes partes:

    Para ver el gráfico seleccione la
    opción ¨Descargar trabajo¨ del menú
    superior

    Comentarios

    Las variables declaradas mediante la instrucción
    Public están disponibles para todos los procedimientos en
    todos los módulos de todas las aplicaciones, a menos que
    Option Private Module esté en efecto; en este caso, las
    variables sólo son públicas dentro del
    proyecto
    en el que residen.

    Precaución   La instrucción
    Public no se puede usar en un módulo de clase para
    declarar una variable de cadena de longitud fija.

    Use la instrucción Public para declarar el tipo
    de datos de una variable. Por ejemplo, la instrucción
    siguiente declara una variable como de tipo Integer:

    Public NúmeroDeEmpleados As Integer

    Utilice también la instrucción Public para
    declarar el tipo de objeto de una variable. La instrucción
    siguiente declara una variable para una nueva instancia de una
    hoja de cálculo.

    Public X As New Worksheet

    Si no utiliza la palabra clave New al declarar una
    variable de objeto, la variable que se refiere a un objeto debe
    asignarse a un objeto existente mediante la instrucción
    Set antes de que se pueda usar. Hasta que se le asigne un objeto,
    la variable de objeto declarada tiene el valor especial Nothing,
    el cual indica que no se refiere a ninguna instancia en
    particular de un objeto.

    También puede utilizar una instrucción
    Public con paréntesis vacíos para declarar matrices
    dinámicas. Después de declarar una matriz
    dinámica, use la instrucción ReDim dentro de un
    procedimiento para definir el número de dimensiones y
    elementos de la matriz. Si intenta volver a declarar un
    dimensión para una matriz cuyo tamaño se ha
    especificado explícitamente en una instrucción
    Private, Public o Dim, ocurrirá un error.

    Si no especifica un tipo de datos o un tipo de objeto y
    no existe una instrucción Deftipo en el módulo, la
    variable es Variant de manera predeterminada.

    Cuando se inicializan las variables, una variable
    numérica se inicializa a 0, una cadena de longitud
    variable se inicializa a una cadena de longitud cero ("") y una
    cadena de longitud fija se rellena con ceros. Las variables
    Variant se inicializan a Empty. Cada
    elemento de una variable de un tipo definido por el usuario se
    inicializa como si fuera una variable distinta.

    Resumen de
    tipos de datos

    La tabla siguiente muestra
    los tipos de
    datos
    compatibles, incluyendo el tamaño
    de almacenamiento y el intervalo.

    Para ver el gráfico seleccione la opción
    ¨Descargar trabajo¨ del menú superior

    Nota   Las matrices de
    cualquier tipo de datos requieren 20 bytes de memoria
    más cuatro bytes para cada dimensión de matriz,
    más el número de bytes que ocupan los propios
    datos. Puede calcular la memoria que
    ocupan los datos multiplicando el número de elementos de
    datos por el tamaño de cada elemento. Por ejemplo, los
    datos de una matriz unidimensional que consten de cuatro
    elementos de datos tipo Integer de dos bytes cada uno, ocupan
    ocho bytes. Los ocho bytes que requieren los datos más los
    24 bytes necesarios para la matriz suman un requisito total de
    memoria de 32 bytes para dicha matriz.

    Un tipo Variant que contiene una matiz requiere 12 bytes
    más que la matriz por sí sola.

    Load (Instrucción)

    Carga en memoria un formulario o un control.

    Sintaxis

    Load objeto

    El marcador de posición objeto es el nombre de un
    objeto Form, un objeto MDIForm o un elemento de una matriz de
    controles para cargar.

    Comentarios

    No es necesario usar la instrucción Load con
    formularios a
    menos que desee cargar un formulario sin presentarlo. Cualquier
    referencia a un formulario (excepto en una instrucción Set
    o If…TypeOf) lo carga automáticamente si no está
    ya cargado. Por ejemplo, el método
    Show carga los formularios antes de presentarlos. Una vez cargado
    el formulario, la aplicación puede alterar sus propiedades
    y controles, sea o no visible actualmente el formulario. En
    algunas circunstancia, puede que desee cargar todos los
    formularios en la inicialización y presentarlos
    después cuando sean necesarios.

    Cuando Visual Basic carga un objeto Form, establece las
    propiedades del formulario a sus valores iniciales y
    después ejecuta el procedimiento de evento Load. Cuando se
    inicia una aplicación, Visual Basic carga y presenta
    automáticamente el formulario inicial de la
    aplicación.

    Si carga un objeto Form cuya propiedad
    MDIChild es True (es decir, el formulario secundario) antes de
    cargar el objeto MDIForm, el objeto MDIForm se carga
    automáticamente antes que el formulario secundario. Los
    formularios MDI
    secundarios
    no pueden estar ocultos y, por
    tanto, son visibles inmediatamente después de terminar el
    procedimiento de evento Form_Load.

    No es necesario cargar, mostrar o descargar los cuadros
    de diálogo estándar producidos por funciones de
    Visual Basic como MsgBox y InputBox; se pueden invocar
    directamente.

    Hide (Método)

    Oculta un objeto MDIForm o Form pero no lo
    descarga.

    Sintaxis

    objeto.Hide

    El marcador de posición objeto representa
    una expresión de
    objeto
    que da como resultado un objeto de la
    lista Se aplica a. Si se omite objeto, se supone que objeto es el
    formulario que tenga el enfoque.

    Comentarios

    Cuando se oculta un formulario, se quita de la pantalla
    y su propiedad Visible queda establecida a False. Los controles
    de un formulario oculto no son accesibles para el usuario, pero
    están disponibles para la aplicación de Visual
    Basic en ejecución y para otros procesos que
    se estén comunicando con la aplicación mediante
    DDE, así como para los eventos del
    control Timer.

    Cuando se oculta un formulario, el usuario no puede
    interactuar con la aplicación hasta que el código
    del procedimiento de evento que ha provocado la ocultación
    del formulario haya terminado de ejecutarse.

    Si el formulario no está cargado cuando se llama
    al método Hide, el método Hide carga el formulario
    pero no lo presenta.

    Nota   Al cerrar un formulario modal que
    se ha abierto desde otro formulario modal, el siguiente
    código funcionaba en versiones anteriores de Visual
    Basic:

    Me.Hide

    Me.Hide ' Esto ahora provoca un error.

    En versiones actuales de Visual Basic, este
    código falla en el segundo Me.Hide. Puede sustituir
    Me.Hide con Me.Visible = False como se muestra a
    continuación:

    Me.Visible = False

    Me.Visible = False ' No sucede ningún
    error.

    Unload (Instrucción)

    Descarga de memoria un formulario o un
    control.

    Sintaxis

    Unload objeto

    El marcador de posición objeto es el nombre de un
    objeto Form o de un elemento de una matriz de controles
    para descargar.

    Comentarios

    La descarga de un formulario o de un controle puede ser
    necesaria o conveniente en aquellos casos en los que la memoria
    utilizada sea necesaria para alguna otra tarea o cuando sea
    necesario restablecer las propiedades a sus valores
    originales.

    Antes de descargar un formulario se produce el evento
    Query_Unload, seguido del procedimiento de evento Form_Unload. Si
    establece el argumento cancelar a True en alguno de estos eventos
    no se descargará el formulario. En los objetos MDIForm se
    produce el procedimiento de evento Query_Unload del objeto
    MDIForm, seguido del procedimiento de evento Query_Unload y del
    procedimiento de evento Form_Unload de cada formulario
    secundario
    MDI
    ; finalmente se produce el procedimiento de
    evento Form_Unload del objeto MDIForm.

    Cuando se descarga un formulario, todos los controles
    colocados en el formulario en tiempo de
    ejecución
    no son accesibles. Los
    controles colocados en el formulario en tiempo de
    diseño
    permanecen intactos; sin embargo,
    cualquier cambio en
    tiempo de
    ejecución sobre dichos controles y sus propiedades se
    pierden cuando se vuelve a cargar el formulario. También
    se pierden todos los cambios realizados en las propiedades del
    formulario. El acceso a algún control del formulario hace
    que éste se vuelva a cargar.

    Nota   Cuando se descarga un formulario,
    sólo se descarga el componente mostrado. El código
    asociado al módulo del formulario permanece en
    memoria.

    Con la instrucción Unload sólo se pueden
    descargar los elementos de las matrices de controles agregados a
    un formulario en tiempo de ejecución. Las propiedades de
    los controles descargados se reinicializan cuando se cargan de
    nuevo los controles.

    Show (Método)

    Presenta un objeto MDIForm o Form. No acepta
    argumentos con
    nombre
    .

    Sintaxis

    objeto.Show estilo, formularioPropietario

    La sintaxis del método Show consta de las
    siguientes partes:

    Para ver el
    gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Comentarios

    Si el formulario especificado no está cargado
    cuando se invoca el método Show, Visual Basic lo carga
    automáticamente.

    Cuando Show presenta un formulario no modal,
    continúa con la ejecución del código que
    haya a continuación. Cuando Show presenta un formulario
    modal, el código que hay a continuación no se
    ejecuta hasta que el formulario se oculta o se
    descarga.

    Cuando Show presenta un formulario modal, no hay
    entradas (de teclado o del
    mouse) excepto
    sobre los objetos del formulario modal. El programa debe
    ocultar o descargar los formularios modales (normalmente como
    respuesta a alguna acción
    del usuario) antes de que pueda producirse la entrada en otro
    formulario. Los formularios MDIForm no pueden ser
    modales.

    Aunque los demás formularios de la
    aplicación están deshabilitados cuando se presenta
    un formulario modal, los de las demás aplicaciones no lo
    están.

    El formulario inicial de una aplicación se
    muestra automáticamente después de invocar su
    evento Load.

    He aquí un ejemplo de cómo se utiliza el
    argumento formularioPropietario con el método
    Show:

    Private Sub cmdShowResults_Click()

    ' Muestra un formulario modal llamado
    frmResults.

    frmResults.Show vbModal, Me

    End Sub

    SetFocus (Método)

    Mueve el enfoque al
    control o formulario especificado.

    Sintaxis

    objeto.SetFocus

    El marcador de posición objeto representa
    una expresión de
    objeto
    que da como resultado un objeto de la
    lista Se aplica a.

    Comentarios

    El objeto debe ser un objeto Form, un objeto MDIForm o
    un control que pueda recibir el enfoque. Después de
    invocar el método SetFocus, cualquier entrada del usuario
    se dirige al formulario o al control especificado.

    El enfoque sólo se puede mover a un formulario o
    un control visible. Como un formulario y los controles de un
    formulario no son visibles hasta que el evento Load del
    formulario ha terminado, no puede usar en su propio evento Load
    el método SetFocus para mover el enfoque al formulario que
    se está cargando a menos que use primero el método
    Show para mostrar el formulario antes de que el procedimiento de
    evento Form_Load haya terminado.

    Tampoco puede mover el enfoque a un formulario o un
    control si su propiedad Enabled es False. Si la propiedad Enabled
    se ha establecido a False en tiempo de
    diseño
    , primero debe establecerla a True
    antes de poder recibir el enfoque mediante el método
    SetFocus.

    método

    Una acción que un objeto es capaz de realizar.
    Por ejemplo, los cuadros de lista tienen métodos
    llamados AddItem, RemoveItem y Clear para mantener el contenido
    de las listas. Vea también objeto.

    propiedad

    Un atributo con nombre de un objeto. Las propiedades
    definen las características del objeto, como su
    tamaño y nombre, o el estado de
    un objeto, como habilitado o deshabilitado. Se pueden establecer
    propiedades para tablas, columnas, índices, restricciones,
    claves y relaciones.

    evento

    Una acción, reconocida por un objeto, para la
    cual puede escribir código de respuesta. Los eventos
    pueden estar generados por una acción del usuario, como
    hacer clic con el mouse o presionar una tecla, por código
    de programa o por el sistema, como
    ocurre con los cronómetros.

    Form (Objeto), Forms
    (Colección)

    Un objeto Form es una ventana o un cuadro de
    diálogo que forma parte de la interfaz de usuario de una
    aplicación.

    Forms es una colección
    cuyos elementos representan cada formulario cargado en una
    aplicación. La colección incluye el formulario
    MDI
    , el formulario secundario
    MDI
    y formularios no MDI de la
    aplicación. La colección Forms tiene una
    única propiedad, Count, que especifica el número de
    elementos de la colección.

    Sintaxis

    Form

    Forms(índice)

    El marcador de posición índice representa
    un entero entre 0 y Forms.Count – 1.

    Comentarios

    Puede usar la colección Forms para iterar a
    través de todos los formularios cargados en una
    aplicación. Identifica una variable global
    intrínseca denominada Forms. Puede pasar
    Forms(índice) a una función cuyo argumento se
    especifica como una clase Forms.

    Los formularios tienen propiedades que determinan
    aspectos de su apariencia (como posición, tamaño y
    color) y aspectos
    de su comportamiento
    (como si puede ajustar o no su tamaño).

    Los formularios también pueden responder a
    eventos iniciados por un usuario o desencadenados por el sistema.
    Por ejemplo, podría escribir código en el
    procedimiento de evento Click de un formulario que permitiera al
    usuario cambiar el color de un formulario haciendo clic en
    él.

    Además de propiedades y eventos, puede emplear
    métodos para manipular formularios mediante código.
    Por ejemplo, puede usar el método Move para cambiar la
    ubicación y el tamaño de un formulario.

    Un tipo especial de formulario, el formulario MDI, puede
    contener otros formularios llamados formularios secundarios MDI.
    Un formulario MDI se crea con el comando Agregar formulario MDI
    del menú Proyecto; un
    formulario secundario MDI se crea eligiendo Nuevo formulario en
    el menú Archivo y, a
    continuación, estableciendo la propiedad MDIChild a
    True.

    Puede crear múltiples instancias de formularios
    en código si utiliza la palabra clave New en instrucciones
    Dim, Set y Static.

    Al diseñar formularios, establezca la propiedad
    BorderStyle para definir el borde del formulario y establezca la
    propiedad Caption para colocar texto en la barra de
    título. En el código puede usar los métodos
    Hide y Show para hacer que los formularios sean invisibles o
    visibles en tiempo de
    ejecución
    .

    Nota   Si establece BorderStyle a 0 se
    eliminará el borde. Si desea que el formulario tenga borde
    sin barra de título, cuadro del menú Control,
    botón Maximizar y botón Minimizar, elimine texto de
    la propiedad Caption y establezca a False las propiedades
    ControlBox, MaxButton y MinButton.

    Form es un tipo de datos
    Object
    . Puede declarar variables como de tipo
    Form antes de establecerlas a una instancia de un tipo de
    formulario que se ha declarado en tiempo de
    diseño
    . Del mismo modo, puede pasar un
    argumento a un procedimiento como de tipo Form.

    Los formularios pueden actuar como origen en una
    conversación DDE, con un control Label, PictureBox o
    TextBox proporcionando los datos.

    Puede tener acceso a la colección de controles de
    un Form mediante la colección Controls. Por ejemplo, para
    ocultar todos los controles de un Form puede usar código
    similar al siguiente:

    For Each Control in Form1.Controls

    Control.Visible = False

    Next Control

    Crear tipos de datos
    propios

    Se pueden combinar variables de varios tipos diferentes
    para crear tipos definidos por el usuario (conocidos como structs
    en el lenguaje de
    programación C). Los tipos definidos por el usuario
    son útiles si se quiere crear una única variable
    que registre varias unidades de información
    relacionadas.

    Puede crear un tipo definido por el usuario con la
    instrucción Type, que debe colocar en la sección
    Declaraciones del módulo. Los tipos definidos por el
    usuario pueden declararse como Private o como Public mediante la
    palabra clave apropiada. Por ejemplo:

    Private Type MiTipoDeDatos

    –o bien–

    Public Type MiTipoDeDatos

    Por ejemplo, podría crear un tipo definido por el
    usuario que registrara información acerca del sistema de
    un equipo:

    ' Declaraciones (de un módulo
    estándar).

    Private Type SystemInfo

    CPU As Variant

    Memory As Long

    VideoColors As Integer

    Cost As Currency

    PurchaseDate As Variant

    End Type

    Declarar variables de un tipo definido por el
    usuario

    Para el mismo tipo definido por el usuario puede
    declarar variables locales, variables privadas de módulo o
    variables públicas de módulo:

    Dim MiSistema As SystemInfo, SuSistema As
    SystemInfo

    En la tabla siguiente se ilustra dónde y con
    qué alcance puede declarar los tipos definidos por el
    usuario y sus variables.

    Para ver
    el gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Nota   Si realiza declaraciones de
    variables usando la palabra clave Dim, los tipos definidos por el
    usuario en módulo de clase o estándar serán
    Public de forma predeterminada. Si quiere que un tipo definido
    por el usuario sea privado, asegúrese de declararlo usando
    la palabra clave Private.

    Asignar y recuperar valores

    Asignar y recuperar los valores de los elementos de esta
    variable es similar a establecer y obtener
    propiedades:

    MiSistema.CPU =
    "486"

    If MiSistema.PurchaseDate > #1/1/92# Then

    También puede asignar una variable a otra si
    ambas son del mismo tipo definido por el usuario. En la
    línea de código siguiente se asignan todos los
    elementos de una variable a los mismos elementos de la otra
    variable.

    SuSistema = MiSistema

    Tipos definidos por el usuario que contienen
    matrices

    Un tipo definido por el usuario puede contener una
    matriz normal (de tamaño fijo). Por ejemplo:

    Type SystemInfo

    CPU As Variant

    Memory As Long

    DiskDrives(25) As String ' Matriz de tamaño
    fijo.

    VideoColors As Integer

    Cost As Currency

    PurchaseDate As Variant

    End Type

    También puede contener una matriz
    dinámica.

    Type SystemInfo

    CPU As Variant

    Memory As Long

    DiskDrives() As String ' Matriz
    dinámica.

    VideoColors As Integer

    Cost As Currency

    PurchaseDate As Variant

    End Type

    Puede tener acceso a los valores de una matriz dentro de
    un tipo definido por el usuario de la misma manera en que tiene
    acceso a las propiedades de un objeto.

    Dim MiSistema As SystemInfo

    ReDim MiSistema.DiskDrives(3)

    MiSistema.DiskDrives(0) = "1.44 MB"

    También puede declarar una matriz de tipos
    definidos por el usuario:

    Dim TodosSistemas(100) As SystemInfo

    Siga las mismas reglas para tener acceso a los
    componentes de esta estructura de
    datos.

    TodosSistemas(5).CPU = "386SX"

    TodosSistemas(5).DiskDrives(2) = "SCSI de 100
    MB"

    Pasar tipos definidos por el usuario a
    procedimientos

    Puede pasar argumentos de procedimiento mediante un tipo
    definido por el usuario.

    Sub FillSystem (UnSistema As SystemInfo)

    UnSistema.CPU = lstCPU.Text

    UnSistema.Memory = txtMemory.Text

    UnSistema.Cost = txtCost.Text

    UnSistema.PurchaseDate = Now

    End Sub

    Nota   Si desea pasar un tipo definido
    por el usuario a un módulo de formulario, el procedimiento
    debe ser privado.

    Puede devolver tipos definidos por el usuario desde
    funciones y puede pasar una variable de un tipo definido por el
    usuario a un procedimiento como un argumento. Los tipos definidos
    por el usuario siempre se pasan por referencia, de modo que el
    procedimiento puede modificar el argumento y devolverlo al
    procedimiento que lo ha llamado, como se muestra en el ejemplo
    anterior.

    Nota   Debido a que los tipos definidos
    por el usuario siempre se pasan por referencia, todos los datos
    contenidos en dichos tipos se pasarán y se
    devolverán desde el procedimiento. En el caso de tipos
    definidos por el usuario con matrices de gran tamaño, esto
    podría originar una reducción de las prestaciones,
    especialmente en aplicaciones cliente/servidor,
    en las que el procedimiento se puede ejecutar desde un equipo
    remoto. En tal caso, es preferible extraer y pasar
    únicamente los datos necesarios del tipo definido por el
    usuario.

    Para obtener más
    información   Para obtener más
    detalles acerca del paso por referencia, vea "Pasar argumentos a
    procedimientos" en "Fundamentos de
    programación".

    Tipos definidos por el usuario que contienen
    objetos

    Los tipos definidos por el usuario también pueden
    contener objetos.

    Private Type AccountPack

    frmInput as Form

    dbPayRollAccount as Database

    End Type

    Sugerencia   Como el tipo de datos
    Variant puede almacenar muchos tipos de datos diferentes, puede
    usar una matriz Variant en muchas situaciones en las que
    usaría un tipo definido por el usuario. De hecho, una
    matriz Variant es más flexible que un tipo definido por el
    usuario, ya que puede modificar el tipo de los datos almacenados
    en cada elemento en cualquier momento y puede convertir la matriz
    en dinámica para modificar su tamaño cuando sea
    necesario. Sin embargo, una matriz Variant siempre utiliza
    más memoria que un tipo definido por el usuario
    equivalente.

    Anidar estructuras de
    datos

    El anidamiento de estructuras de datos puede ser tan
    complejo como se quiera. De hecho, los tipos definidos por el
    usuario pueden contener otros tipos definidos por el usuario,
    como se muestra en el ejemplo siguiente. Para hacer que el
    código sea más legible y fácil de depurar,
    procure escribir en un único módulo todo el
    código de los tipos de datos definidos por el
    usuario.

    Type DriveInfo

    Type As String

    Size As Long

    End Type

    Type SystemInfo

    CPU As Variant

    Memory As Long

    DiskDrives(26) As DriveInfo

    Cost As Currency

    PurchaseDate As Variant

    End Type

    Dim AllSystems(100) As SystemInfo

    AllSystems(1).DiskDrives(0).Type = "Floppy"

    UNIDAD II

    Subrutinas y
    Funciones

    Sub (Instrucción)

    Declara el nombre, los argumentos, y
    el código que componen el cuerpo de un procedimiento
    Sub.

    Sintaxis

    [Private | Public | Friend] [Static] Sub nombre
    [(lista_argumentos)]
    [instrucciones]
    [Exit Sub]
    [instrucciones]

    End Sub

    La sintaxis de la instrucción Sub consta de las
    siguientes partes:

    Para ver el
    gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    El argumento lista_argumentos consta de las siguientes
    partes y sintaxis:

    [Optional] [ByVal | ByRef] [ParamArray]
    nombre_variable[( )] [As tipo] [=
    valor_predeterminado]

    Para ver el
    gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Comentarios

    Si no se especifica explícitamente mediante
    Public, Private o Friend, los procedimientos Sub son
    públicos de manera predeterminada. Si no se usa Static, el
    valor de las variables locales no se mantiene entre distintas
    llamadas. La palabra clave Friend solamente se puede usar en
    módulos de clase. Sin embargo, los procedimientos en
    cualquier módulo de un proyecto pueden acceder a los
    procedimientos Friend. Un procedimiento Friend no aparece en
    la biblioteca
    de tipo
    de su clase primaria, ni se puede
    enlazar posteriormente.

    Precaución   Los procedimientos
    Sub pueden ser recursivos; es decir, se pueden llamar a sí
    mismos para realizar una tarea determinada. Sin embargo, esto
    puede llevar al desbordamiento de la pila. La palabra clave
    Static generalmente no se utiliza con procedimientos recursivos
    Sub.

    Todo código ejecutable debe estar en
    procedimientos.
    No puede definir un procedimiento Sub dentro de otro
    procedimiento Sub, Function o Property.

    Las palabras clave Exit Sub causan la inmediata salida
    de un procedimiento Sub. La ejecución del programa
    continúa con la instrucción que sigue a la
    instrucción que llamó el procedimiento Sub.
    Cualquier número de instrucciones Exit Sub puede aparecer
    en cualquier lugar de un procedimiento Sub.

    Al igual que un procedimiento Function, un procedimiento
    Sub es un procedimiento distinto que toma argumentos, lleva a
    cabo una serie de instrucciones y cambia el valor de sus
    argumentos. Sin embargo, a diferencia de un procedimiento
    Function, el cual devuelve un valor, un procedimiento Sub no se
    puede utilizar en una expresión.

    Para llamar a un procedimiento Sub, use el nombre del
    procedimiento seguido de la lista de argumentos. Consulte la
    instrucción Call para obtener información
    específica acerca de cómo llamar a los
    procedimientos Sub.

    Las variables usadas en procedimientos Sub se dividen en
    dos categorías: las que están explícitamente
    declaradas dentro del procedimiento y las que no lo están.
    Las variables declaradas explícitamente en un
    procedimiento (mediante Dim o un equivalente) siempre son locales
    del procedimiento. Otras variables usadas pero no declaradas
    explícitamente en un procedimiento también son
    locales, a menos que se declaren explícitamente en
    algún nivel superior fuera del procedimiento.

    Precaución   Un procedimiento
    puede usar una variable que no esté declarada
    explícitamente en el procedimiento, pero puede ocurrir un
    conflicto de
    nombres si cualquier cosa que ha definido en el nivel de
    módulo
    tiene el mismo nombre. Si el
    procedimiento se refiere a una variable no declarada que tiene el
    mismo nombre que otro procedimiento, constante o variable, se
    supone que el procedimiento se está refiriendo al nombre
    de ese nivel de módulo. Para evitar este tipo de conflictos,
    declare las variables explícitamente. Puede usar una
    instrucción Option Explicit para forzar la
    declaración explícita de variables.

    Nota   No se puede usar GoSub, GoTo o
    Return para obtener acceso o salir de un procedimiento
    Sub.

    Function (Instrucción)

    Declara el nombre, los argumentos y
    el código que componen el cuerpo de un procedimiento
    Function.

    Sintaxis

    [Public | Private | Friend] [Static] Function nombre
    [(lista_argumentos)] [As tipo]
    [instrucciones]
    [nombre = expresión]
    [Exit Function]
    [instrucciones]
    [nombre = expresión]

    End Function

    La sintaxis de la instrucción Function consta de
    las siguientes partes:

    Para ver
    el gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    El argumento lista_argumentos tiene la siguiente
    sintaxis y partes:

    [Optional] [ByVal | ByRef] [ParamArray]
    nombre_variable[( )] [As tipo] [=
    valor_predeterminado]

    Para ver el
    gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Comentarios

    Si no se especifican de forma explícita mediante
    Public, Private o Friend, los procedimientos Function son
    públicos de manera predeterminada. Si no se emplea Static,
    el valor de las variables locales no se conserva entre distintas
    llamadas. La palabra clave Friend sólo puede usarse en
    módulos de clase. Sin embargo, puede accederse a los
    procedimientos Friend por procedimientos en cualquier
    módulo de un proyecto. Un procedimiento Friend no aparece
    en la biblioteca de
    tipos
    de su clase primaria.

    Precaución   Los procedimientos
    Function pueden ser recursivos; es decir, pueden llamarse a
    sí mismos para realizar una tarea determinada. Sin
    embargo, la recursión puede provocar el desbordamiento de
    pila. La palabra clave Static no se suele utilizar con
    procedimientos Function recursivos.

    Todo el código ejecutable debe estar dentro de
    procedimientos. No puede definir un procedimiento Function dentro
    de otro procedimiento Function, Sub o Property.

    La instrucción Exit Function produce una salida
    inmediata de un procedimiento Function. La ejecución del
    programa continúa con la instrucción que sigue a la
    instrucción que llamó al procedimiento Function. En
    cualquier lugar de un procedimiento Function puede aparecer
    cualquier número de instrucciones Exit
    Function.

    Al igual que un procedimiento Sub, un procedimiento
    Function es un procedimiento independiente que puede adoptar
    argumentos, realizar una serie de instrucciones y cambiar los
    valores de sus argumentos. Sin embargo, a diferencia de un
    procedimiento Sub, puede utilizar un procedimiento Function en el
    lado derecho de una expresión
    de la misma forma en que utiliza cualquier función
    intrínseca, como Sqr, Cos o Chr, cuando desea emplear el
    valor devuelto por la función.

    Para llamar a un procedimiento Function, utilice en una
    expresión el nombre de función seguido de la lista
    de argumentos entre paréntesis. Consulte la
    instrucción Call para obtener información
    específica acerca de cómo llamar a los
    procedimientos Function.

    Para devolver un valor de una función, asigne el
    valor al nombre de la función. En cualquier lugar del
    procedimiento puede aparecer cualquier número de
    asignaciones de este tipo. Si no se asigna ningún valor a
    nombre, el procedimiento devolverá un valor
    predeterminado: una función numérica devuelve 0,
    una función de cadena devuelve una cadena de longitud cero
    ("") y una función Variant devuelve Empty. Una
    función que devuelve una referencia de objeto devuelve
    Nothing si no se asigna ninguna referencia de objeto a nombre
    (mediante Set) dentro del procedimiento Function.

    El ejemplo siguiente muestra cómo asignar un
    valor de retorno a una función llamada BinarySearch. En
    este caso, False se asigna al nombre para indicar que no se
    encontró algún valor.

    Function BinarySearch(. . .) As Boolean

    . . .

    ' Valor no encontrado. Devuelve un valor
    False.

    If lower > upper Then

    BinarySearch = False

    Exit Function

    End If

    . . .

    End Function

    Las variables empleadas en procedimientos Function se
    dividen en dos categorías: las que se declaran
    explícitamente dentro del procedimiento y las que no. Las
    variables que se declaran explícitamente en un
    procedimiento (mediante Dim u otra instrucción
    equivalente) siempre son locales del procedimiento. Las variables
    que se utilizan pero no se declaran explícitamente en un
    procedimiento también son locales, a menos que se hayan
    declarado explícitamente en algún nivel superior
    fuera del procedimiento.

    Precaución   Un procedimiento
    puede utilizar una variable que no se ha declarado
    explícitamente en el procedimiento, pero puede ocurrir un
    conflicto de nombres si algo que definió en un
    nivel de
    módulo
    tiene el mismo nombre. Si su
    procedimiento hace referencia a una variable no declarada que
    tiene el mismo nombre que otro procedimiento, constante o
    variable, se supone que el procedimiento hace referencia a ese
    nombre a nivel de módulo. Declare explícitamente
    las variables para evitar este tipo de conflicto. Puede utilizar
    una instrucción Option Explicit para forzar la
    declaración explícita de variables.

    Precaución   Visual Basic puede
    reorganizar las expresiones aritméticas para mejorar su
    eficacia
    interna. Evite utilizar un procedimiento Function en una
    expresión aritmética cuando la función
    cambie el valor de las variables de la misma
    expresión.

    IF … ENDIF (Comando)

    Ejemplo
      Vea
    también

    Ejecuta condicionalmente un conjunto de comandos
    dependiendo del resultado de una expresión lógica.

    Sintaxis

    IF lExpresión [THEN]
      Comandos
    [ELSE
      Comandos]
    ENDIF

    Argumentos

    lExpresión

    Especifica la expresión lógica evaluada.
    Si lExpresión da como resultado verdadero (.T.), se
    ejecutarán cualesquiera instrucciones posteriores a IF y
    anteriores a ELSE o ENDIF (lo que suceda primero).

    • Si lExpresión es falsa y se incluye ELSE, se
      ejecutan los comandos situados después de ELSE y antes
      de ENDIF.
    • Si lExpresión es falsa (.F.) y no se incluye
      ELSE, se pasarán por alto todas las instrucciones entre
      IF y ENDIF. En este caso la ejecución del programa
      continuará con la primera línea de comando a
      continuación de ENDIF.

    Comentarios

    Puede anidar IF … ENDIF dentro de otro
    bloque IF … ENDIF.

    Los comentarios precedidos de && se pueden
    colocar en la misma línea después de IF, ELSE y
    ENDIF. Estos comentarios se pasan por alto durante la
    compilación y la ejecución del programa.

    If…Then…Else (Instrucción)

    Ejecuta condicionalmente un grupo de instrucciones,
    dependiendo del valor de una expresión.

    Sintaxis

    If condición Then [instrucciones]-[Else
    instrucciones_else]

    Puede utilizar la siguiente sintaxis en formato de
    bloque:

    If condición Then
    [instrucciones]

    [ElseIf condición-n Then
    [instrucciones_elseif] …

    [Else
    [instrucciones_else]]

    End If

    La sintaxis de la instrucción If…Then…Else
    consta de tres partes:

    Para ver
    el gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Comentarios

    Puede utilizar la forma de una sola línea
    (Sintaxis 1) para pruebas cortas
    y sencillas. Sin embargo, el formato de bloque (Sintaxis 2)
    proporciona más estructura y
    flexibilidad que la forma de línea simple y, generalmente,
    es más fácil de leer, de mantener y de
    depurar.

    Nota   Con la sintaxis es posible
    ejecutar múltiples instrucciones como resultado de una
    decisión If…Then, pero todas deben estar en la misma
    línea y separadas por dos puntos, como en la
    instrucción siguiente:

    If A > 10 Then A = A + 1 : B = B + A : C = C +
    B

    Una instrucción con formato de bloque If debe ser
    la primera de la línea. Las partes Else, ElseIf y End If,
    de la instrucción, solamente pueden ir precedidas de
    un número de
    línea
    o una etiqueta de
    línea
    . El bloque If debe terminar con una
    instrucción End If.

    Para determinar si una instrucción If es un
    bloque, examine lo que sigue a la palabra
    Then. Si lo que aparece detrás de Then en la misma
    línea no es un comentario,
    la instrucción se considera como una instrucción If
    de una sola línea.

    Las cláusulas Else y ElseIf son opcionales. Puede
    tener en un bloque ElseIf, tantas cláusulas If como desee,
    pero ninguna puede aparecer después de una cláusula
    Else. Las instrucciones de bloque If se pueden anidar; es decir,
    unas pueden contener a otras.

    Cuando se ejecuta un bloque If (Sintaxis 2), se prueba
    condición. Si condición es True, se ejecutan las
    instrucciones que están a continuación de Then. Si
    condición es False, se evalúan una a una las
    condiciones ElseIf (si existen). Cuando se encuentra una
    condición True se ejecutan las instrucciones que siguen
    inmediatamente a la instrucción Then asociada. Si ninguna
    de las condiciones ElseIf es True (o si no hay cláusulas
    ElseIf), se ejecutan las instrucciones que siguen a Else.
    Después de la ejecución de las instrucciones que
    siguen a Then o Else, la ejecución continúa con la
    instrucción que sigue a End If.

    Sugerencia   Select Case puede ser
    más útil cuando se evalúa una única
    expresión que tiene varias acciones
    posibles. Sin embargo, la cláusula TypeOf nombre_objeto Is
    tipo_objeto no se puede utilizar en una instrucción Select
    Case.

    Nota   No se puede usar TypeOf con tipos
    de datos predefinidos como Long, Integer y así
    sucesivamente, excepto en el tipo de datos Object.

    Select Case (Instrucción)

    Ejecuta uno de varios grupos de
    instrucciones,
    dependiendo del valor de una expresión.

    Sintaxis

    Select Case expresión_prueba
    [Case lista_expresion-n
    [instrucciones-n]] …
    [Case Else
    [instrucciones_else]]

    End Select

    La sintaxis de la instrucción Select Case consta
    de las siguientes partes:

    Para
    ver el gráfico seleccione la opción ¨Descargar
    trabajo¨ del menú superior

    Comentarios

    Si expresión_prueba coincide con cualquier
    lista_expresión asociada con una cláusula Case, las
    instrucciones que siguen a esa cláusula Case se ejecutan
    hasta la siguiente cláusula Case o, para la última
    cláusula, hasta la instrucción End Select. El
    control pasa después a la instrucción que sigue a
    End Select. Si expresión_prueba coincide con una
    expresión de lista_expresión en más de una
    cláusula Case, sólo se ejecutan las instrucciones
    que siguen a la primera coincidencia.

    La cláusula Case Else se utiliza para indicar las
    instrucciones que se van a ejecutar si no se encuentran
    coincidencias entre expresión_prueba y una
    lista_expresión en cualquiera de las otras selecciones de
    Case. Aunque no es necesario, es buena idea tener una
    instrucción Case Else en el bloque Select Case para
    controlar valores imprevistos de expresión_prueba. Cuando
    no hay una instrucción Case Else y ninguna
    expresión de la lista en las cláusulas Case
    coincide con la expresión de prueba, la ejecución
    continúa en la instrucción que sigue a End
    Select.

    Se pueden utilizar expresiones múltiples o
    intervalos en cada cláusula Case. Por ejemplo, la
    línea siguiente es válida:

    Case 1 To 4, 7 To 9, 11, 13, Is >
    MaxNumber

    Nota   El operador de comparación
    Is no es lo mismo que la palabra clave Is utilizada en la
    instrucción Select Case.

    También puede especificar intervalos y
    expresiones múltiples para cadenas de caracteres. En el
    siguiente ejemplo, Case coincide con las cadenas que son
    exactamente iguales a todo, cadenas que están entre nueces
    y sopa en orden alfabético y el valor actual de
    ElemPrueba: 

    Case "iguales a todo", "nueces" To "sopa",
    ElemPrueba

    Las instrucciones Select Case se pueden anidar. Cada
    instrucción Select Case debe tener su correspondiente
    instrucción End Select.

    Unidad III

    For…Next
    (Instrucción)

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter