Arquivo de 9 de abril de 2014

Uma barra de progresso é um componente de uma interface gráfica de usuário usado para visualizar a progressão de uma operação de computador estendida, como um download, transferência de arquivos, ou de instalação. Às vezes, o gráfico é acompanhada por uma representação textual do progresso em um formato por cento.

ttk.Progressbar

Representa um controle de barra de progresso. O objetivo desta ferramenta é para tranquilizar o usuário que algo está acontecendo.

progressbar-py

Progress Bar – ttk

 

Exemplo:

Neste exemplo usamos um contador e um temporizador para simular uma tarefa e usamos a classe BackgroundWorker para processar o andamento da tarefa.

Python

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Desenvolvimento Aberto
# ProgressBar.py

# importa modulo 

from Tkinter import *
from ttk import *

# Cria formulario
formulario = Tk()
formulario.title = "Desenvolvimento Aberto"

# Evento do botão
def clique():
    progresso.step(1)
    progresso.start()
          
# Cria componentes
rotulo = Label(formulario, text="Barra de Progresso")

progresso = Progressbar(formulario,length=200)

botao = Button(formulario, text="Ok", command=clique)

# Posiciona componentes
rotulo.pack(padx=20, pady=10)
progresso.pack(padx=20)
botao.pack(padx=20, pady=10)

# looping do tcl
mainloop()

Progress Control

Fornece a funcionalidade do controle de barra de progresso comum do Windows. O Progress Control é um componente da classe CProgressCtrl e quando instanciado utiliza sua própria thread para redesenhar o controle de posição da barra de progresso, o tornando assim, um componente muito fácil de ser utilizado, dispensando o uso de um temporizador e uma nova thread para o efeito de progressão da tarefa.

Visual Studio

Para utilizar o componente Progress Control siga os seguintes passos:

  1. Crie um programa C++ MFC Dialog Based.
  2. Coloque no dialogo um Static Text, um Progress Control e um Button.
  3. Crie uma variável para o componente Progress Control chamada m_progresso.
  4. Modele seu design como na figura abaixo:

    progresscontrol

    Progress Control – Design

  5. Crie um evento de clique para o botão.
  6. Complete seu código gerado automaticamente com o trecho marcado do código abaixo:

Exemplo:

Neste exemplo criamos uma barra de progresso e incrementamos seu valor para efeito de uma progressão de uma tarefa.

// Código gerado automaticamente
// progressbarcppDlg.cpp : implementation file
//

#include "stdafx.h"
#include "progressbarcpp.h"
#include "progressbarcppDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CprogressbarcppDlg::CprogressbarcppDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CprogressbarcppDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CprogressbarcppDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_PROGRESS1, m_progresso);
}

BEGIN_MESSAGE_MAP(CprogressbarcppDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CprogressbarcppDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

BOOL CprogressbarcppDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
		
	SetIcon(m_hIcon, TRUE);			
	SetIcon(m_hIcon, FALSE);		
	
	return TRUE; 
}


void CprogressbarcppDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); 

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
				
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

HCURSOR CprogressbarcppDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

// Desenvolvimento Aberto
// nosso código começa aqui

void CprogressbarcppDlg::OnBnClickedButton1()
{
	// Zera a barra de progresso
	m_progresso.SetPos(0);
	
	// Adiciona limites de valores
	m_progresso.SetRange(0, 100);
	
	// Adiciona valor de incremento
	m_progresso.SetStep(1);
	
	// Incrementa barra de progresso
	for (int andamento = 0; andamento <= 100; andamento++)
	{
		m_progresso.SetPos(andamento);
	}
}

Uma barra de progresso é um componente de uma interface gráfica de usuário usado para visualizar a progressão de uma operação de computador estendida, como um download, transferência de arquivos, ou de instalação. Às vezes, o gráfico é acompanhada por uma representação textual do progresso em um formato por cento.

ProgressBar

Representa um controle de barra de progresso do Windows.

Timer

Implementa um timer que gera um evento em intervalos definidos pelo usuário. Desta vez, é otimizado para uso em aplicações Windows Forms e deve ser usado em uma janela.

BackgroundWorker

Executa uma operação em um segmento separado.

ProgressChangedEventHandler

Representa o método que manipulará o evento ProgressChanged da classe BackgroundWorker. Esta classe não pode ser herdada.

Processando Menssagens

Imagine uma barra de progresso que por padrão atinge um valor de 0 à 100, a principio podemos incrementar este valor no evento do clique do botão, porem a GUI sozinha não conseguirá atualizar os frames do andamento do status da barra progresso porque esta ocupada processando o contador do incremento, deste modo podemos ver o progresso vazio(0%) quando iniciar e cheio(100%) quando o contador chegar ao final, entretanto não poderemos ver o andamento desta porcentagem.  Para que possamos ver o andamento precisamos trabalhar os processos simultaneamente, em algumas linguagens de programação como o Delphi por exemplo temos o comando Application.ProcessMessages que executa este trabalho para nós. O C# possui uma classe chamada BackgroundWorker e podemos usa-la para executar um trabalho equivalente ao comando do Delphi para processar mensagens.

progressbar

ProgressBar – BackGroundWorker

 

Exemplo:

Neste exemplo usamos um contador e um temporizador para simular uma tarefa e usamos a classe BackgroundWorker para processar o andamento da tarefa.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace barraprogresso
{
    public partial class Form1 : Form
    {
        // Declara componentes
        Label rotulo;
        ProgressBar progresso;
        Button botao;
        Timer tempo = new Timer();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Muda propriedades do formulario
            this.Text = "DA - Progress Bar";
            this.Size = new Size(240, 150);

            // Cria componentes
            rotulo = new Label();
            progresso = new ProgressBar();
            botao = new Button();

            // Adiciona texto
            rotulo.Text = "Progress Bar";
            botao.Text = "Ok";

            // Adiciona tamanho
            rotulo.Size = new Size(200, 20);
            progresso.Size = new Size(200, 20);

            // Adiciona posição
            rotulo.Location = new Point(12, 20);
            progresso.Location = new Point(12, 40);
            botao.Location = new Point(70, 70);

            // Alinha componenente
            rotulo.TextAlign = ContentAlignment.MiddleCenter;

            // Cria evento do botão
            botao.Click += new System.EventHandler(this.botao_Click);

            // Cria processo de background
            BackgroundWorker backgroundWorker = new BackgroundWorker();

            // Cria evento de progresso
            backgroundWorker.ProgressChanged +=
                new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);

            // Adiciona componentes ao formulario
            this.Controls.Add(rotulo);
            this.Controls.Add(progresso);
            this.Controls.Add(botao);
        }

        // Cria um temporizador
        private void temporizador()
        {
            tempo.Interval = 250;
            tempo.Tick += new EventHandler(andamento);
            tempo.Start();

        }

        // Incrementa a barra de progresso baseado no temporizador
        private void andamento(object sender, EventArgs e)
        {
            progresso.Increment(1);

            if (progresso.Value == progresso.Maximum)
            {
                tempo.Stop();
            }
        }

        // Processa menssagens de progresso
        private void backgroundWorker_ProgressChanged(object sender,
           ProgressChangedEventArgs e)
        {
            progresso.Value = e.ProgressPercentage;
        }

        // Evento de clique do botão
        private void botao_Click(object sender, EventArgs e)
        {
            progresso.Value = 0;
            progresso.Maximum = 100;
            progresso.Step = 1;
            temporizador();
        }
    }
}

Uma barra de progresso é um componente de uma interface gráfica de usuário usado para visualizar a progressão de uma operação de computador estendida, como um download, transferência de arquivos, ou de instalação. Às vezes, o gráfico é acompanhada por uma representação textual do progresso em um formato por cento.

JProgressBar

Um componente que exibe visualmente o progresso de alguma tarefa. À medida que a tarefa avança para a sua conclusão, a barra de progresso exibe porcentagem da tarefa de conclusão. Esse percentual é normalmente representado visualmente por um retângulo que começa vazio e gradualmente se torna cheio mostrando como a tarefa progride. Além disso, a barra de progresso pode exibir uma representação textual desse percentual.

Thread.sleep

Faz com que o segmento atual suspenda a execução por um período determinado.

SwingWorker

O SwingWorker em si é uma classe abstrata; você deve definir uma subclasse, a fim de criar um objeto SwingWorker; classes internas anônimas são muitas vezes útil para a criação de objetos.

doInBackground

O método doInBackground () é chamado nesta para executar uma tarefa simultânea as demais tarefas, e é como todas as atividades de fundo devem acontecer. Para notificar a mudança de alguma propriedade use PropertyChangeListeners. Por padrão, existem duas propriedades ligadas disponíveis: state e progress.

PropertyChangeListeners

Um evento PropertyChangeé disparado quando um objeto altera uma propriedade ligada a ele.

Processando Menssagens

Imagine uma barra de progresso que por padrão atinge um valor de 0 à 100, a principio podemos incrementar este valor no evento do clique do botão, porem a GUI sozinha não conseguirá atualizar os frames do andamento do status da barra progresso porque esta ocupada processando o contador do incremento, deste modo podemos ver o progresso vazio(0%) quando iniciar e cheio(100%) quando o contador chegar ao final, entretanto não poderemos ver o andamento desta porcentagem.  Para que possamos ver o andamento precisamos trabalhar os processos simultaneamente, em algumas linguagens de programação como o Delphi por exemplo temos o comando Application.ProcessMessages que executa este trabalho para nós. O Java possui uma classe abstrata chamada SwingWorker e podemos usa-la para executar um trabalho equivalente ao comando do Delphi para processar mensagens.

jprogressbar

JProgressBar – SwingWorker

Exemplo:

Neste exemplo usamos um contador e um temporizador para simular uma tarefa e usamos a classe abstrata SwingWorker para processar o andamento da tarefa.

Java

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

public class BarraProgresso implements ActionListener, PropertyChangeListener
{

	// Declara componentes
	JLabel rotulo;
	JProgressBar progresso;
	JButton botao;

	public Container criaPainel()
	{
		// Cria painel
		JPanel painel = new JPanel();

		// Cria layout
		painel.setLayout(new BoxLayout(painel,BoxLayout.PAGE_AXIS));
		painel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));

		// Cria componentes
		rotulo = new JLabel("Barra de progresso");
		progresso = new JProgressBar(0,100);
		botao = new JButton("Ok");

		// Alinha componentes
		rotulo.setAlignmentX(Component.CENTER_ALIGNMENT);
		progresso.setAlignmentX(Component.CENTER_ALIGNMENT);
		botao.setAlignmentX(Component.CENTER_ALIGNMENT);

		// Adiciona propriedade a barra de progresso
		progresso.setStringPainted(true);

		// Cria evento do botão
		botao.addActionListener(this);

		// Adiciona componentes ao painel
		painel.add(rotulo);
		painel.add(Box.createVerticalStrut(10));
		painel.add(progresso);
		painel.add(Box.createVerticalStrut(10));
		painel.add(botao);

		return painel;
	}

	// Cria classe SwingWorker para a propriedade progress
	class ProcessaMenssagem extends SwingWorker<Void, Void>
	{

		@Override
		public Void doInBackground() throws Exception {

			// Progresso inical
			setProgress(0);

			// cria contador
			for (int andamento = 0; andamento <= 100; andamento++)
			{
				// Cria um efeito de espera
				try
				{
					Thread.sleep(500);
				}
			    catch (InterruptedException e)
				{
					e.printStackTrace();
				}

				// Atualiza o contador
				setProgress(Math.min(andamento, 100));
			}

			return null;
		}

	}

	// Evento do botão
	public void actionPerformed(ActionEvent arg0)
	{

		if (arg0.getSource() == botao)
		{
			// Cria objeto de progresso
			ProcessaMenssagem processa = new ProcessaMenssagem();
			processa.addPropertyChangeListener(this);
			processa.execute();
		}

	}

	// Atualiza a propriedade do objeto
	public void propertyChange(PropertyChangeEvent evt) {

		if ("progress" == evt.getPropertyName())
		{
			int andamento = (Integer) evt.getNewValue();
			progresso.setValue(andamento);
		}
	}

	// Cria GUI
	public static void criaGUI()
	{
		// Cria formulario principal
		JFrame formulario = new JFrame("DA - Progress Bar");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Cria instancia da classe
		BarraProgresso barra = new BarraProgresso();

		// Adiciona painel principal
		formulario.setContentPane(barra.criaPainel());

		formulario.setSize(300,150);

		formulario.setVisible(true);
	}

	public static void main(String[] args) {

		// Thread do swing
		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			public void run() {
				criaGUI();
			}
		});

	}

}