Emanuel's profileCrónicas de ellPhotosBlogListsMore Tools Help

Blog


    December 12

    Delegados

    Delegados: 

    -          Es un tipo de referencia asociada a un método compartido.

    -          Es una instancia de un método de un objeto.

    -          Es una clase que puede contener una referencia a un método.

     

    En palabras más simples, un delegado es un puntero, o un apuntador a un método. Si has trabajado algún tipo de lenguaje que te dio la oportunidad de trabajarlos como c, c++; Sabrás de lo que hablo, si no, es mejor que le des una leída a esto de los punteros, y después regreses a estudiar esto.En este ejemplo, vamos a crear un delegado y apuntarlo a un método, invocaremos al método de la forma común, y después con el delegado:

     

    'Esta clase contiene el método que mandará una mensaje
    Public Class miMensaje
      Public Sub Mensaje(ByVal Msj As String)
         Console.WriteLine("Este mensaje proviene de: ")
         Console.WriteLine(Msj)
         Console.ReadKey()
         Console.WriteLine()
      End Sub
    End Class
     
    Module Module1
      'Asi declaramos un delegado, observen que tiene
      'la forma del método al que apuntará, pues hasta
      'el momento solo esta declarado, pero no esta apuntando
      'a nada...
      Delegate Sub delegateMsj(ByVal M As String)
      Sub Main()
         'Primero mandaremos un mensaje instanciando a la clase miMensaje
         Dim unMensaje As New miMensaje
         unMensaje.Mensaje("unMensaje.Mensaje")
         'Y Ahora con un delegado.
         'Primero le instanciamos, ¿recuerdan las definiciones?
         Dim Delegado As delegateMsj
         'Le damos una dirección
         'Y esta, es de unMensaje y del método a direccionar
         Delegado = AddressOf unMensaje.Mensaje
         'y por último lo invocamos
         Delegado.Invoke("Delegado.Invoke")
       End Sub
       'Interesante, ¿cierto?
    End Module
     

    En el ejemplo anterior, no había necesidad de un delegado pues se podía mostrar un mensaje (tal y como se demostró) instanciando la clase, e invocando al método de la clase con un objeto. Pero, ¿Qué pasa cuando tenemos un método en la clase principal, en este caso -Module1-?. Y necesitamos invocarlo desde otro lugar, miClase?.

    Instanciando?, no se puede. Aquí, si hay necesidad de un delegado, y pues este es el ejemplo:

     

    Module
    Module1
      'Este método es el que queremos usar desde Module1 y miClase
      Sub Mensaje(ByVal Msj As String)
         Console.WriteLine("Este mensaje proviene de:")
         Console.WriteLine(Msj)
         Console.ReadKey()
         Console.WriteLine()
      End Sub
      'Método principal Main
      Sub Main()
          'De la forma normal, pero desde la clase principal
         Mensaje("-> Module: Module1") 'Invocamos el método
          'Con delegados, pero desde la Clase miClase
         Dim Clase As New miClase 'Instanciamos la Clase: MiClase
         Clase.otroMensaje() 'Invocamos el método: otro mensaje
      End Sub
    End Module
     
    Public
    Class miClase
      '¿Por Qué aqui si necesitamos un delegado?
      'Porque no podemos instanciar:
      'dim miMain as New Module1...?, simplemente no.
      'Mejor usamos un Delegate.
      'Con El mismo formato de Mensaje
      Delegate Sub DelegateMensaje(ByVal Msj As String)
      Public Sub otroMensaje()
         'Ya saben, instanciamos
         Dim Delegado As DelegateMensaje
         'Le damos una dirección
         Delegado = AddressOf Module1.Mensaje
         'y lo invocamos...
         Delegado.Invoke("-> Clase: MiClase")
         'Simple?, supongo que ahora si lo es. Cierto?
      End Sub
      'Saludos...
      'Atte: ellSoft
    End Class
     
    Emanuel Lira Lozada
    ellSoft

     

    December 09

    Matrices en VB 2005

    Algo sobre Matrices y cómo se manejan en Visual Basic 2005.
     
         Matriz: Conjunto de elementos q comparten un nombre en común, a los cuales se puede acceder por medio del índice o posición que ocupan en la matriz.
         ¿Cómo se declaran las matrices?:
              - Una Dimensión: Dim <Nombre_Matriz><()> As <Tipo>
                                    Donde: <Tipo>, es el tipo de elementos que contendrá la matriz.
     
                Una observación interesante: ¿La diferencia entre una matriz y una colección es, que la matriz solo almacena un tipo de elementos, mientras que la colección puede almacenar cualquier tipo de datos?. Según, he leido en internet y en libros, esa es la diferencia, pero encontré algo interesante gracias a un MVP de Microsoft. ¿Si declaro una matriz del tipo Object (donde: object, permite almacenar cualquier tipo d datos), no tengo entonces una colección, donde cada elemento puede ser de cualquier tipo? Tal vez, la diferencia se las comente en algún artículo sobre colecciones. jejeje. Pero piensenlo, si esa no es la diferencia, entonces ¿cúal es?.
     
            - Multidimencionales: Dim <Nombre_Matriz> <(Dimensión,Dimensión,...)> As <Tipo>
                          Donde: Dimensión, es el tamaño de las hileras.
                          Ej: Si tenemos una matriz de la siguiente forma -> Dim M(2,3) As Integer
                     Tendremos entonces, una Matriz de (2+1) Filas * (3+1) Columnas. Esto se debe a que VBC (compilador VB   2005) entiende que debe almacenar 2 filas y 3 columnas. pero el compilador toma en cuenta la posición 0, entonces tendríamos una matriz mas o menos así:
     
                           [0,0] [0,1] [0,2] [0,3]
                           [1,0] [1,1] [1,2] [1,3]
                           [2,0] [2,1] [2,2] [2,3]                       
     
         En el siguiente ejercicio propuesto, se tratará de hacer que 2 Matrices, Fusionen sus datos en una 3er Matriz, y además deben quedar ordenados los datos ascendentemente. Veremos como Inciar una Matriz, como pasarla como parámetro y como recorrerla.
         Bien, Este ejercicio es sobre modo consola, Puedes trabajarlo desde el Visual Estudio, el IDE de VB 2005 Express ó desde el Bloq de Notas. Empezemos:
     

    Module FusionarListas

        Public Function Fusionar(ByVal listaA() As String, _

                                 ByVal listaB() As String, _

                                 ByVal listaC() As String) As Integer

     

            Dim indice As Integer, indiceA As Integer, indiceB As Integer, indiceC As Integer

            'Retorna 0, si no hay datos en las listas

            If listaA.Length + listaB.Length = 0 Then Return 0

            'Fusionar listas a y b en c

            While indiceA < listaA.Length And indiceB < listaB.Length 'checa el final de las listas

                ' Compararlos alfabeticamente

                If listaA(indiceA).CompareTo(listaB(indiceB)) < 0 Then

                    listaC(indiceC) = listaA(indiceA)

                    indiceC += 1

                    indiceA += 1

                Else

                    listaC(indiceC) = listaB(indiceB)

                    indiceC += 1

                    indiceB += 1

                End If

            End While

            'Por lógica, una de las listas finalizará primero, aunque sean del mismo tamaño

            'No se calcula cual finalizó primero, pues requiere espacio cualquier comparación.

            'Es mejor pasar las listas, si A finalizó primero, el primer for no entrara

            'si B finalizó primero el segundo for no se llevará a cabo...

            For indice = indiceA To listaA.Length - 1

                listaC(indiceC) = listaA(indice)

                indiceC += 1

            Next

            For indice = indiceB To listaB.Length - 1

                listaC(indiceC) = listaB(indice)

                indiceC += 1

            Next

            'Con esto nos hemos asegurado que todos los datos estarán en la listaC

            Return 1 'Regresa 1, despúes de fusionar las listas a y b en c

        End Function

     

        'Función Principal, por donde empezará el programa

        Sub Main()

            'Iniciar las listas, se pueden sustituir estas lineas por lectura desde el teclado

            Dim lista1() As String = {"Ana", "Carlos", "David", "Emanuel", "Francisco", _

                                      "José", "Karla", "Luis", "Nohemi", "Omar", "Pedro", _

                                      "Rosa", "Susana"}

            'Aqui iniciamos una lista en desorden, con la intención de mostrarles los fácil que es

            'ordenarlas

            Dim lista2() As String = {"Sonia", "Belén", "Guillermo", "Fernando", _

                                      "Daniel", "Hugo", "Alfredo"}

            'De la matriz que almacenará la fusión de las listas 1 y 2, no se sabe su dimensión,

            'y no podemos arriesgarnos a poner un número cualquiera, podría desbordarse si se pasa el

            'límite, o desperdiciar memoria, esto lo menciono porque podemos calcular el

            'tamaño de la lista3, solo hay que sumar lista 1 y 2

            Dim lista3(lista1.Length + lista2.Length) As String

            Dim Resultado As Integer, indice As Integer

            System.Array.Sort(lista2) 'Ordenar alfabéticamente la lista2...       

            'Como la función FUSIONAR retorna 0 si no se realizó la fusión, podemos mostrarlo en pantalla

            resultado = Fusionar(lista1, lista2, lista3)'Pasamos las listas

            If Resultado <> 0 Then

                For indice = 0 To lista3.Length - 1

                    Console.WriteLine(lista3(indice))

                Next

            Else

                WriteLine("No se realizó la Fusión")

            End If

        End Sub

        'Recuerden que una Matriz, contiene una dirección de memoria y todos los datos están en orden

        'por lo tanto no necesitamos llenar la matriz desde aqui, al hacerlo desde FUSIONAR,

        'la matriz queda con los datos y podemos acceder a ellos desde aqui.

        'Bien, hemos tratado las matrices o arrays como objetos, espero les sirva como guía, bueno

        'simplemente que les sirva...

    End Module

     

    Emanuel Lira Lozada

    ellSoft

     *el ejercicio fue propuesto por: Javier Ceballos.

    IMPORTANTE

    Hola a todos, tengo una importante noticia que darles; y es la siguiente:
     
        Como estudiante, sé lo difícil que a veces es, buscar información, y más sobre cosas tan recientes, en este caso VB 2005. Microsoft, proporciona una pagina de ayuda, http://msdn2.microsoft.com/es-es/library/default.aspx, en ella podrás encontrar gran cantidad de información sobre VB y C#. Tambien existe la ayuda que proporciona el entorno de VStudio, en fin, el dilema es que, siempre se necesita una tipo de ayuda diferente, menos técnica y mas explicada. Por eso, voy a estar publicando artículos sobre VB 2005, pero aclaro, no es un curso, ni haré entregas (a menos que alguien lo solicite), por el contrario, solo serán artículos sobre cosas y detalles que a veces son tan indispensables conocer pero no siempre lo conocemos y al buscarlo, se vuelve ta complicado, supongo que se debe a el hecho de que suponen que eso, lo conocemos al derecho y al revés. Bueno, c iu.
     
    ellSoft
     
    P.D. Busquen en la categoría Visual Basic 2005
    December 03

    ESTAMOS EN LA FINAL

    Somos Ganadores, Somos Invencibles...Somos CHIVAS de CORAZON
     
                 |||||||
          ||||||       ||||||     
              |||      |||
           |||||||||||||||||
        ||||||||||||||||||||||
     |||||||||||||||||||||||||||
    ARRIBMIS  CHIVITAS
     |*||||||||||||||||||||||*|
        |*||||||||||||||||||*|
           |*|||||||||||||*|
              |*|||||||||*|
                 ||*||*||
     
     
     
          ellSoft
     
     
     

    Creatividad XXI

         Hola: Sucede que pasó la semana nacional de creatividad, la cual se llevó a cabo del 27 al 30 de Noviembre. Y por supuesto, estuve por ahi en compitiendo, aunq la verdad para un Tecnológico descentralizado es muy complicado ganar, y si todavía a esto le agregamos que al local se le dan varios lugares, se vuelve todavía mas difícil la situación. Había muy buenos proyectos, aunque otros si eran muy simples, creo que no voy a mencionarlos para no agredir a naie, solo comentaré que son proyectos que en ITESA, hacemos para una materia o en la semana de ciencia y tecnología. Otros mas que complicados, eran ingeniosos y tuvieron una buena oportunidad.
         Aún desconocemos los lugares, claro de los que no ganamos un lugar para la Nacional, espero no haber quedado en lugar tan malo.
         Les puedo contar rapidamente algo sobre Encrypt, el proyecto que llevé a participar; Es un modelo de Ecriptación basado en algoritmos lineales de Llave pública. Basado en tres etapas: Difusión, Confusión y Llave Pública.
     
    1.-) Difusión: El Arte de hacer que un símbolo no represente siempre lo mismo.
        Sabemos que una símbolo A siempre representará la A; y una B, siempre una B. La difusión consiste en lograr que A represente una A, pero si se vuelve a encontrar una A, ésta, ya no represente una A, sino, tal vez una B, y así sucesivamente.
         Analicemos la siguiente palabra: Adelaida, estadisticamente la A, es la letra que mas se repite en nuestro vocabulario.
         En la palabra a analizar: A, 3 veces; d, 2 veces; e, 1 vez; l, 1 vez; i, 1 vez. Si sustituyeramos las letras con otros símbolos. números para este caso, sería algo así:
         A|D|E |L |A|I |D| A
         1|2 |3 |4 |1|5|2 | 1
         Y vemos que al criptoanalizar, el 1 es el símbolo que más se repite, entonces tendríamos que pensar que tal vez esta representando una A, y asi tendríamos que realizar con cada uno de los símbolos hasta encontrar palabras coherentes. Pero que sucede si no solo sustituimos símbolos, sino que, estos símbolos no siempre representaran lo mismo:
         A|D|E |L |A|I |D| A
         1|1 |1 |2 |2|1|2 | 3
         En fin, pasaré al siguiente punto:
     
    2.-) Confusión: Este concepto es más simple. Cuando terminamos de aprender a leer, llega el punto donde simplemente, ya no leemos, solo visualizamos, pq nuestro cerebro ya conoce las palabras, por ejemplo: NAZIONAL, lo acabas de visualizar, y seguramente, notaste que esta ortograficamente, esta mal escrito y sino, vuelve a verlo, en cualquiera de los 2 casos, sabemos que dice: NACIONAL, pq nuestro cerebro ya sabe que asi se lee, ya no hay necesidad de Leerlo. Pero si ahora yo te presento esta palabra: DEALIADA, tal vez no lo comprendiste y tuviste que leerlo otra vez, y sigues igual, y sino te darás cuenta que es ADELAIDA, pero con las letras revueltas, eso mi estimado y estimada, es confusión.
     
    3.-) Y Llave pública: Esto es una clave que se "Mezclara" con el texto plano (el que entendemos), y lo convertirá en texto cifrado.
         Regremos a NACIONAL, el cual mezclaremos con Instituto:

         =#0'rSSSú$óSSÑS*'ú$óSÑéR4+9$óSÑGRRRñp%,néSS3$etPSÑSSSúpns+!nPSú$óSS/,.q0p!Mq#,.p0p!Mp#+&nP8ÑR3

        El resultado es un Encriptado según el modelo Encrypt. Para regresar al texto Plano, tendremos que utilizar el Mismo texto que usamos como Llave: Instituto.

         3$7-~SSYíSSSSSY!+SSSSVñR13,SYííGRRR:D'-áPSYD'-áPSYíSSS2aE!+hPSSYíSS+'!B8 &úv4| t,+'MA8'-áPR:R

        Este es otro ejemplo con el mismo texto plano: NACIONAL, pero con Llave Empresa.

    Bien eso es todo, espero les haya gustado.