Emanuel's profileCrónicas de ellPhotosBlogListsMore Tools Help

Blog


    March 28

    Clases VS Structuras

    Las clases y las estructuras aparentemente son iguales, ambas pueden contener miembros los cuales son campos y métodos, ambos requieren de un constructor para crear una instancia de ellos mismos y como todo en .NET, heredan de la clase Object. La principal diferencia entre las clases y estructuras es que las clases son del tipo referencia y las estructuras del tipo valor. En un nivel más bajo, las clases son alojadas en el heap, mientras que las estructuras en el stack. El stack fue diseñado para tener un acceso ligero y rápido a la información, sin embargo, el amontonamiento de datos en el stack puede reducir el rendimiento de la aplicación considerablemente.

    Quieres ver el artículo completo visita: --> Mi Página <--

    March 19

    Rompecabezas 5/5

     

    Para consultar este Post, Clickea Aqui

    March 15

    Roompecabezas 4/5

    Para ver este artículo haz click aqui

    Gracias a Todos los que han visitado este espacio... Tú formas parte de los: 

    free web counter Visitantes...Gracias. (No olvides dejar tus comentarios)

    March 10

    Rompecabezas 3/?

    Hola de nuevo, en esta sección se finalizará Region "Métodos para fragmentar imagen", Iniciemos.

    NOTA: Esta es la segunda parte de éste artículo, recuerda que puedes consultar este y otros post en: http://emanuelliralozada.googlepages.com/home

    e) Método Cerrar()

    Éste método lo menciono rápido pues no es muy relevante; al llamarlo finalizará el programa

        Sub Cerrar()
            'Es importante mencionar que no podemos llamarlo de esta forma: form1.Close(), debido a la POO

            Me.Close()
        End Sub

    f) Método Revolver()

    Este código nos permitirá pasar las imágenes que tenemos en el rompecabezas a los pictures partes y revolverlos, de manera que se hará un revolvedero de imágenes. jeje

    Nota: A lo que me refiero cuando digo rompecabezas es a los pictures donde esta la imagen completa, es decir, los 16 pictures Pos

    El algoritmo es sencillo:

    • 1.- Cambiamos imágenes de pos0 a parte0, pos1 a parte1....etc
    • 2.- Almacenamos las coordenadas de parte0, parte1, ...
    • 3.- Utilizamos random para intercambiar las coordenadas de parte0, parte1...etc

    Nota: La palabra Handler indica a qué control se le asigna el evento (en palabras sencillas), es como un acceso directo al control para que ejecute "x" evento y addressof le da la dirección. ejemplo:

    La instrucción: AddHandler Posiciones(i).DragDrop, AddressOf Pos0_DragDrop

    Indica que el control posiciones(i) puede ejecutar DragDrop, y AddressOf le dice donde está ese evento, es decir, lo tiene Pos0. Sin embargo, esto no permite saber que control de los 16 posibles (16 pictures), ejecutó tal evento, para eso veremos más adelante la instrucción DirectCast

    El Código

    Sub Revolver()
            'Creamos una matriz de los pictures donde colocaremos las imágenes fraccionadas para revolver
            Dim Partes() As PictureBox = {Parte0, Parte1, Parte2, Parte3, Parte4, _
                                            Parte5, Parte6, Parte7, Parte8, Parte9, _
                                            Parte10, Parte11, Parte12, Parte13, Parte14, Parte15}
            'Creamos una matriz de los pictures donde están y donde colocaremos las partes de la imagen
            'que forman el rompecabezas

            Dim Posiciones() As PictureBox = {Pos0, Pos1, Pos2, Pos3, Pos4, Pos5, _
                                                Pos6, Pos7, Pos8, Pos9, Pos10, Pos11, _
                                                Pos12, Pos13, Pos14, Pos15}
            Dim px(15) As Integer 'Para almacenar left
            Dim py(15) As Integer 'Para almacenar top
            Dim l(15) As Boolean 'Para saber cuantas imagenes hemos revuelto

            For i As Byte = 0 To 15
                'Para mostrar los 16 pictures
                Posiciones(i).BorderStyle = BorderStyle.FixedSingle
                'intercambiar imagenes
                Partes(i).Image = Posiciones(i).Image
                'Quitar la imagen del rompecabezas
                Posiciones(i).Image = Nothing
                'Permitir el arrastre
                Posiciones(i).AllowDrop = True
                'Almacenamos datos: left y top
                px(i) = Partes(i).Left
                py(i) = Partes(i).Top
                'Ponemos todos en Falso
                l(i) = False
                'Debido a que el usuario puede revolver imagenes a pesar de haber iniciado el juego,
                'se tiene que verificar cuales están fuera del rompecabezas para...

                If i > 0 And nUndo = 0 Then
                    '...indicarle que posicion(x) debe hacer lo mismo que pos0_dragdrop
                    AddHandler Posiciones(i).DragDrop, AddressOf Pos0_DragDrop
                    '...indicarle que posicion(x) debe hacer lo mismo que pos0_dragenter
                    AddHandler Posiciones(i).DragEnter, AddressOf Pos0_DragEnter
                    '...indicarle que partes(x) debe hacer lo mismo que parte0_mousedown
                    AddHandler Partes(i).MouseDown, AddressOf Parte0_MouseDown
                    '...indicarle que partes(x) debe hacer lo mismo que parte0_mousemove
                    AddHandler Partes(i).MouseMove, AddressOf Parte0_MouseMove
                    'de lo contrario tendríamos que hacer un código para cada picture
                End If
            Next
            Dim
    indice As Integer
            Dim j As Integer = 0
            Dim Listos As Integer = 0

            While Listos < 16 'Para revolver los 16 pictures
                Do
                    indice = rand.Next(0, 15)
                Loop While l(indice) 'No permite que se repita un random
                l(indice) = True 'Pone en True para que no repita el mismo picture
                Listos += 1 '16?, finaliza While
                Partes(j).Top = py(indice) '16 posiciones posibles
                Partes(j).Left = px(indice) '16 posiciones posibles
                j += 1
            End While
        End Sub

    #End Region 'Por fin finaliza este Region

     

    Bien, Nos vemos en la cuarta Sección de Roompecabezas, veremos Region "Roompecabezas", donde tenemos los métodos para arrastrar las imagenes, calcular la posición, entre otrs. C IU

    March 07

    Roompecabezas parte2/?

    NOTA: Esta es la segunda parte de éste artículo, recuerda que puedes consultar este y otros post en: http://emanuelliralozada.googlepages.com/home 

    Region: Métodos para agregar la imagen y fragmentarla

    Realmente esto es muy sencillo, este programa lo realicé con las bases de programación y no con las bases de conocimiento de VB 2005, por ejemplo: el método setpixel es conocida desde el famoso lenguaje estructurado C, seguramente existirá alguien que conozca un método en VB mejor que este, sin embargo, para cuestiones educativas, este programa me parece excelente.

    a) El Método Abrir()

    Utiliza un OpenFileDialog para abrir una imagen, sin embargo, el control es agregado en tiempo de ejecución, quizá esto nos ahorre un poco de memoria.

    El código:
    #Region "Métodos para agregar imagen y fragmentarla"
        Sub Abrir()       
        'No es necesario agregar el Control, podemos declararlo desde aqui
            Dim Abrir As New OpenFileDialog 
            With Abrir
            'Titulo del Cuadro de dialogo
                .Title = "Buscar Imagen"
                'Filtro para el tipo de imágenes que se muestran
                .Filter =
    "Archivos de Imagen|*.bmp;*.jpg;*.gif"        
                'Esto es importante, para controlar el botón Cancelar
                If .ShowDialog = Windows.Forms.DialogResult.OK Then
                    Pinta_Cuadro(.FileName) 'Se verá más adelante
                    Fraccionar_Imagen() 'Se verá más adelante
                End If 
            End With
        End Sub          
    b) El Método Pinta_Cuadro()

    Genera un nuevo bmp con la imagen que seleccionó el usuario, lo guarda con un tamaño de 400x400 en un archivo temporal llamado: bmptemporal.bmp

    El código:
        Private Sub Pinta_Cuadro(ByVal filename As String)
            'Creamos el Objeto Gráfico, la variable g ya la declaramos en region Variables
            If g Is Nothing Then g = ObjetoGrafico()'Este método viene más abajo
            'En el método DrawImage almacenamos la imagen y le damos el tamaño utilizando el picture: Picimagen
            g.DrawImage(New Bitmap(filename), New Rectangle(0, 0, picImagen.Width, picImagen.Height))
            'Se salva la imagen en el archivo temporal
            picImagen.Image.Save(Application.StartupPath & "\bmptemporal.bmp")
            'Se guarda la dirección de la imagen seleccionada en el Tag
            picImagen.Tag = filename
            'Sino se invalida el grafico del picture no se dibujará la nueva imagen
            picImagen.Invalidate()
        End Sub
    c) El Método ObjetoGrafico()

    En este método creamos el bmp, el cual ponemos al picImagen, creamos un grafico del nuevo bmp y lo retornamos a la variable g del método anterior, por eso podemos manipular la imagen que seleccionó el usuario, y guardar el archivo temporal con extensión .bmp

    El código:

        Private Function ObjetoGrafico() As Graphics
            'Creamos un mapa de bits con las dimensiones del picture PicImagen
            Dim bmp As Bitmap = New Bitmap(picImagen.Width, picImagen.Height)
            'Colocamos el nuevo mapa de bits en PicImagen       
            picImagen.Image = bmp
            'creamos el objeto gráfico utilizando el bmp, esto permite convertir la imagen a un bmp
            Dim dibujo As Graphics = Graphics.FromImage(bmp)
            Return dibujo
        End Function

    d) El Método Fraccionar_Imagen()

    Ésta, es quizá, la parte más importante de este programa, ya que permite dividir la imagen en partes, en este caso: 16 partes de 100x100. El algoritmo es sencillo, primero se lee la imagen que guardamos con el nombre de "bmptemporal.bmp" y lo almacenamos en un bitmap, enseguida, recorremos con un foreach los pictures que están dentro de Panel1, leemos lo que tienen en propiedad Tag y utilizamos Split para separar las cadenas y saber en qué picture estamos, enseguida, de acuerdo al número obtenido le damos la dimensiones o las coordenadas para obtener la fraccion adecuada.

    Una vez obtenidas las coordenadas, recorremos esa parte de la imagen temporal con GetPixel, y al mismo tiempo lo guardamos en el picture adecuado con SetPixel. Eso es todo, realmente sencillo.

    El código:

        Sub Fraccionar_Imagen()
            'Disimulamos el algoritmo, no queremos que el usuario vea una imagen sin sentido
            picImagen.Visible = False
            'leemos el archivo temporal
            Dim bmp As New Bitmap(Application.StartupPath & "\bmptemporal.bmp")
            Dim i As Long, iIn As Long 'Coordenadas       
            Dim j As Long, jIn As Long 'Coordenadas
            Dim Control As PictureBox ' Para recorrer los controles con el foreach
            Dim nombre As String 'Se almacena el nombre
            Dim pos As Integer '
            Dim color As Color 'Para almacenar el color del Pixel al usar GetPixel
            Panel1.Cursor = Cursors.AppStarting 'Ponemos el cursor en estado de Loading...
            Me.Cursor = Cursors.AppStarting 'Ponemos el cursor en estado de loanding...
            'Este label coloca un texto para indicarle al usuario que estamos fragmentando la imagen
            Label2.Visible = True
            'Inicia el Foreach
            For Each Control In Panel1.Controls 'Es importante indicarle que se trata de los controles de Panel1
                'Separamos la cadena que almacenamos en la porpiedad Tag, regresen al primer artículo en la parte
                'de introducción para que lo chequen, si quieren claro

                nombre = Control.Tag.ToString.Split(":".ToCharArray)(0)
                'Esto es importante, aqui sabemos que picture tenemos, y tambien que parte de la imagen
                'se colocará en este picture

                pos = Convert.ToUInt32(Control.Tag.ToString.Split(":".ToCharArray)(1))
                'Esto es para que no se muestre como se va colocando la imagen
                Control.Visible = False
                'Una vez que sabemos que picture tenemos, damos las coordenadas adecuadas
                Select Case pos
                    Case e 0 : iIn = 0 : jIn = 0
                    Case 1 : iIn = 0 : jIn = 100
                    Case 2 : iIn = 0 : jIn = 200
                    Case 3 : iIn = 0 : jIn = 300
                    Case 4 : iIn = 100 : jIn = 0
                    Case 5 : iIn = 100 : jIn = 100
                    Case 6 : iIn = 100 : jIn = 200
                    Case 7 : iIn = 100 : jIn = 300
                    Case 8 : iIn = 200 : jIn = 0
                    Case 9 : iIn = 200 : jIn = 100
                    Case 10 : iIn = 200 : jIn = 200
                    Case 11 : iIn = 200 : jIn = 300
                    Case 12 : iIn = 300 : jIn = 0
                    Case 13 : iIn = 300 : jIn = 100
                    Case 14 : iIn = 300 : jIn = 200
                    Case 15 : iIn = 300 : jIn = 300
                    Case Else
                        Exit Sub

                End Select
                'Un bmp auxiliar
                Dim bmpP As New Bitmap(Control.Width, Control.Height)
                'Inicia el recorrido de la imagen en las coordenadas adecuadas
                For i = iIn To iIn + 99
                    My.Application.DoEvents() 'Indispensable, de lo contrario se quedará "bloqueado" el programa
                    For j = jIn To jIn + 99
                        My.Application.DoEvents() 'Indispensable, de lo contrario se quedará "bloqueado" el programa
                        color = bmp.GetPixel(j, i) 'Obtenemos el pixel
                        bmpP.SetPixel(j - jIn, i - iIn, color) 'Colocamos el pixel en el bmp auxiliar
                    Next
                Next

                Control.Image = bmpP 'Ahora colocamos la imagen en el picture
            Next
            Panel1.Cursor = Cursors.Default 'Finalizando la fragmentación, colocamos el cursor en estado normal
            Me.Cursor = Cursors.Default 'Finalizando la fragmentación, colocamos el cursor en estado normal
            Label2.Visible = False 'quitamos el mensaje de fragmentando imagen
            For Each Control In Panel1.Controls 'Recorremos una vez mas los pictures para hacerlos visibles
                Control.Visible = True
            Next
        End Sub

     

    NOTA: Aquí finaliza la 2da parte, en la tercera finalizaremos este Region, con los métodos cerrar() y Revolver(), hasta aquí ya puedes correr el programa, recuerda entonces colocar el #End Region, pues yo lo tengo hasta finalizar los 2 métodos que acabo de mencionar.

    Los errores que encontrarás son de sintaxis, quisiera decir que los coloqué a propósito, pero no es así, de por sí ya es difícil colocar el código con todo y colores, revisar si lo escribí bien, te toca a ti.

    March 04

    Roompecabezas (parte 1/?)

    ¿Cómo hacer un rompecabezas con conocimientos básicos?

    OJO -> Consulta éste ártículo en: http://emanuelliralozada.googlepages.com/home

    Ok. Esta vez les presento un programa para todos aquellos amantes de la programación y para los que no, también.

    Nota:

      • Este artículo estará dividido en por lo menos 5 partes
      • Está desarrollado en Visual Basic 2005
      • Por supuesto que debes tener en caso de XP el SP2, si tienes Windows Vista, no hay problema.
      • No sólo aprenderás a realizar un sencillo rompecabezas, este programa contiene código que tiene un nivel, digamos: Intermedio avanzado. Cuando el subtitulo dice "conocimientos básicos", me refiero a manejo de imágenes.
    Introducción:

    A continuación explico brevemente lo que realiza este programa y al mismo tiempo lo que vamos a necesitar:

    1. Le da al usuario la opción de elegir una imagen utilizando el control OpenFileDialog y la coloca dentro de un picture con las siguientes propiedades:
      • name: PicImagen
      • size: 400, 400
      • location: donde quieras
      • Sizemode: StretchImage
    2. La imagen se redimenciona a un tamaño "standard" de 400x400
    3. La nueva imagen (de 400x400), se fracciona en 16 partes de 100x100
    4. Cada fracción es redibujada en un picture, por lo tanto debes colocar un control panel en tu form y dentro del panel 16 pictures con las siguientes propiedades:
      • Panel:
        • name: panel1
        • size: 434, 434
        • location: "la que quieras" yo coloque, 10, 30
      • Pictures:
        • name: pos0, pos1,..., pos15 (recuerda que son 16 pictures, de 0 a 15)
        • size: 100, 100 (para los 16)
        • location: 8,8 (solo para el picture Pos0, los demás los colocaremos con código, de lo contrario puedes colocarlos de tal forma que formen una matriz de 4x4)
        • tag: pos:0, pos:1,..., pos15(para el picture Pos0, pos:0; para el Pos1, pos:1; etc)
    5. Revuelve aleatoreamente los 16 pictures y los coloca en "otros" pictures, con las siguientes propiedades:
      • name: Parte0, Parte1, ..., Parte15 (recuerda que son 16 pictures, de 0 a 15)
      • size: 100, 100 (para los 16)
      • location: donde quieras (Yo forme otra matriz de 4x4)
      • tag: parte:0, parte:1,..., parte:15(para el picture Parte0, parte:0; para el Parte1, parte:1; etc)
    6. Ofrece la opción de Deshacer Movimiento, para que el usuario regrese la última imagen colocada
    7. Finalmente, cuando finaliza los 16 movimientos posibles, le muestra al usuario como fue colocando las imágenes, y también si lo hizo de la forma correcta
    8. El programa lo he dividido en 5 Regiones:
      • Region: Variables
      • Region: Inicio
      • Region: Métodos para agregar y fragmentar la imagen
      • Region: Rompecabezas
      • Region: Menú y form (Esta parte es donde tu decides la forma de tu presentación, en mi caso utilicé Menús que se encargan de llamar a los métodos).
    Region 1: Variables

    Esta parte contiene la declaración de variables, no hay mucho que explicar así que sin ningún obstáculo les muestro el código:

    Nota:
    Recuerda que las variables deben ir después del: Class Form1

    El código:

       #Region "Variables"
           'Para controlar los gráficos
           Dim g As Graphics
           'Para revolver las imagenes
           Dim rand As New Random
           'Para verificar si el usuario está arrastrando la imagen
           Dim Arrastra As Boolean = False
           'Para saber cual imagen está moviendo, dónde la coloca y para hacer el método Deshacer
           Dim miSender(15) As Objects, miOtroSender(15) As Object
           'Saber cuantos movimientos a realizado, para saber cuantos undo puede hacer
           Dim nUndo As Byte = 0
           'Para verificar si ya realizó los 16 movimientos posibles
           Dim Ver As Atring
       #End Region

    Region 2: Inicio

    Aquí vamos a colocar los Pictures (Pos0, Pos1,...Pos15) en una matriz de 4x4, podemos aprovechar que lo colocamos dentro del panel para usar un foreach, sin embargo, un foreach no necesariamente los va a colocar en el siguiente orden:

    [Pos0 ] [Pos1 ] [Pos2 ] [Pos3 ]

    [Pos4 ] [Pos5 ] [Pos6 ] [Pos7 ]

    [Pos8 ] [Pos9 ] [Pos10] [Pos11]

    [Pos12] {Pos13] [Pos14] [Pos15]

    Pues bien, al no usar el foreach, simularemos una matriz de controles como en VB 6.0 (aunque es la primera vez que colaboro, no significa que no tenga tiempo en esto, de echo VB 6.0 ha sido de mis favoritos)

    Nota:
    Es recomendable que bajes el exe  [click -> Roompecabezas] para que le des una checada de como funciona, y aunque aquí no coloco los comentarios tipo xml, también te recomiendo que los coloques, es muy sencillo pones 3 veces el comentario normal: ''' e inmediatamente, VB te coloca en posición para comentar, además, cuando codificas, esos comentarios los utiliza el intellisense.

    El código:

    Método Inicio

       #Region "Inicio"
           Sub Inicio()
              'Aqui creamos la matriz de controles Picture
              Dim Posiciones() As PictureBox = {Pos0, Pos1, Pos2, Pos3, Pos4, Pos5, _
              Pos6, Pos7, Pos8, Pos9, Pos19, Pos11, Pos12, Pos13, Pos14, Pos15}
              'Colocamos el primer Picture -Posiciones(Pos0)- con borderstyle = none
              'Tambien se puede cambiar la propiedad location desde aqui

              Posiciones(0).BorderStyle = BorderStyle.None
              'Este código es clásico desde que aprendes a programar Matrices en lenguajes como c,
              'varía un poco, pero sigue siendo el mismo problema

              Dim j As Integer = 4
              'He aqui el código para colocar la matriz de 4x4
              For i As Integer = 1 To 15
                 If i = j Then
                    Posiciones(j).BorderStyle = BorderStyle.None
                    Posiciones(j).Top = Posiciones(j - 4).Top + Posiciones(j - 4).Height
                    j += 4
                 Else
                    Posiciones(i).BorderStyle = BorderStyle.None
                    Posiciones(i).Left = Posiciones(i - 1).left + Posiciones(i - 1).Width
                    Posiciones(i).Top = Posiciones(i - 1).Top
                 End If
              Next
           End Sub        
       #End Region

    Bien, aquí finaliza esta primera parte, en la segunda veremos la parte de Región 3: "Fragmentar Imagen".
    

    March 02

    My Tale

    Hola a mis compañeros, hola a mis amigos, hola reverendos,
    a mis profesores y lectores, camaradas y a mis valedores;
    en este momento, como todo gran evento les presento:
    "¡¡¡Explosión!!!, aquí empiezan las crónicas del blog de Emanuel"
     
    La Graduación, mucha emoción y satisfacción al saber
    que esta generación, tenía como misión el crecer,
    inicia, participación en el conscurso nacional de ingenio y creatividad,
    Primero el Local, se logró ganar, en el regional, el 3er lugar.
     
    Investigación, de tecnología, muchas cosas nuevas que aprender
    un soñador, lleno de ilusión es José Miguel,
    pasión, esfuerzo y anhelo puso al traer
    a microsoft, su tecnología y la academic cell, ITESA.net
     
    Discusión, crap, c sharp vs visual basic,
    solo por saber quien es el rey, accept it
    todo cae por su propia gravity, como un spaghetti
    lineas grandes que te enredan, oh reality
     
    ok, give me a new opportunity
    y confesaré, who is the only one king
    no jokin, pero dame un breve interludio,
    el verdadero rey es visual studio.
     
    A mis compañeros los sinceros, a todos mis amigos y enemigos
    a mis profesores y lectores, camaradas y a todos mis amores;
    en este momento, como aquel que actúa continúa:
    "¡¡¡Explosión!!!, las crónicas del blog de Emanuel"
     
    Se pasó rápido el año y el segundo concurso inició
    Todo se hiba al caño, para mi el proyecto se acabó
    pero como dice Eminem: "do not miss your chance to blow"
    y nos fuimos de volón el Wedo, el Rafa y yo
     
    Penalización, directivos del ITESA corrieron a Nayiv
    por lo tanto al concurso no pudo acudir
    aún así, mis agradecimientos por apoyar a Encrypt
    y Thank you for believing all this time, en mí.
     
    too my family, too my aunt efi, too my friend lili
    Norma, Wedo, Rafa, Migue, adolfix y también a G
    y a todos los que no menciono aquí, sorry to forget y
    i am sorry for This whole rap shit.

    A mis compañeros los sinceros, a todos mis amigos y enemigos
    a mis profesores y lectores, camaradas y a mis nuevos patrones;
    en este momento, como buena taquiza finaliza:
    "¡¡¡Explosión!!!, las crónicas del blog de Emanuel"...This tale has no end.