Обсуждение статьи "Графические интерфейсы IX: Элементы "Индикатор выполнения" и "Линейный график" (Глава 2)"

 

Опубликована статья Графические интерфейсы IX: Элементы "Индикатор выполнения" и "Линейный график" (Глава 2):

Вторая глава девятой части серии будет посвящена элементам «Индикатор выполнения» и «Линейный график». Как всегда, будут показаны подробные примеры того, как можно использовать эти элементы в своих MQL-приложениях.

Перечислим все составные части, из которых будет собираться элемент «Индикатор выполнения» в разрабатываемой библиотеке.

  1. Фон
  2. Описание
  3. Полоса индикатора
  4. Фон индикатора
  5. Процентный показатель


Рис. 1. Составные части элемента «Индикатор выполнения».

Рис. 1. Составные части элемента «Индикатор выполнения».

Автор: Anatoli Kazharski

 

Супер!

С моей точки зрения, сейчас Вы однозначно впереди всех разработчиков графики на MQL.

Для себя сделал вывод, что мне есть к чему стремиться. 

Результат поражает воображение!

Удачи в дальнейшем развитии.

 
Реter Konow:

Супер!

С моей точки зрения, сейчас Вы однозначно впереди всех разработчиков графики на MQL.

Для себя сделал вывод, что мне есть к чему стремиться. 

Результат поражает воображение!

Удачи в дальнейшем развитии.

Стремиться всегда есть к чему. )

Вот, посмотрите на работы мастера, которые Вас вдохновят ещё больше: Юрий Куликов >>> 

 

 
Anatoli Kazharski:

Стремиться всегда есть к чему. )

Вот, посмотрите на работы мастера, которые Вас вдохновят ещё больше: Юрий Куликов >>> 

 

Спасибо, действительно, впечатляет!

Знаете, хотел задать Вам вопрос...

Вы создавали свой проект используя ООП. Реализовали практически все основные элементы управления. Создали богатую библиотеку...

При этом, сколько уже наработанного до Вас кода Вы использовали в своей работе?

Ну например, насколько использовали библиотеку элементов управления в МТ, Канвас, и т.д...

Лично мне приходилось все создавать с нуля и по совершенно новой технологии, в которой никак нельзя было применить уже наработанные вещи.

В будущем, разработка моего проекта также не будет продолжатся другими разработчиками и они не смогут принимать участие в его развитии, так как технология никому кроме меня не знакома.

В Вашем случае, все наоборот... Все программисты смогут принять участие в улучшении и развитии Вашей библиотеки.

Ну а помешать этому может только одно, - лень.

 
Реter Konow:

При этом, сколько уже наработанного до Вас кода Вы использовали в своей работе?

Ну например, насколько использовали библиотеку элементов управления в МТ, Канвас, и т.д...

В первой статье этой серии я отвечал на этот вопрос: Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1). Там показана структура классов стандартной библиотеки для работы со стандартными графическими объектами-примитивами.

Список классов, которые я использую в проекте:

В идеале должен остаться только один класс - CCanvas. Полезная тема по этому вопросу здесь: Делаем краудсорсовый проект по Canvas >>> 

Перед тем, как начать разработку, я изучил стандартную библиотеку для создания графических интерфейсов и версию Дмитрия Федосеева. Затем составил список, чего мне лично не хватает и начал работу над проектом. Список того, что нужно сделать, ещё довольно большой и постоянно пополняется предложениями от других заинтересованных пользователей. Просто всё это происходит в основном в личной переписке. Также идёт работа над ошибками и недоработками, которые постепенно выявляются при использовании библиотеки в своих проектах.

Ну а помешать этому может только одно, - лень.

С этим проблем нет. )

 
Anatoli Kazharski:

В первой статье этой серии я отвечал на этот вопрос: Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1). Там показана структура классов стандартной библиотеки для работы со стандартными графическими объектами-примитивами.

Список классов, которые я использую в проекте:

В идеале должен остаться только один класс - CCanvas. Полезная тема по этому вопросу: Делаем краудсорсовый проект по Canvas >>> 

Перед тем, как начать разработку, я изучил стандартную библиотеку для создания графических интерфейсов и версию Дмитрия Федосеева. Затем составил список, чего мне лично не хватает и начал работу над проектом. Список того, что нужно сделать, ещё довольно большой и постоянно пополняется предложениями от других заинтересованных пользователей. Просто всё это происходит в основном в личной переписке. Также идёт работа над ошибками и недоработками, которые постепенно выявляются при использовании библиотеки в своих проектах.

С этим проблем нет. )

Спасибо за подробный ответ. )

Желаю Вам дальнейшей продуктивной работы.

 

Анатолий, прошу прощения за навязчивость, но хотелось бы знать каким образом возможно обновлять прогресс-бар внутри цикла с тяжёлыми вычислениями.

Например, имеем прогресс-бар m_progress_bar, имеем цикл внутри CProgram

   m_progress_bar.Show();  // бессмысленно, так как он и так виден сразу при показе окна (m_window.Show()), к которому он привязан,
                           // а хотелось бы создавать его в скрытом состоянии, и показывать тогда, когда он необходим
   int total=1000;         // некое количество итераций цикла, которые хочется отобразить прогресс-баром 
   for(int i=0;i<total;i++)
     {
      Func();  // Функция с тяжёлыми вычислениями на каждой итерации цикла
      m_progress_bar.Update(i,total);  // ничего не даёт: прогресс-бар находится в "зависшем" - своём начальном состоянии
     }
   //--- по завершении цикла прогресс-бар необходимо скрыть, 
   //--- и в данной ситуации он во время цикла не обновляется, а потом скрывается наложением на него иного объекта 
   m_progress_bar.Hide();  // не скрывает почему-то прогресс-бар, приходится скрывать его под иным граф. объектом

Мог бы пояснить на таком "абстрактом" примере что я не понимаю?

 
Данные какие-нибудь передать было-бы невредно... Артем, это-лишь тип данных, а значение надо присвоить. 
 
Алексей Тарабанов:
Данные какие-нибудь передать было-бы невредно... 

А это?

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

А это?

Не катит. 
 
Алексей Тарабанов:
Не катит. 

Почему?

//+------------------------------------------------------------------+
//| Обновляет прогресс бар                                           |
//+------------------------------------------------------------------+
void CProgressBar::Update(const int index,const int total)
  {
//--- Установить новый индекс
   CurrentIndex(index);
//--- Установить новый диапазон
   StepsTotal(total);
//--- Рассчитаем ширину индикатора
   double new_width=(m_current_index/m_steps_total)*m_bar_bg.XSize();
//--- Скорректировать, если меньше 1
   if((int)new_width<1)
      new_width=1;
   else
     {
      //--- Скорректировать с учётом ширины рамки
      int x_size=m_bar_bg.XSize()-(m_bar_border_width*2);
      //--- Скорректировать, если выход за границу
      if((int)new_width>=x_size)
         new_width=x_size;
     }
//--- Установим индикатору новую ширину
   m_indicator.X_Size((int)new_width);
//--- Рассчитаем процент и сформируем строку
   double percent =m_current_index/m_steps_total*100;
   string desc    =::DoubleToString((percent>100)? 100 : percent,m_digits)+"%";
//--- Установим новое значение
   m_percent.Description(desc);
  }
//+------------------------------------------------------------------+
Причина обращения: