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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Añadir porcentaje al progressBar
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Añadir porcentaje al progressBar  (Leído 11,712 veces)
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Añadir porcentaje al progressBar
« en: 27 Febrero 2016, 17:19 pm »

Hola:

Estoy haciendo una pequeña prueba. Recibo en el puerto serie / USB datos que recoge Visual C# de 0 a 1023 y lo muestro en un label.



Hasta ahí funciona bien.

Tengo dos label más. El segundo tiene que demostrar el porcentaje del 0 % a 100% según el dato obtenido del 0 a 1023.

En el otro label, el tercero debemostrar número con decimales del 0.00 a 5.00.

A pesar de encontrar la fórmula, no se implementarlo en C#.

El código es este:
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO.Ports; // No olvidar.
  12.  
  13. namespace Arduino_In_Analogico_prueba_01
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        // Utilizaremos un string como buffer de recepción.
  18.        string Recibidos;
  19.        int Porcentaje;
  20.  
  21.        public Form1()
  22.        {
  23.            InitializeComponent();
  24.  
  25.            if (!serialPort1.IsOpen)
  26.            {
  27.                try
  28.                {
  29.                    serialPort1.Open();
  30.                }
  31.                catch (System.Exception ex)
  32.                {
  33.                    MessageBox.Show(ex.ToString());
  34.                }
  35.            }
  36.  
  37.            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
  38.        }
  39.  
  40.        // Al recibir datos.
  41.        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
  42.        {
  43.  
  44.            // Acumula los caracteres recibidos a nuestro 'buffer' (string).
  45.            Recibidos = serialPort1.ReadLine();
  46.  
  47.            // Invocar o llamar al proceso de tramas.
  48.            Invoke(new EventHandler(Actualizar));
  49.        }
  50.  
  51.  
  52.        // Como variables de clase
  53.  
  54.        private string[] separador = new string[] { ",", "\r", "\n", "/n" };
  55.        private List<string> leodato1 = new List<string>();
  56.  
  57.  
  58.  
  59.        // Procesar los datos recibidos en el bufer y extraer tramas completas.
  60.        private void Actualizar(object sender, EventArgs e)
  61.        {
  62.            // En el evento
  63.            leodato1.Clear();
  64.            leodato1.AddRange(Recibidos.Split(separador,StringSplitOptions.RemoveEmptyEntries));
  65.  
  66.            label_Lectura_Potenciometro.Text = leodato1[0].ToString();
  67.            progressBar1.Value = Convert.ToInt32(leodato1[0].ToString());
  68.            progressBar1.PerformStep();
  69.        }
  70.    }
  71. }

Saludos.


« Última modificación: 27 Febrero 2016, 22:42 pm por Meta » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Añadir porcentaje al progressBar
« Respuesta #1 en: 27 Febrero 2016, 20:10 pm »


@Meta                                                        
                                                                  
 Por favor, corrije el formato de tu código  




A pesar de encontrar la fórmula, no se implementarlo en C#.

Hay un pequeño fallo de diseño en tu código, primero asignas/sumas el valor con la propiedad ProgressBar.Value y luego utilizas el método ProgressBar.PerformStep(), con esto estás avanzando dos veces el valor de la barra de progreso.

Para calcular los valores que representar en los labels, puedes hacerlo de la siguiente manera:

   

Vb.Net:
Código
  1. Public NotInheritable Class Form1 : Inherits Form
  2.  
  3.    Private Sub Test() Handles MyBase.Shown
  4.  
  5.        Me.ProgressBar1.Minimum = 0
  6.        Me.ProgressBar1.Maximum = 1023
  7.        Me.ProgressBar1.Step = 1
  8.  
  9.        For x As Integer = 0 To 1023
  10.            Threading.Thread.Sleep(10)
  11.            UpdateProgress(x)
  12.        Next
  13.  
  14.    End Sub
  15.  
  16.    Private Sub UpdateProgress(ByVal value As Integer)
  17.  
  18.        Dim percent100 As Double = ((value / 1023) * 100)
  19.        Dim percent5 As Double = (5.0F / (100.0R / percent100))
  20.  
  21.        Me.ProgressBar1.PerformStep()
  22.  
  23.        Me.Label1.Text = Convert.ToString(value)
  24.        Me.Label2.Text = String.Format("{0:0}%", percent100)
  25.        Me.Label3.Text = String.Format("{0:0.00} de {1:0.00}", percent5, 5.0F)
  26.  
  27.        Me.Label1.Update()
  28.        Me.Label2.Update()
  29.        Me.Label3.Update()
  30.  
  31.    End Sub
  32.  
  33. End Class

Traducción online a C#:
Código
  1. public sealed class Form1 : Form
  2. {
  3. private void Test() {
  4. this.ProgressBar1.Minimum = 0;
  5. this.ProgressBar1.Maximum = 1023;
  6. this.ProgressBar1.Step = 1;
  7.  
  8. for (int x = 0; x <= 1023; x++) {
  9. Threading.Thread.Sleep(10);
  10. UpdateProgress(x);
  11. }
  12. }
  13.  
  14. private void UpdateProgress(int value) {
  15. double percent100 = ((value / 1023) * 100);
  16. double percent5 = (5f / (100.0 / percent100));
  17.  
  18. this.ProgressBar1.PerformStep();
  19.  
  20. this.Label1.Text = Convert.ToString(value);
  21. this.Label2.Text = string.Format("{0:0}%", percent100);
  22. this.Label3.Text = string.Format("{0:0.00} de {1:0.00}", percent5, 5f);
  23.  
  24. this.Label1.Update();
  25. this.Label2.Update();
  26. this.Label3.Update();
  27. }
  28.  
  29. public Form1() {
  30. Shown += Test;
  31. }
  32. }
  33.  
  34. //=======================================================
  35. //Service provided by Telerik (www.telerik.com)
  36. //=======================================================
  37.  

Saludos!


« Última modificación: 27 Febrero 2016, 21:05 pm por Eleкtro » En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Añadir porcentaje al progressBar
« Respuesta #2 en: 28 Febrero 2016, 07:13 am »

Hola:

Quiero que se muestra así. Gracias. ;)



He estado haciendo pruebas, no funciona porque me olvidé que los datos recibidos desde el puerto serie que viene por cada 0.1 segundos o 100 milisengudos del 0 al 1023, se incluye un retorno de carro, por ejemplo, 823\n.

Por eso hay que usar estos códigos.
Código
  1.        // Como variables de clase
  2.        private string[] Separador = new string[] { ",", "\r", "\n", "/n" };
  3.        private List<string> Leodato1 = new List<string>();

Y dentro de Actualizar.
Código
  1.        // Procesar los datos recibidos en el bufer y extraer tramas completas.
  2.        private void Actualizar(object sender, EventArgs e)
  3.        {
  4.            // En el evento
  5.            Leodato1.Clear();
  6.            Leodato1.AddRange(Recibidos.Split(Separador,StringSplitOptions.RemoveEmptyEntries));
  7.  
  8.            label_Lectura_Potenciometro.Text = Leodato1[0].ToString();
  9.            progressBar1.Value = Convert.ToInt32(Leodato1[0].ToString());
  10.  
  11.  
  12.    }
Recuerda, por cada muestra recibida del 0 al 1023, cualquier valor entregado tiene un retorno de carro \n. Me funciona tu código así tal como estás, no cuando me recibe en el puerto serie.
Solo me falta el voltaje y el porcentaje.

Preguntas opcionales.
Por cierto, me encantó visualmente lo que hiciste.


1) ¿Con qué compilador lo hiciste?

2) ¿Con Visual C# 2105 se puede cambiar el color del progressBar? (Nunca me ha salido, si de los label, ya que los progress siempre lo veo verde y quiero cambiarlo azul o naranja por decir algo).

Saludos.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Añadir porcentaje al progressBar
« Respuesta #3 en: 28 Febrero 2016, 20:16 pm »

Me funciona tu código así tal como estás, no cuando me recibe en el puerto serie.

Es responsabilidad tuya adaptar el código que mostré (el cual, como tu has dicho, fuciona), a tu código con el arduino.

La lógica del código creo que es bastante clara, solo debes fijarte en como obtengo el porcentaje y el voltaje mediante las operaciones aritméticas de esas dos variables, y hacer exactamente lo mismo en tu código.



por cada muestra recibida del 0 al 1023, cualquier valor entregado tiene un retorno de carro \n.

Te sugiero no utilizar indexers de Arrays con la función String.Split(), puedes reemplazar esa engorrosa metodología por el método String.TrimEnd() para eliminar los caracteres indeseados del final del string (los cuales puedes encontrar en la class Microsoft.VisualBasic.ControlChars (y antes de que lo preguntes, si, se puede y es recomendable usar esa Class desde C#, aunque tambien puedes usar los caracteres que representan esas constantes y ya está).



Por cierto, me encantó visualmente lo que hiciste.

Visualmente hablando es un simple Form por defecto sin ningún tipo de personalización, simplemente el fondo del form sale de ese color por que Windows administra la colorización de las aplicaciones según la colorización del theme visual de Windows, a esto se le llama estilos visuales de la aplicación (o Visual Styles ), a menos que uses colores arbitraros para tu app claro está, como por ejemplo ese label tuyo que pusiste de amarillo.



1) ¿Con qué compilador lo hiciste?

Toda aplicación de Visual Studio se compila con el compilador de .Net Framework, msbuild.exe (que internamente llama a vbc.exe para Vb.Net, o csc.exe para C#. )

¿Qué estas intentando preguntar exactamente?.



¿Con Visual C# 2105 se puede cambiar el color del progressBar? (Nunca me ha salido, si de los label, ya que los progress siempre lo veo verde y quiero cambiarlo azul o naranja por decir algo).

Si, solo debes heredar la Class ProgressBar, activar el modo de dibujado de usuario, y bibujar el rectángulo, pero ten en cuenta que puede requerir mucho más esfuerzo que eso, dependiendo de tus necesidades, ya que al personalizar, se pierden los efectos o estilos visuales del control, sobre todo esos destellos luminosos que Windows pone sobre la barra de progeso que son tan chulos.
De todas formas alguien experto en GDI+ podría simular los destellos (yo no llego a tanto), hay barras de progeso muy avanzadas en CodeProject.

Vb.Net:
Código
  1. Public Class CustomProgressBar : Inherits ProgressBar
  2.  
  3.    Public Sub New()
  4.        MyBase.BackColor = Color.LimeGreen ' ProgressBar.DefaultBackColor
  5.        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
  6.        Me.SetStyle(ControlStyles.SupportsTransparentBackColor, False)
  7.        Me.SetStyle(ControlStyles.UserPaint, True)
  8.    End Sub
  9.  
  10.    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
  11.  
  12.        Dim rc As Rectangle = e.ClipRectangle
  13.  
  14.        rc.Width = (((rc.Width * MyBase.Value) \ MyBase.Maximum) - 4)
  15.        rc.Height = (rc.Height - 4)
  16.  
  17.        If (ProgressBarRenderer.IsSupported) Then
  18.            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle)
  19.        End If
  20.  
  21.        Using br As New SolidBrush(MyBase.BackColor)
  22.            e.Graphics.FillRectangle(br, 2, 2, rc.Width, rc.Height)
  23.        End Using
  24.  
  25.    End Sub
  26.  
  27. End Class

Traducción online a C#:
Código
  1. public class ElektroProgressBar : ProgressBar {
  2.  
  3. public ElektroProgressBar() {
  4. base.BackColor = Color.LimeGreen;
  5. // ProgressBar.DefaultBackColor
  6. this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
  7. this.SetStyle(ControlStyles.SupportsTransparentBackColor, false);
  8. this.SetStyle(ControlStyles.UserPaint, true);
  9. }
  10.  
  11.  
  12. protected override void OnPaint(PaintEventArgs e) {
  13. Rectangle rc = e.ClipRectangle;
  14.  
  15. rc.Width = (((rc.Width * base.Value) / base.Maximum) - 4);
  16. rc.Height = (rc.Height - 4);
  17.  
  18. if ((ProgressBarRenderer.IsSupported)) {
  19. ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle);
  20. }
  21.  
  22. using (SolidBrush br = new SolidBrush(base.BackColor)) {
  23. e.Graphics.FillRectangle(br, 2, 2, rc.Width, rc.Height);
  24. }
  25. }
  26. }
  27.  
  28. //=======================================================
  29. //Service provided by Telerik (www.telerik.com)
  30. //=======================================================

Si quieres conservar los efectos visuales del control, puedes recurrir a la API de Windows para especificar el estado de la barra de progeso (normal, pausado, error, indeterminado), cada estado está ligado a un color por defecto en tu tema visual de Windows, esto quiere decir que los colores que puedes usar son muy limitados y que además dependen del tema visual del usuario (no recuerdo los colores del tema Aero, pero creo que eran verde, amarillo, rojo y verde otra vez), lo puedes hacer de manera muy sencilla con la librería de Microsoft WindowsAPICodePack, no recuerdo exactamente con que funciones de la API de Windows se hacia.

EDITO: Acabo de recordar (o mejor dicho, encontrar) como se hacia con la WinAPI, con la función SendMessage:

Código
  1. static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr w, IntPtr l);
  2.  
  3. SendMessage(MyProgressBar.Handle, 1040, (IntPtr)(del 1 al 4 son los diferentes estados), IntPtr.Zero);

Saludos
« Última modificación: 28 Febrero 2016, 20:59 pm por Eleкtro » En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Añadir porcentaje al progressBar
« Respuesta #4 en: 1 Marzo 2016, 06:40 am »

Hola:

Gracias por la info, el tema de los colores del progressBar lo haré para el final. ;)

Hice este código de ejemplo en modo consola para hacer pruebas.



Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Porcentaje_Barra_Consola_CS
  8. {
  9.    class Program
  10.    {
  11.        static void Main(string[] args)
  12.        {
  13.            Console.Title = "Estilo progressBar C#";
  14.  
  15.            int Variar_este_valor = 0; // De 0 a 1023.
  16.            double Resultado_Porcentaje = 0;
  17.            double Resultado_Voltios = 0;
  18.  
  19.            Console.WriteLine("Introduce el valor entre 0 al 1023.");
  20.            Variar_este_valor = Convert.ToInt32(Console.ReadLine());
  21.  
  22.            Resultado_Porcentaje = Variar_este_valor * (100.00 / 1023.00);
  23.            Resultado_Voltios = Variar_este_valor * (5.00 / 1023.00);
  24.            Console.WriteLine("{0} % y {1} Voltios.", Resultado_Porcentaje, Resultado_Voltios);
  25.            Console.ReadLine();
  26.        }
  27.  
  28.    }
  29. }

Me faltan cosas, que los decimales se vean solo dos dígitos y que funcione.

REpitiendo el código que ya mejoraré como dijiste arriba.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO.Ports; // No olvidar.
  12.  
  13. namespace Arduino_In_Analogico_prueba_01
  14. {
  15.    public partial class Form1 : Form
  16.    {
  17.        // Utilizaremos un string como buffer de recepción.
  18.        string Recibidos;
  19.  
  20.        public Form1()
  21.        {
  22.            InitializeComponent();
  23.  
  24.            if (!serialPort1.IsOpen)
  25.            {
  26.                try
  27.                {
  28.                    serialPort1.Open();
  29.                }
  30.                catch (System.Exception ex)
  31.                {
  32.                    MessageBox.Show(ex.ToString());
  33.                }
  34.            }
  35.  
  36.            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
  37.        }
  38.  
  39.        // Al recibir datos.
  40.        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
  41.        {
  42.  
  43.            // Acumula los caracteres recibidos a nuestro 'buffer' (string).
  44.            Recibidos = serialPort1.ReadLine();
  45.  
  46.            // Invocar o llamar al proceso de tramas.
  47.            Invoke(new EventHandler(Actualizar));
  48.        }
  49.  
  50.  
  51.        // Como variables de clase
  52.        private string[] Separador = new string[] { ",", "\r", "\n", "/n" };
  53.        private List<string> Leo_Dato1 = new List<string>();
  54.  
  55.        // Procesar los datos recibidos en el bufer y extraer tramas completas.
  56.        private void Actualizar(object sender, EventArgs e)
  57.        {
  58.            double Porcentaje = 0;
  59.            double Voltio = 0;
  60.  
  61.            // En el evento
  62.            Leo_Dato1.Clear();
  63.            Leo_Dato1.AddRange(Recibidos.Split(Separador, StringSplitOptions.RemoveEmptyEntries));
  64.  
  65.            label_Lectura_Potenciometro.Text = Leo_Dato1[0].ToString();
  66.            progressBar1.Value = Convert.ToInt32(Leo_Dato1[0].ToString());
  67.  
  68.            Porcentaje = Leo_Dato1[0] * (100.00 / 1023.00); // Error aquí
  69.            Voltio = Leo_Dato1[0] * (5.00 / 1023.00); // y aquí.
  70.  
  71.            label_Portentaje.Text = Porcentaje.ToString();
  72.            label_Voltio.Text = Voltio.ToString();
  73.  
  74.        }
  75.    }
  76. }

Nos centramos donde da error.
Código
  1.            Porcentaje = Leo_Dato1[0] * (100.00 / 1023.00); // Error aquí
  2.            Voltio = Leo_Dato1[0] * (5.00 / 1023.00); // y aquí.

Los dos errores dice esto:
Citar
Gravedad   Código   Descripción   Proyecto   Archivo   Línea
Error   CS0019   El operador '*' no se puede aplicar a operandos del tipo 'string' y 'double'   Arduino_In_Analogico_prueba_01   C:\Users\Usuario\Documents\Visual Studio 2015\Projects\Arduino_In_Analogico_prueba_01\Arduino_In_Analogico_prueba_01\Form1.cs   75

Saludos.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Añadir porcentaje al progressBar
« Respuesta #5 en: 1 Marzo 2016, 10:39 am »

Los dos errores dice esto:
Citar
Error   CS0019   El operador '*' no se puede aplicar a operandos del tipo 'string' y 'double'

Resulta algo imperdonable que a estas alturas no entiendas a que se debe el error (o no sepas como solucionarlo).

Ponerte la solución en bandeja sería realmente facil, prefiero que leas los siguientes artículos para que aprendas por ti mismo a desenvolverte con (algunos de) los problemas más básicos:


Saludos!
« Última modificación: 1 Marzo 2016, 10:47 am por Eleкtro » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
progressbar porcentaje
Programación Visual Basic
alfa_28 7 6,233 Último mensaje 21 Septiembre 2006, 06:40 am
por Zibra
porcentaje de color
Diseño Gráfico
ISR9994 0 2,512 Último mensaje 19 Diciembre 2007, 21:07 pm
por ISR9994
Porcentaje de winrar
Programación Visual Basic
SheKeL_C$ 5 2,835 Último mensaje 20 Enero 2008, 07:34 am
por zXxOsirisxXz
porcentaje de uso de cpu
Scripting
navivan 6 6,003 Último mensaje 12 Marzo 2014, 18:07 pm
por navivan
porcentaje en c
Programación C/C++
lucas59 2 6,128 Último mensaje 5 Octubre 2014, 13:36 pm
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines