Обсуждение статьи "Делаем информационную панель для отображения данных в индикаторах и советниках" - страница 2

 
Igor Bakhrushen #:

Артем привет! Вот строится с учетом dpi... Но по сути можно пойти другим путем. Скажем задать размер заголовка, посчитать размер панели высоту строк и высоту текста, исходя из размера заголовка. Указываешь два параметра... и пофиг какой там dpi.. или с этим могут быть проблемы? Я не совсем уверен, Какое ваше мнение по поводу такого решения? 

Всë нужно тестировать. Без монитора я не могу. Соответственно, и сказать мне нечего, к сожалению. 
 

Хорошая идея насчёт панели. Но заметил, что панель самопроизвольно падает вниз графика при переключении на него с другого графика. Пример:


 
Denis Kirichenko #:

Хорошая идея насчёт панели. Но заметил, что панель самопроизвольно падает вниз графика при переключении на него с другого графика. Пример:

Хм. Интересное явление. Нужно поглядеть будет в свободное время. Скорее всего причина в изменении размеров неактивного графика.

 
Пока что выяснил, что так обрабатывается событие CHARTEVENT_CHART_CHANGE(9).
 
Denis Kirichenko #:
Пока что выяснил, что так обрабатывается событие CHARTEVENT_CHART_CHANGE(9).

Так то естественно - при уводе фокуса с окна графика, его размеры становятся другими.

Вот тут обработка:

//--- Если график изменён
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Получаем номер подокна графика (он может измениться при удалении окна какого-либо индикатора)
      this.m_wnd=this.GetSubWindow();
      //--- Получаем новые размеры графика
      int w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
      int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
      //--- Определяем выход размеров панели за пределы окна графика
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Если высота графика изменилась - корректируем расположение панели по вертикали
      if(this.m_chart_h!=h)
        {
         this.m_chart_h=h;
         int y=this.m_y;
         if(this.m_y+this.m_h>h-1)
            y=h-this.m_h-1;
         if(y<1)
            y=1;
         this.Move(this.m_x,y);
        }
      //--- Если ширина графика изменилась - корректируем расположение панели по горизонтали
      if(this.m_chart_w!=w)
        {
         this.m_chart_w=w;
         int x=this.m_x;
         if(this.m_x+this.m_w>w-1)
            x=w-this.m_w-1;
         if(x<1)
            x=1;
         this.Move(x,this.m_y);
        }
     }

Нужно попробовать контролировать фокус графика и не реагировать на изменения в случае, если окно графика не в фокусе. Ну или как-то ещё в том же направлении. К сожалению, я пока не могу запустить и протестировать, чтобы точно указать причины и метод устранения.

 

Прошёлся по форуму. Проблема уже обсуждалась. К примеру. Добавил в код такую проверку:

//--- Если график изменён
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Получаем номер подокна графика (он может измениться при удалении окна какого-либо индикатора)
      this.m_wnd=this.GetSubWindow();
      long value;
      //--- сбросим значение ошибки
      ::ResetLastError();
      //--- получим значение свойства
      if(!::ChartGetInteger(m_chart_id, CHART_BRING_TO_TOP, m_wnd, value))
         {
         //--- выведем сообщение об ошибке в журнал "Эксперты"
         Print(__FUNCTION__ + ", Error Code = ", ::GetLastError());
         return;
         }
      // если это не показ графика поверх всех других - выходим
      if(value == 0)
         return;
      //--- Получаем новые размеры графика
      int w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
      int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
      //--- Определяем выход размеров панели за пределы окна графика
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Если высота графика изменилась - корректируем расположение панели по вертикали
      if(this.m_chart_h!=h)
        {
         this.m_chart_h=h;
         int y=this.m_y;
         if(this.m_y+this.m_h>h-1)
            y=h-this.m_h-1;
         if(y<1)
            y=1;
         this.Move(this.m_x,y);
        }
      //--- Если ширина графика изменилась - корректируем расположение панели по горизонтали
      if(this.m_chart_w!=w)
        {
         this.m_chart_w=w;
         int x=this.m_x;
         if(this.m_x+this.m_w>w-1)
            x=w-this.m_w-1;
         if(x<1)
            x=1;
         this.Move(x,this.m_y);
        }
     }


Кажется баг пропал.


Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
  • 2021.12.25
  • satorifx
  • www.mql5.com
чтобы она была в зоне видимости не вылазила за пределы окна графика CHANGE так же срабатывает. 26 11 при переключении окон ресурс не удаляется при переключении окон происходит событие CHARTEVENT CHANGE
 

Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этом панель была свёрнута, а потом снова запущен на графике.




Завтра попробую разобраться, что там за косяк...

 

Артём, ещё пример из последующей статьи про осцилляторы тоже глючит при сворачивании окна и последующем удалении программы с графика. Там не индикатор, а советник. Вот:



 
Denis Kirichenko #:

Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этом панель была свёрнута, а потом снова запущен на графике.

Завтра попробую разобраться, что там за косяк...

Тут можно проверять причину деинициализации и не сохранять состояние панели в глобальные переменные терминала при снятии советника (или индикатора) с графика. Это не решение проблемы, но её сокрытие. Не гут, конечно. Но для быстрого решения подойдёт.

Либо разбираться в таком поведении. У меня пока время сильно ограничено, к сожалению.

 
Denis Kirichenko #:

Прошёлся по форуму. Проблема уже обсуждалась. К примеру. Добавил в код такую проверку:

Кажется баг пропал.

Спасибо. Добавлю потом к себе в коды класса этой панели. К слову, от статьи к статье, в которых эта панель применялась, в ней были всяческие доработки. По-моему, здесь последняя статья, где использовалась панель. Но не помню, дорабатывал ли я её ещё.
Код класса панели прикрепил сюда.

Цветные буферы в мультисимвольных мультипериодных индикаторах
Цветные буферы в мультисимвольных мультипериодных индикаторах
  • www.mql5.com
В статье пересмотрим структуру индикаторного буфера в мультисимвольных мультипериодных индикаторах и организуем вывод на график цветных буферов этих индикаторов.
Файлы:
Dashboard.mqh  219 kb