[APORTE] Lección útil para bebés 1.0

Iniciado por Eleкtro, 11 Enero 2013, 03:57 AM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

UPS, ME EQUIVOQUÉ DE SECCIÓN, LO PUEDEN MOVER A VB.NET PORFAVOR? XD SORRY










Estaba ayudando a un user que no sabía como usar una barra de progreso, y bueno, hice este form.

Cuando lo completé me dí cuenta de que a mi me habría servido cuando no sabía hacer nada de esto, así que quiero compartirlo por si a alguien le puede servir :xD

Cita de: Yo en otro foroCon mi ejemplo puedes aprender a...:
· Crear / Añadir controles en tiempo de ejecución,
· Modificar algunas propiedades de controles
· Asociar el evento de un control en tiempo de ejecución a una subrutina
· Usar las variables de entorno
· Obtener todos los archivos de un directorio
· Crear un array y procesar su contenido
· Usar y conocer una barra de progreso,
· Algunos métodos útiles como "Update"

Eso sí, sin threads, esto es un ejemplo MUY básico.

PD: En serio, no quiero comentarios como "Esto no vale nada", si no te gusta no comentes, a un novato le servirá.

 


Código (vbnet) [Seleccionar]
Public Class Form1


   ' Declaro los controles que vamos a usar en este form:
   Dim Label_Origen As New Label
   Dim Label_Destino As New Label
   Dim Label_FileName As New Label
   Dim Label_Restantes As New Label
   Dim WithEvents Button_Copiar As New Button
   Dim ProgressBar_1 As New ProgressBar


   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

       Me.Size = New Point(420, 320)
       ' Le otorgo las propiedades a los controles
       ' -------------------------------------------------------
       ' Label Origen
       Dim Fuente As New Font("Sans Serif", 20, FontStyle.Regular) ' Seteo la fuente personalizada que quiero usar, porque me apetece usar una distinta y así aprendes xD
       Label_Origen.Font = Fuente
       Label_Origen.Text = "Origen: " & Environment.GetFolderPath(Environment.SpecialFolder.Windows) & "\Fonts"
       Label_Origen.AutoSize = False
       Label_Origen.Size = New Point(640, 40)
       Label_Origen.Location = New Point(0, 0)
       ' Label Destino
       Label_Destino.Font = Fuente
       Label_Destino.Text = "Destino: " & Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) & "\Test" ' O Environment.SpecialFolder.ProgramFilesX86
       Label_Destino.AutoSize = False
       Label_Destino.Size = New Point(640, 40)
       Label_Destino.Location = New Point(0, 50)
       ' Botón Copiar
       Button_Copiar.Size = New Point(180, 80)
       Button_Copiar.Text = "Copiar!"
       Button_Copiar.Location = New Point(100, 100)
       AddHandler Button_Copiar.Click, AddressOf Button_Copiar_Sub ' Añado el evento "Click" que sucede cuando pinchas el botón, y se llama a la subrutina "Button_Copiar_Sub"
       ' ProgressBar_1
       ProgressBar_1.Size = New Point(180, 20)
       ProgressBar_1.Location = New Point(100, 200)
       ' Label FileName
       Label_FileName.AutoSize = True
       Label_FileName.Location = New Point(100, 230)
       ' Label Restantes
       Label_Restantes.AutoSize = True
       Label_Restantes.Location = New Point(100, 250)

       ' Añado los controles al form principal:
       Me.Controls.Add(Label_Origen)
       Me.Controls.Add(Label_Destino)
       Me.Controls.Add(Button_Copiar)
       Me.Controls.Add(ProgressBar_1)
       Me.Controls.Add(Label_FileName)
       Me.Controls.Add(Label_Restantes)
   End Sub


   Private Sub Button_Copiar_Sub(sender As Object, e As EventArgs)

       ' Seteo las variables de origen y destino de carpetas
       Dim Origen As String = Label_Origen.Text.Split(" ")(1)
       Dim Destino As String = Label_Destino.Text.Split(" ")(1)

       ' Creo un array con todos los archivos del directorio de origen
       Dim Directory As New System.IO.DirectoryInfo(Origen)
       Dim Array_Files As System.IO.FileInfo() = Directory.GetFiles("*")

       ' A la progressBar tenemos que darle un valor "Máximo" (SIEMPRE) (El máximo por defecto es 100, pero si tenemos 101 archivos nos joderá porque no podemos sobrepasar el Máximo),
       ' Ese valor en este caso es el número total de archivos que contiene el directorio.
       ProgressBar_1.Maximum = Array_Files.Length

       ' Por cada archivo del Array, sumamos un valor a la ProgressBar, y realizamos las operaciones de copiado o lo que queramos...
       For Each File In Array_Files
           Label_FileName.Text = "Archivo copiado: " & File.Name
           Label_FileName.Update() ' Como no estoy usando threads, tengo que actualizar el estado del label para darle prioridad y que se muestre correctamente, lo cúal ralentiza bastante (BASTANTE) el proceso. Para estas cosas ya te digo que se deben usar Threads + delegados
           Threading.Thread.Sleep(20) ' Le hago esperar 20 ms a este hilo símplemente para que veas bien como se actualiza el proceso de la barra de progreso.
           ProgressBar_1.Value += 1
           Label_Restantes.Text = "Faltan " & (ProgressBar_1.Maximum - ProgressBar_1.Value) & " archivos por copiarse"
           Label_Restantes.Update() ' Otra vez el update necesario para poder mostrar el estado del label, más ralentización para el hilo, de verdad, estudia sobre los threads y cuando sepas algo te ayudaré a entenderlos y usarlos.
       Next

       ' Devolvemos los valores originales a la ProgressBar y modificamos los valores de los labels
       ProgressBar_1.Value = 0
       ProgressBar_1.Maximum = 100
       Label_FileName.Text = Nothing
       Label_Restantes.Text = "Todos los archivos copiados."

   End Sub


End Class