Discussão do artigo "Interfaces Gráficas IX: Os Controles Barra de Progresso e Gráfico de Linha (Capítulo 2)"

 

Novo artigo Interfaces Gráficas IX: Os Controles Barra de Progresso e Gráfico de Linha (Capítulo 2) foi publicado:

O segundo capítulo da parte nove é dedicado aos controles barra de progresso e gráfico de linha. Como sempre, teremos exemplos detalhados para revelar como esses controles podem ser utilizados nas aplicações MQL personalizadas.

Vamos listar todos os componentes utilizados para a criação de uma barra de progresso na Biblioteca desenvolvida.

  1. Fundo
  2. Descrição
  3. Barra do indicador
  4. Fundo do indicador
  5. Percentagem



Fig. 1. Componentes do controle da barra de progresso.

Autor: Anatoli Kazharski

 

Muito bom!

Do meu ponto de vista, agora você está definitivamente à frente de todos os desenvolvedores de gráficos MQL.

Concluí por mim mesmo que tenho algo a que aspirar.

O resultado é incrível!

Boa sorte em seu desenvolvimento futuro.

 
Реter Konow:

Muito bom!

Do meu ponto de vista, agora você está definitivamente à frente de todos os desenvolvedores de gráficos MQL.

Concluí por mim mesmo que tenho algo a que aspirar.

O resultado é incrível!

Boa sorte em seu desenvolvimento futuro.

Sempre há algo pelo que se esforçar. )

Aqui, veja as obras do mestre, que o inspirarão ainda mais: Yuri Kulikov >>>>

 
Anatoli Kazharski:

Sempre há algo pelo que se esforçar. )

Aqui está uma olhada nas obras do mestre que o inspirarão ainda mais: Yuri Kulikov >>>.

Obrigado, realmente impressionante!

Sabe, eu queria lhe fazer uma pergunta...

Você criou seu projeto usando OOP. Implementou quase todos os controles básicos. Criou uma biblioteca rica...

Ao mesmo tempo, quanto do código você já usou em seu trabalho?

Por exemplo, quanto você usou da biblioteca de controles do MT, Canvas, etc.?

Pessoalmente, tive que criar tudo do zero e em uma tecnologia completamente nova, na qual era impossível usar coisas já elaboradas.

No futuro, o desenvolvimento do meu projeto também não será continuado por outros desenvolvedores e eles não poderão participar de seu desenvolvimento, porque a tecnologia não é familiar para ninguém além de mim.

No seu caso, é o oposto... Todos os programadores poderão participar do aprimoramento e do desenvolvimento de sua biblioteca.

E a única coisa que pode impedir isso é a preguiça.

 
Реter Konow:

Ao mesmo tempo, quanto do código você já usou em seu trabalho?

Por exemplo, quanto você usou da biblioteca de controles do MT, Canvas, etc.?

No primeiro artigo desta série, respondi a essa pergunta: GUIs I: Preparando a estrutura da biblioteca (Capítulo 1). Lá é mostrada a estrutura das classes da biblioteca padrão para trabalhar com primitivas de objetos gráficos padrão.

A lista de classes que uso no projeto é a seguinte

Idealmente, deveria restar apenas uma classe: CCanvas. Um tópico útil sobre esse assunto está aqui: Fazendo um projeto de crowdsource no Canvas >>>

Antes de iniciar o desenvolvimento, estudei a biblioteca padrão para a criação de interfaces gráficas e a versão de Dmitry Fedoseev. Em seguida, fiz uma lista do que me faltava e comecei a trabalhar no projeto. A lista do que precisa ser feito ainda é bastante grande e está sendo constantemente atualizada com sugestões de outros usuários interessados. Só que tudo isso está acontecendo principalmente por meio de correspondência pessoal. Também estamos trabalhando nos bugs e erros que são gradualmente revelados ao usar a biblioteca em nossos projetos.

A única coisa que pode impedir isso é a preguiça.

Não há problemas com isso. )

 
Anatoli Kazharski:

No primeiro artigo desta série, respondi a essa pergunta: Interfaces gráficas I: Preparando a estrutura da biblioteca (Capítulo 1). Lá é mostrada a estrutura de classes de uma biblioteca padrão para trabalhar com objetos primitivos gráficos padrão.

A lista de classes que uso no projeto é a seguinte

Idealmente, deveria restar apenas uma classe: CCanvas. Tópico útil sobre esse assunto: Realização de um projeto de crowdsource no Canvas >>>

Antes de iniciar o desenvolvimento, estudei a biblioteca padrão para a criação de interfaces gráficas e a versão de Dmitry Fedoseev. Em seguida, fiz uma lista do que me faltava e comecei a trabalhar no projeto. A lista do que precisa ser feito ainda é bastante grande e está sendo constantemente atualizada com sugestões de outros usuários interessados. Só que tudo isso está acontecendo principalmente por meio de correspondência pessoal. Também estou trabalhando em bugs e erros que são gradualmente revelados ao usar a biblioteca em meus projetos.

Não há problemas com isso. )

Obrigado por sua resposta detalhada. )

Desejo a você um trabalho mais produtivo.

 

Anatoly, peço desculpas por ser intrusivo, mas gostaria de saber como é possível atualizar a barra de progresso dentro de um loop com cálculos pesados.

Por exemplo, temos uma barra de progresso m_progress_bar, temos um loop dentro do CProgram

   m_progress_bar.Show();  // é inútil, pois já é visível imediatamente ao mostrar a janela (m_window.Show()) à qual está vinculado,
                           // e eu gostaria de criá-lo em um estado oculto e mostrá-lo quando for necessário
   int total=1000;         // um determinado número de iterações de loop, que você deseja exibir com a barra de progresso 
   for(int i=0;i<total;i++)
     {
      Func();  // Função com cálculos pesados a cada iteração do loop
      m_progress_bar.Update(i,total);  // não faz nada: a barra de progresso está em "hung" - seu estado inicial.
     }
   //--- a barra de progresso deve ficar oculta quando o ciclo for concluído, 
   //--- e, nessa situação, ele não é atualizado durante o loop e, em seguida, fica oculto ao ser sobreposto a outro objeto 
   m_progress_bar.Hide();  // não oculta a barra de progresso por algum motivo, tenho que ocultá-la em outro objeto gráfico.

Você poderia explicar em um exemplo tão "abstrato" o que eu não entendi?

 
Não faria mal passar alguns dados.... Artem, esse é apenas um tipo de dados, mas o valor deve ser atribuído.
 
Алексей Тарабанов:
Não faria mal nenhum passar alguns dados.

E quanto a isso?

m_progress_bar.Update(i,total);
 
Artyom Trishkin:

E quanto a isso?

Não funciona.
 
Алексей Тарабанов:
Não funciona.

Por que não funciona?

//+------------------------------------------------------------------+
//|| Atualiza a barra de progresso|
//+------------------------------------------------------------------+
void CProgressBar::Update(const int index,const int total)
  {
//--- Definir novo índice
   CurrentIndex(index);
//--- Definir novo intervalo
   StepsTotal(total);
//--- Calcular a largura do indicador
   double new_width=(m_current_index/m_steps_total)*m_bar_bg.XSize();
//--- Ajuste se for menor que 1
   if((int)new_width<1)
      new_width=1;
   else
     {
      //--- Ajuste para a largura do quadro
      int x_size=m_bar_bg.XSize()-(m_bar_border_width*2);
      //--- Corrigir se estiver fora dos limites
      if((int)new_width>=x_size)
         new_width=x_size;
     }
//--- Definir uma nova largura para o indicador
   m_indicator.X_Size((int)new_width);
//--- Calcular a porcentagem e formar uma string
   double percent =m_current_index/m_steps_total*100;
   string desc    =::DoubleToString((percent>100)? 100 : percent,m_digits)+"%";
//--- Definir o novo valor
   m_percent.Description(desc);
  }
//+------------------------------------------------------------------+