elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Obtener porcentaje de descarga desde un módulo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Obtener porcentaje de descarga desde un módulo  (Leído 3,343 veces)
okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Obtener porcentaje de descarga desde un módulo
« en: 1 Julio 2015, 19:18 pm »

Hola,

Pues aquí otra nueva duda.

No me gusta cargar demasiado de código el Form1, así que suelo poner las funciones por separado en módulos, o en módulos de clases.  El caso es que tengo un código de descarga de archivos desde un módulo y no consigo mostrar el proceso de descarga desde él.

Código
  1. Imports System.Net
  2. Module modDownloadURL
  3.    Public Progress As String
  4.    Private Sub DownloadProgressCallback(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
  5.        Dim intBytes As Double = Double.Parse(e.BytesReceived.ToString()) 'Bytes recibidos
  6.        Dim AllBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString()) 'Total bytes recibidos
  7.        Dim percentage As Double = intBytes / AllBytes * 100
  8.        Progress = CStr(e.ProgressPercentage & (" %"))
  9.    End Sub
  10.    Private Sub Client_DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
  11.        MessageBox.Show("Descarga completada")
  12.    End Sub
  13.  
  14.    Public Sub DownLoadFileInBackground2(ByVal address As String, ByVal strDirFile As String)
  15.        Dim Client As WebClient = New WebClient()
  16.        AddHandler Client.DownloadProgressChanged, AddressOf DownloadProgressCallback
  17.        AddHandler Client.DownloadFileCompleted, AddressOf client_DownloadCompleted
  18.        Dim uri As Uri = New Uri(address)
  19.        Client.DownloadFileAsync(uri, strDirFile)
  20.    End Sub
  21. End Module
  22.  

El porcentaje se carga en la variable string Progress  , y desde un botón en el formulario llamo a DownLoadFileInBackground2(url, [Dir+Namefile]) para descargar el archivo

Gracias



« Última modificación: 1 Julio 2015, 19:53 pm por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.698



Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #1 en: 1 Julio 2015, 19:56 pm »

Habría que analizar lo que haces con el Control de tipo Label, por que el código que has mostrado funciona.

De todas formas lo he simplificado (un poco) y he corregido varios conflictos de convención o estándares de VB.Net en los nombres que le diste a los miembros del código.

Esto te debería funcionar. Adapta el código a tus necesidades.

Código
  1. DownLoadAsynchronously("http://download.thinkbroadband.com/5MB.zip")

Código
  1. Module ModDownloadUrl
  2.  
  3.    Private WithEvents wc As WebClient
  4.  
  5.    Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) _
  6.    Handles wc.DownloadProgressChanged
  7.  
  8.        If Not e.ProgressPercentage = 100 Then
  9.            Trace.WriteLine(String.Format("Progress: {0}", ((e.BytesReceived / e.TotalBytesToReceive) * 100.0R).ToString(format:="00.00 \%")))
  10.        End If
  11.  
  12.    End Sub
  13.  
  14.    Private Sub WC_DownloadFileCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs) _
  15.    Handles wc.DownloadFileCompleted
  16.  
  17.        wc.Dispose()
  18.        Trace.WriteLine(String.Format("Progress: {0}", 100.0R.ToString(format:="00.00 \%")))
  19.        MessageBox.Show("Download Complete.", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
  20.  
  21.    End Sub
  22.  
  23.    Public Sub DownLoadAsynchronously(ByVal url As String,
  24.                                      Optional ByVal targetFilepath As String = "",
  25.                                      Optional ByVal ctrl As Control = Nothing)
  26.  
  27.        If String.IsNullOrWhiteSpace(targetFilepath) Then
  28.            targetFilepath = Path.GetFileName(url)
  29.        End If
  30.  
  31.        wc = New WebClient
  32.        wc.DownloadFileAsync(New Uri(url), targetFilepath)
  33.  
  34.    End Sub
  35.  
  36. End Module

Saludos


« Última modificación: 1 Julio 2015, 21:32 pm por Eleкtro » En línea


okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #2 en: 2 Julio 2015, 00:32 am »

Hola
Gracias por el código, funciona bien, pero no he conseguido que haga lo siguiente, ni aún añadiendo el opcional. Quizás es que no lo utilizo bien.

Lo que yo quería era pasar el porcentaje  a la variable Progress, para luego desde el Form capturar la información de esa variable y mostrarlo en un Label mientras se produce la descarta y en tiempo real, desde el evento Click. Pero pasa que  el label se queda en blanco. Tan solo muestra la información cuando hago esto, desde el módulo. Sustituyendo directamente la variable Progress por el control Label

Código
  1. Private Sub DownloadProgressCallback(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
  2.        Dim intBytes As Double = Double.Parse(e.BytesReceived.ToString()) 'Bytes recibidos
  3.        Dim AllBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString()) 'Total bytes recibidos
  4.        Dim percentage As Double = intBytes / AllBytes * 100
  5.       Form1.Label1.text = CStr(e.ProgressPercentage & (" %"))
  6.    End Sub

Con tu código quedaría así:

Código
  1.    Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) Handles wc.DownloadProgressChanged
  2.        If Not e.ProgressPercentage = 100 Then
  3.            Form1.Label1.Text = String.Format("Progress: {0}", ((e.BytesReceived / e.TotalBytesToReceive) * 100.0R).ToString(format:="00.00 \%"))
  4.        End If
  5.    End Sub

Pero lo extraño es que la el porcentaje se para en 94%, 89%, etc. Nunca en 100%, aunque el archivo se descargue por completo. He usado el url de un archivo pequeño (el de mi avatar, el gif).

Queda corregido sustituyendo 100 por 101
Código
  1. Not e.ProgressPercentage = 101

Probaré mañana, si puedo, creando un módulo de clase. Con la propiedad Get, creo que debería funcionar.

La idea es crear una función de código independiente y aparte sin tener que estar modificando dicho código para que devuelva la información de descarga a un determinado control.

Sl2
« Última modificación: 2 Julio 2015, 00:46 am por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.698



Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #3 en: 2 Julio 2015, 08:53 am »

Cómo ya te digo, habría que ver el resto del código, por que las modificaciones que comentas en mi caso me funcionan correctamente, el label se actualiza correctamente.

De todas formas que estés utilizando un módulo para operaciones asíncronas, objetos disposables, y eventos, no me convence en absoluto, no debería causarte problemas, pero tampoco hay necesidad de que los miembros definidos en ese modulo sean compartidos con el resto de classes, por ese motivo yo usaría una Class instanciable y liberaría los objetos cuando sea necesario.

Aparte de eso, en otras circunstancias te diría que utilizases un BackgroundWorker, pero en este caso considero que sería practicamente el mismo resultado.

Prueba esto, si no te funciona entonces no sé que decirte a menos que muestres tu código completo para buscar un posible problema que en el código que has mostrado hasta ahora no aparece o no lo puedo detectar.

Así es más o menos cómo yo encapsularía esos datos:

Código
  1. #Region " Imports "
  2.  
  3. Imports System
  4. Imports System.ComponentModel
  5. Imports System.IO
  6. Imports System.Linq
  7. Imports System.Net
  8. Imports System.Windows.Forms
  9. Imports System.Threading.Tasks
  10.  
  11. #End Region
  12.  
  13. Public NotInheritable Class FileDownloader : Implements IDisposable
  14.  
  15. #Region " Disposable Members "
  16.  
  17.    Private WithEvents wc As WebClient
  18.  
  19. #End Region
  20.  
  21. #Region " Properties "
  22.  
  23.    Public ReadOnly Property IsBusy As Boolean
  24.        Get
  25.            If Me.wc IsNot Nothing Then
  26.                Return Me.wc.IsBusy
  27.            Else
  28.                Return False
  29.            End If
  30.        End Get
  31.    End Property
  32.  
  33. #End Region
  34.  
  35. #Region " Events "
  36.  
  37.    Public Event DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
  38.    Public Event DownloadCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
  39.  
  40. #End Region
  41.  
  42. #Region " Event-Handlers "
  43.  
  44.    Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) _
  45.    Handles wc.DownloadProgressChanged
  46.  
  47.        If (Me.DownloadProgressChangedEvent IsNot Nothing) AndAlso (e.ProgressPercentage <> 100) Then
  48.            RaiseEvent DownloadProgressChanged(sender, e)
  49.        End If
  50.  
  51.    End Sub
  52.  
  53.    Private Sub WC_DownloadFileCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs) _
  54.    Handles wc.DownloadFileCompleted
  55.  
  56.        If (Me.DownloadCompletedEvent IsNot Nothing) Then
  57.            RaiseEvent DownloadCompleted(sender, e)
  58.        End If
  59.  
  60.    End Sub
  61.  
  62. #End Region
  63.  
  64. #Region " Public Methods "
  65.  
  66.    Public Sub DownloadAsync(ByVal url As String,
  67.                             Optional ByVal targetFilepath As String = "")
  68.  
  69.        If String.IsNullOrWhiteSpace(url) Then
  70.            Throw New ArgumentNullException(paramName:="url")
  71.  
  72.        Else
  73.  
  74.            If (Me.wc IsNot Nothing) AndAlso (Me.wc.IsBusy) Then
  75.                Throw New Exception(message:="Another download is in progress.")
  76.  
  77.            Else
  78.                Me.wc = New WebClient With
  79.                 {
  80.                     .UseDefaultCredentials = True
  81.                 }
  82.  
  83.                If String.IsNullOrWhiteSpace(targetFilepath) Then
  84.                    targetFilepath = Path.GetFileName(url)
  85.                End If
  86.  
  87.                Task.Factory.StartNew(Sub() wc.DownloadFileAsync(New Uri(url), targetFilepath))
  88.  
  89.            End If
  90.  
  91.        End If
  92.  
  93.    End Sub
  94.  
  95.    ''' <summary>
  96.    ''' Cancels the current asynchronous download.
  97.    ''' </summary>
  98.    Public Sub Cancel()
  99.  
  100.        If Me.wc Is Nothing Then
  101.            Throw New NullReferenceException(message:="", innerException:=New ObjectDisposedException(objectName:="wc"))
  102.  
  103.        ElseIf Me.wc.IsBusy Then
  104.            Me.wc.CancelAsync()
  105.  
  106.        End If
  107.  
  108.    End Sub
  109.  
  110. #End Region
  111.  
  112. #Region "IDisposable Support"
  113.  
  114.    ''' ----------------------------------------------------------------------------------------------------
  115.    ''' <summary>
  116.    ''' To detect redundant calls when disposing.
  117.    ''' </summary>
  118.    ''' ----------------------------------------------------------------------------------------------------
  119.    Private isDisposed As Boolean = False
  120.  
  121.    ''' ----------------------------------------------------------------------------------------------------
  122.    ''' <summary>
  123.    ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
  124.    ''' </summary>
  125.    ''' ----------------------------------------------------------------------------------------------------
  126.    Public Sub Dispose() Implements IDisposable.Dispose
  127.        Me.Dispose(isDisposing:=True)
  128.        GC.SuppressFinalize(obj:=Me)
  129.    End Sub
  130.  
  131.    ''' ----------------------------------------------------------------------------------------------------
  132.    ''' <summary>
  133.    ''' Releases unmanaged and - optionally - managed resources.
  134.    ''' </summary>
  135.    ''' ----------------------------------------------------------------------------------------------------
  136.    ''' <param name="isDisposing">
  137.    ''' <c>True</c> to release both managed and unmanaged resources;
  138.    ''' <c>False</c> to release only unmanaged resources.
  139.    ''' </param>
  140.    ''' ----------------------------------------------------------------------------------------------------
  141.    Protected Sub Dispose(ByVal isDisposing As Boolean)
  142.  
  143.        If Not Me.isDisposed Then
  144.  
  145.            If isDisposing Then
  146.  
  147.                If Me.wc IsNot Nothing Then
  148.                    Me.wc.Dispose()
  149.                End If
  150.  
  151.            End If
  152.  
  153.        End If
  154.  
  155.        Me.isDisposed = True
  156.  
  157.    End Sub
  158.  
  159. #End Region
  160.  
  161. End Class

Y el uso que le daría ...más o menos también:

Código
  1. Imports System.ComponentModel
  2. Imports System.Threading.Tasks
  3.  
  4. Public NotInheritable Class Form1 : Inherits Form
  5.  
  6.    Dim WithEvents downloader As New FileDownloader
  7.  
  8.    Private Sub Test() Handles MyBase.Shown
  9.  
  10.        Me.downloader.DownloadAsync("http://download.thinkbroadband.com/10MB.zip")
  11.  
  12.    End Sub
  13.  
  14.    Private Sub Button1_Click(sender As Object, e As EventArgs) _
  15.    Handles Button1.Click
  16.  
  17.        If Me.downloader.IsBusy Then
  18.            Me.downloader.Cancel()
  19.        End If
  20.  
  21.    End Sub
  22.  
  23.    Private Sub Downloader_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) _
  24.    Handles downloader.DownloadProgressChanged
  25.  
  26.        Dim progress As Double = (e.BytesReceived / e.TotalBytesToReceive) * 100.0R
  27.  
  28.        If Me.Label1.InvokeRequired Then
  29.            Me.Label1.Invoke(Sub() Me.Label1.Text = progress.ToString(format:="00.00 \%"))
  30.  
  31.        Else
  32.            Me.Label1.Text = progress.ToString(format:="00.00 \%")
  33.  
  34.        End If
  35.  
  36.    End Sub
  37.  
  38.    Private Sub Downloader_DownloadCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs) _
  39.    Handles downloader.DownloadCompleted
  40.  
  41.        If e.Cancelled Then
  42.            Exit Sub
  43.        End If
  44.  
  45.        If Me.Label1.InvokeRequired Then
  46.            Me.Label1.Invoke(Sub() Me.Label1.Text = 100.0R.ToString(format:="00.00 \%"))
  47.  
  48.        Else
  49.            Me.Label1.Text = 100.0R.ToString(format:="00.00 \%")
  50.  
  51.        End If
  52.  
  53.    End Sub
  54.  
  55. End Class

Saludos.
« Última modificación: 2 Julio 2015, 09:20 am por Eleкtro » En línea


okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #4 en: 2 Julio 2015, 20:38 pm »

Eres un maestro

Lo que busco es tan simple como esto, y te juro que el label se queda en blanco, la verdad que no lo entiendo

Código
  1. Public Class Form1
  2.  
  3.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4.        Dim ns As New modDownloadURL
  5.        ns.DownLoadFileInBackground2("http://3.bp.blogspot.com/-08K8K-44ouk/VYg40YxJvxI/AAAAAAAAARw/wrLQDfGDW-8/s1600/OKIK2.gif", _
  6. "E:\jk.gif")
  7.        Label1.Text = ns.getProgress
  8.    End Sub
  9. End Class
  10.  
  11. Class modDownloadURL
  12.    Public Progress As Object
  13.    Private Sub DownloadProgressCallback(ByVal sender As Object, _
  14. ByVal e As System.Net.DownloadProgressChangedEventArgs)
  15.        Dim intBytes As Double = Double.Parse(e.BytesReceived.ToString()) 'Bytes recibidos
  16.        Dim AllBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString()) 'Total bytes recibidos
  17.        Dim percentage As Double = intBytes / AllBytes * 100
  18.        Progress = (e.ProgressPercentage & (" %"))
  19.    End Sub
  20.    Private Sub Client_DownloadCompleted(ByVal sender As Object, _
  21. ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
  22.        MessageBox.Show("Descarga completada")
  23.    End Sub
  24.  
  25.    Public Sub DownLoadFileInBackground2(ByVal address As String, _
  26. ByVal strDirFile As String)
  27.        Dim Client As System.Net.WebClient = New System.Net.WebClient()
  28.        AddHandler Client.DownloadProgressChanged, AddressOf DownloadProgressCallback
  29.        AddHandler Client.DownloadFileCompleted, AddressOf Client_DownloadCompleted
  30.        Dim uri As Uri = New Uri(address)
  31.        Client.DownloadFileAsync(uri, strDirFile)
  32.    End Sub
  33.    ReadOnly Property getProgress() As String
  34.        Get
  35.            Return Progress
  36.        End Get
  37.    End Property
  38.  
  39. End Class

Me ha gustado tu opción de cancelar, también buscaba eso...
« Última modificación: 2 Julio 2015, 20:41 pm por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.698



Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #5 en: 2 Julio 2015, 21:02 pm »

Lo que busco es tan simple como esto

¿Ese es el código completo que estás utilizando?, en ese caso, ¿còmo esperas que no se quede en blanco el label?, jeje, estás devolviendo un objeto una única vez, un objeto vacío/nulo.

En resumidas cuentas, descartando el resto del código esta es la trayectoria que haces, de la linea 5 a la 15, FIN.

Código
  1.    Public Class Form1
  2.  
  3.        Private Sub Button1_Click(...) Handles Button1.Click
  4.            ...
  5.            Label1.Text = ns.getProgress
  6.        End Sub
  7.  
  8.    End Class
  9.  
  10.    Class modDownloadURL
  11.        Public Progress As Object
  12.  
  13.        ReadOnly Property getProgress() As String
  14.            Get
  15.                Return Progress
  16.            End Get
  17.        End Property
  18.  
  19.    End Class

Primero llamas al método que descarga el archivo, y mientras tanto asignas el texto al label, pero solo lo asignas una vez, y el valor seguramente esté en blanco por que al objeto "Progress" no lo inicializaste con un valor inicial y el texto del label se asigna más rápido de lo que la operación asincrona tarda en disparar el evento del WebClient para asignarle un valor inicial a ese objeto "Progress".

Vamos, que despues de la primera vez que le asignas el texto vacío al label, no llegas a actualizar el texto del label nunca más.

Debes controlar cuando los eventos del Webclient se disparan, para actualizar el texto del label cuando eso suceda (cómo en el ejemplo que he publicado arriba).
El control no se va a actualizar por arte de magia.


¿Hay algo que no entiendas de tú código, de lo que estás haciendo?.


Saludos!
« Última modificación: 2 Julio 2015, 21:06 pm por Eleкtro » En línea


okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #6 en: 3 Julio 2015, 14:18 pm »

 ;D
La verdad es que en muchos casos en .NET no tengo ni idea de lo que hago, solo se que esto o lo otro funciona o hace esto o  aquello. En fin que hace lo que yo quiero.

Voy a aclarar algunos puntos.
A. No soy programador, solo aficionado. No trabajo para ninguna empresa ni tengo intención de ello, ni creo que pueda.

B. Acabo de empezar con VB.NET hace como un par de meses o tres, más o menos. Empecé tonteando un poco para adaptarme al entorno, del cual solo he usado seguramente como el 2% de lo que tiene.

C. No soy "programador" de escuela, ni de libro, es decir, no estudio la teoría, aprendo de forma empírica. Quiero hacer algo y busco la forma. Muchas veces es a base de prueba y error. Por supuesto entiendo conceptos como array, bucles, funciones, eventos, etc. y leo definiciones, que muchas veces tengo que decirlo no las entiendo. Por ejemplo, hace unos días pregunté sobre el operador XOR porque por la definición del MSDN no entendía ni papa. Pero afortunadamente dos usuarios respondieron de forma fantástica y pude entenderlo.

D.
Código
  1. ¿Ese es el código completo que estás utilizando?

Me gusta programar por bloques, algo así como una conexión en red pero de código. No me gusta mezclarlo todo, porque en el momento que se me ocurre algo y quiero hacer una modificación, puede resultar o bien que  la modificación produzca un error que me obliga a modificar todo  o empezar casi desde el principio por incompatibilidad o bien haya pasado tanto tiempo desde que revisé el código que ya no recuerdo ni lo que hice y no se lo que hacía esto o aquello, sobre todo con códigos muy grandes.
También facilita y agiliza la creación  de programas pues solo tengo que hacer un copia y pega. Tengo cientos de plantillas de código simple y ejemplos sólo de VB, los cuales hacen lo básico y lo importante. Por supuesto son modificables y ajustables  a la necesidades del programa.
Y por supuesto mi me memoria es pésima, cuando dejo de usar algo se me olvida, y es muy práctico tener un código de ejemplo para cuando lo necesite.

El código que he puesto NO es el programa que estoy haciendo, tan sólo quiero hacer como he dicho un bloque de código independiente que me va a servir para el programa o para futuros programas.  Tan sólo quiero:

Form1 (o cualquier otro, o módulo)
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-Llama a la función y la URL
-Recibir información de descarga mientras se produce
-Opción cancelar
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
               ▲
                •
                •
                •
               ▼
Bloque de código aparte
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- Función de descarga con la URL  
- Obtener información de descarga
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Por lo tanto como ejemplo y como base, tan solo necesito un label el cual va a recibir la información del porcentaje, todo lo demás es irrelevante.

A veces encuentro en la red, que gente pone ejemplos supercomplejos, casi programas completos, con variables incomprensibles,  por ejemplo como usar un Listview, y en lugar de decir para crear columnas, tal, para introducir filas, tal, para esto tal. Pues te ponen un entramado inconprensible que tienes que ir desglosando. Lo cual dificulta el aprendizaje de aquellos que están aprendiendo y solo buscan algo muy concreto. Además, no todos somos unos gurús de la informática. Esto me ha pasado especialmente, buscando información sobre GDI, que siempre aparecen ejemplo de programas completos y bastante complejos. Hace poco modifiqué un programa de Leandro (no se qué) que semitransparenta un Form de modo que se vean nítidamente los controlos y demás pero el fondo del form sea semitransparente. Pero tengo que decir que no comprendo el código completo. Tuve que modificarlo porque su código degradaba el form en dos colores sin opción o propiedad 'set' para cambiar dichos colores o ponerlo todo a un solo color. También hace poco también puse un ejemplo muy sencillo para convertir una imagen en blanco y negro con GDI. Poniendo lo básico, sin florituras.
 
Estas cosas:
AddHandler, Task, WithEvents, RaiseEvent ,IsNullOrWhiteSpace, InvokeRequired

todavía no se como van, es nuevo para mí, tendré que mirar uno por uno para poder entender el código y conseguir lo que busco.

Intentaré conseguir lo más básico y simple posible y luego lo colgaré.

Sl2



 

« Última modificación: 3 Julio 2015, 14:24 pm por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.698



Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #7 en: 3 Julio 2015, 17:00 pm »

No trabajo para ninguna empresa ni tengo intención de ello, ni creo que pueda.

No te preocupes, la mayoría de usuarios (y moderadores) tampoco trabajamos para empresas, si lo hicieramos probablemente no tendriamos tiempo para pasarnos a ayudar por aquí a los demás, cómo es el caso de algún que otro moderador que si se dedica a la programación profesional y que ya no se le ve el pelo por el foro...



B. Acabo de empezar con VB.NET hace como un par de meses o tres, más o menos.
Empecé tonteando un poco para adaptarme al entorno, del cual solo he usado seguramente como el 2% de lo que tiene.

Si acabas de empezar hace unos meses entonces no has podido llegar a tocar ni un 0,2% en ese tiempo. No exagero, creeme, la librería de classes de .Net Framework es colosalmente extensa, más de lo que te puedes imaginar, igual que todos los conceptos que se pueden aprender.



Estas cosas:
AddHandler, Task, WithEvents, RaiseEvent ,IsNullOrWhiteSpace, InvokeRequired

todavía no se como van, es nuevo para mí, tendré que mirar uno por uno para poder entender el código y conseguir lo que busco.

La declaración AddHandler asocia un evento a un método.

La declaración RemoveHandler desaasocia un evento de un método.

La declaración RaiseEvent dispara un evento.

El keyword WithEvents indica que el objeto declarado puede disparar eventos, por ende, esto posibilita que se pueda usar directamente el keyword Handles para declarar el evento que controla un método (ej: sub metodo() Handles evento; Esto así mismo evita la necesitad de llenar el código con las sentencias AddHandler y RemoveHandler, queda muy feo cuando no es necesario hacerlo.

La extensión o función String.IsNullOrWhiteSpace determina si un string es nulo, vacío, o solo contiene espacios en blanco.

El método Threading.Tasks.Task.Factory.StartNew invoka un método encapsulado en un delegado o expresión Lambda, en un nuevo hilo (thread).

La propiedad Control.InvokeRequired determina si un control debe ser invocado, esto será así siempre que se intente llamar al control desde un hilo distinto al hilo donde se creó el control, de lo contrario, si no se invoca en dicha condición, se producirá una excepción de tipo Cross-Thread Exception.



Citar
buscando información sobre GDI, que siempre aparecen ejemplo de programas completos y bastante complejos.

Bueno, ese argumento es discutible, por que GDI/GDI+ de por si ya es algo complejo según se mire, hay características muy sencillas pero también otras muchas que se dificultan.



Hace poco modifiqué un programa de Leandro (no se qué) que semitransparenta un Form de modo que se vean nítidamente los controlos y demás pero el fondo del form sea semitransparente.

Pero tengo que decir que no comprendo el código completo. Tuve que modificarlo porque su código degradaba el form en dos colores sin opción o propiedad 'set' para cambiar dichos colores o ponerlo todo a un solo color.

Un consejo:
Olvida todos esos hacks para hacer transparente o semi-transparente un Form, WinForms no fue pensado ni está capacitado (de forma natural) para ese tipo de cosas, la transparencia y WinForms se llevan muy mal.

Todo ese tipo de códigos "transparentes" provocan un efecto muy negativo en la app, ya que ralentizan el form (todo lo que compone el form, sus controles), y mucho más si en dicho código se ua el hack de suplantar la función CreateParams para reducir el flickering. Si hicieses cualquier tipo de test de rendimiento en una app "transparente" (el tiempo que tarda un RichTextBox en mostrar X cantidad de caracteres por ejemplo) te dará resultados nefastos, y, si eres tan meticuloso (o tiquismiquis) cómo yo en ese sentido, entonces no querrás volver a hacer transparente una app utilzando ese tipo de técnicas esotéricas.

Confórmate con la manera natural de hacer transparente las cosas, ajustando la propiedad TransparencyKey.

Si quieres hacer algo más del estilo de ese tipo de códigos que mencionas, entonces olvida WinForms y ponte a programar en tecnología WPF, que está considerablemente más extendido en ese sentido, y en todos los demás sentidos también, ya que WPF es el sucesor de WinForms, y WPF sigue estando en desarrollo/actualización por parte de Microsoft, cosa que WinForms no.



porque en el momento que se me ocurre algo y quiero hacer una modificación, puede resultar o bien que  la modificación produzca un error que me obliga a modificar todo  o empezar casi desde el principio por incompatibilidad o bien haya pasado tanto tiempo desde que revisé el código que ya no recuerdo ni lo que hice y no se lo que hacía esto o aquello, sobre todo con códigos muy grandes.

Y por supuesto mi me memoria es pésima, cuando dejo de usar algo se me olvida, y es muy práctico tener un código de ejemplo para cuando lo necesite.

Existe algo llamado lineas de comentario (o documentación), aplícalo a tus códigos y no deberías tener problemas de memoria en el futuro :P, preferiblemente la documentación XML de .Net + la característica IntelliSense en la IDE o unas llamadas al Object Inspector, con eso es imposible perderte en códios grandes que estén XML-documentados.

En el código de ejemplo que publiqué arriba puedes ver un ejemplo de documentación XML para un método y sus parámetros:

Citar
Código
  1.    ''' ----------------------------------------------------------------------------------------------------
  2.    ''' <summary>
  3.    ''' Releases unmanaged and - optionally - managed resources.
  4.    ''' </summary>
  5.    ''' ----------------------------------------------------------------------------------------------------
  6.    ''' <param name="isDisposing">
  7.    ''' <c>True</c> to release both managed and unmanaged resources;
  8.    ''' <c>False</c> to release only unmanaged resources.
  9.    ''' </param>
  10.    ''' ----------------------------------------------------------------------------------------------------
  11.    Protected Sub Dispose(ByVal isDisposing As Boolean)
  12.       ...
  13.    End Sub

La documentación XML además también te permite añadir ejemplos de código con los tags: <example><code>CÓDIGO AQUÍ</code></example>, y muchas cosas más.

No se si lo he dejado del todo claro, pero por si no lo has pillado lo diré con otras palabras:
Cuando pasas el puntero del mouse por el nombre de un miembro en la IDE y te sale un tooltip con una descripción del miembro y de sus parámetros y tal, pues eso es lo que se consigue con la documentación XML, además la misma documentación también sirve para crear el archivo de referencia de una API, es decir, se documenta con XML los miembros de una librería .dll y se refleja toda esa información al compilar la dll en un archivo de ayuda (.chm, .html, pdf, etc).



Tengo cientos de plantillas de código simple y ejemplos sólo de VB, los cuales hacen lo básico y lo importante. Por supuesto son modificables y ajustables  a la necesidades del programa.

Quizás te pueda interesar este hilo:

Librería de Snippets para VB.Net !! (Compartan aquí sus snippets)



Citar
Tan sólo quiero:

Form1 (o cualquier otro, o módulo)
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-Llama a la función y la URL
-Recibir información de descarga mientras se produce
-Opción cancelar
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
               ▲
                •
                •
                •
               ▼
Bloque de código aparte
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- Función de descarga con la URL  
- Obtener información de descarga
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Por lo tanto como ejemplo y como base, tan solo necesito un label el cual va a recibir la información del porcentaje, todo lo demás es irrelevante.

Bien, ¿pero hay algún problema con eso?, ¿el código que te mostré no te ha servido?.

Saludos!
« Última modificación: 3 Julio 2015, 17:04 pm por Eleкtro » En línea


okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #8 en: 9 Julio 2015, 23:34 pm »

Citar
Si acabas de empezar hace unos meses entonces no has podido llegar a tocar ni un 0,2% en ese tiempo. No exagero, creeme, la librería de classes de .Net Framework es colosalmente extensa, más de lo que te puedes imaginar, igual que todos los conceptos que se pueden aprender.

Manuel :  Madre mía, el tren habrá pasado a la velocidad de la luz por lo menos
Jose:  No creo que haya pasado a esa velocidad, esos trenes lo máximo a lo que pueden ir es a 320 km/h

Evidentemente, es un decir, una forma de hablar. En el ejemplo de arriba Manuel quiere decir que el tren iba muy rápido y en mi caso que he usado muy poco.  Entiendo que como moderador hayas cogido “vicios” y puntillees  todo, pero esto, es demasiado.

Citar
La declaración AddHandler asocia un evento a un método.
La declaración RemoveHandler desaasocia un evento de un método.
La declaración RaiseEvent dispara un evento.

Si ya lo pone en el MSDN, en la ayuda de VB.NET incluso con ejemplos, pero ¿Cómo se usan? A eso me refiero con que tengo que mirármelo. Está bien que lo pongas, pero es innecesario, "El objeto Array permite la creación de matrices de cualquier tipo de datos” ¿Si yo no se usar un Array o lo que es esto me ayuda en algo?, No, vale, sabrá que “permite la creación de matrices de cualquier tipo de datos” pero ya está.  Se lo que es un array, y poniéndome en el lugar de otra persona que no lo sepa, no veo en qué le puede ayudar esa definición. De todos modos, se mirar el MSDN, hasta ahí llego. De hecho el código de descarga que dices que tiene “conflictos de convención”, lo he sacado de ahí.

Código
  1.       '  Sample call : DownLoadFileInBackground2 ("http:' www.contoso.com/logs/January.txt")
  2.        Public Shared Sub DownLoadFileInBackground2(ByVal address As String)
  3.  
  4.            Dim client As WebClient = New WebClient()
  5.  
  6.            '  Specify that the DownloadFileCallback method gets called
  7.            '  when the download completes.
  8.            AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCallback2
  9.            '  Specify a progress notification handler.
  10.            AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressCallback
  11.                        Dim uri as Uri = New Uri(address)
  12.            client.DownloadFileAsync(uri, "serverdata.txt")
  13.        End Sub
  14.  
  15.  
  16.  
  17. Private Shared Sub UploadProgressCallback(ByVal sender As Object, ByVal e As UploadProgressChangedEventArgs)
  18.  
  19.    '  Displays the operation identifier, and the transfer progress.
  20.    Console.WriteLine("{0}    uploaded {1} of {2} bytes. {3} % complete...", _
  21.     CStr(e.UserState), e.BytesSent, e.TotalBytesToSend, e.ProgressPercentage)
  22. End Sub
  23. Private Shared Sub DownloadProgressCallback(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
  24.  
  25.    '  Displays the operation identifier, and the transfer progress.
  26.    Console.WriteLine("0}    downloaded 1} of 2} bytes. 3} % complete...", _
  27.     CStr(e.UserState), e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage)
  28. End Sub



Citar
Olvida todos esos hacks para hacer transparente o semi-transparente un Form, WinForms no fue pensado ni está capacitado (de forma natural) para ese tipo de cosas, la transparencia y WinForms se llevan muy mal.

Lo de esos "hacks", que no se a que viene lo de "hack". Ya que, que yo sepa hack, viene de "to hack into a computer" que es "Entrar ilegalmente en un ordenador". Pero bueno, la filología inglesa no es mi fuerte.
Lo de usar GDI para semitransparentar el Form, no lo he dicho, pero era en VB6. Creí lo  entenderías pues ya te comenté que yo soy de los que han pasado de VB6 a VB.Net.

Citar
Existe algo llamado líneas de comentario (o documentación)

Como Moderador Global supongo que habrás visto algunas de mis respuestas a otros usuarios, especialmente en VB6 ya que en .net creo que solo he respondido como loguear una web y clicar un botón de una web desde nuestro programa. Puede que alguna cosilla más. Verás que he usado "líneas de comentario" pero, aún así cuando el programa es grande a veces puede ser todo muy confuso aún con las líneas de comentarios. Sobre todo cuando se trata de algoritmos para solucionar problemas matemáticos en las que se usan muchas variables y he usado nombres breves. Si que puedo poner:
'A es esto
'B es cual

Pero se te hace eterno hacer el programa, solo pongo comentarios generales y no puntuales. También ocurre que hay cosas que me parecen muy obvias para hacer comentario en ese momento, pero que con el tiempo se olvidan. Además hay cosas que es difícil de transcribir de lenguaje de programación a lenguaje coloquial.  Pero bueno que si tu no tienes problemas con eso me parece fantástico, pero no es mi caso.

Citar
"Tengo cientos de plantillas de código simple y ejemplos sólo de VB, los cuales hacen lo básico y lo importante. Por supuesto son modificables y ajustables  a la necesidades del programa."

Con este comentario,  me refería a VB6, y la mayoría de ellas son creadas por mí (y con sus líneas de comentario). Ahora lo estoy haciendo  con vb.net por eso  te digo que me tengo que mirar lo AddHandler y lo demás, pero no las definiciones que me producen urticaria en la mayoría de los casos, si no para hacerme ejemplos que yo entienda y sin florituras.


Citar
Bien, ¿pero hay algún problema con eso?, ¿el código que te mostré no te ha servido?

Sinceramente, no. La razón es que 'contamina' el código del Form, que como he dicho yo programo por bloques y dichos bloques se comunican pero no se entremezclan, por lo menos eso intento.  Además, es demasiado extenso. Pero como esto es público, seguro a otro usuario le sirve

Otra razón es que no entiendo una porra del código, y no voy a usar un código que no entiendo, por lo menos saber lo que hace, exactamente, sobre todo si contamina mi código (el que no he puesto). Y no lo que hace en conjunto, sino cada cosa por separado.  Saber lo que hace no es poder decir "La declaración AddHandler asocia un evento a un método." si no poder  usarlo yo mismo conscientemente de lo que hago. Yo no puedo saber que es un array y alguien decirme "El objeto Array permite la creación de matrices de cualquier tipo de datos.". Esto no me ayuda, ni me dice nada, sabiendo que es un array y como se usa, poniéndome en el lugar de quien no lo sabe no veo como esta definición le puede aclarar nada. Creo que se me entiende.

Si yo programo visualbasicestilizado (¿era así?)  tu programas ceestilizado y en C voy más perdido que un gato.

Citar
{
.UseDefaultCredentials = Trae
}
 
¿En serio? {} esto para qué?


Puedo usar cosas que no se como funcionan, pero si está por separado y realiza una acción determinada. Por ejemplo, puedo tener un módulo que convierte una imagen BMP en JPG, no saber como lo hace, pero llamarlo desde el Form:

Evento_Click
Call ConvertImage(E:\Imagen.bmp", "E:\Imagen.jpg")
Fin Evento

Esto NO contamina el Form ni el código que yo he ingeniado tan sólo llama a la función ConvertImage para convertir la imagen. No creo que sea tan difícil de entender.


Estos días he estado con otras cosas y todavía no he  estado mucho con VB.Net,  ya lo miraré. Que quiere decir, ya lo miraré…

Sl2
« Última modificación: 9 Julio 2015, 23:41 pm por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.698



Ver Perfil
Re: Obtener porcentaje de descarga desde un módulo
« Respuesta #9 en: 10 Julio 2015, 07:39 am »

Bueno, chico, ya que desprecias mis comentarios y mi ayuda hasta el punto de habertelo tomado todo mal (o incluso erroneo) sin sentido alguno, y ya que crees saberlo todo (incluso el significado de un hack en el sentido o contexto expuesto, cuanto te falta aprender), y ya que el código que te mostré supuestamente según tú juicio es "contaminante" por que te parece procedural al estilo C (algo ridículo decir eso, cómo todo lo demás, pero bueno), pues creo que estás más que capacitado para apañartelas tu solito y tus equivocadas ideas sin que yo pierda el tiempo en explicarte ningún punto más, ya que aparte de moderador, usuario o programador, primero soy persona, y cómo persona se me hinchan los huevos al ver gente así de desagradecida creyendo tener la razón en todo con ese orgullo, así vas a ir muy mal, pero bueno ya te tropezarás tu solito con las piedras por el camino sin que nadie te venga advirtiendo (por tu bien) de lo que haces mal y lo que debes cambiar o mejorar, o el por qué de las cosas.

Ale, saludetes.
« Última modificación: 10 Julio 2015, 09:36 am por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines