Библиотеки: Easy Canvas - страница 3

 
Oleksii Chepurnyi:

Добрый день.

Строка 234, ловлю аут оф рендж W.time

При включенном смещении графика, нажимаю Home и веду мышку в правую часть графика


UPD Смещение графика не при чем ) В 265 строке CopyTime не все копирует

Да, проблему воспроизвести удалось. 

Спасибо еще раз.
Благодаря этому обнаружился баг с функцией ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR)). 

Этот баг уже сбросил в ветку багов . https://www.mql5.com/ru/forum/1111/page2599#comment_13757860

Если MQ исправит этот баг, то в iCanvas замеченный Вами аут оф рейндж пропадет. 
Но ждать конечно не буду MQ, тем более они сейчас очень медленно исправляют баги или совсем их не исправляют.
Буду думать, как можно это обойти. 

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2019.11.01
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Oleksii Chepurnyi:

Спасибо!

Еще заметил, если подобрать масштаб такой, когда w.Right_bar без дробной части, вроде бы все нормально )

пофиксил. Проверьте пожалуйста.

Обновил и в КБ. Версия 1.28.
так же в классе iCanvac добавил метод:

void   SetBack(const bool bck) {ObjectSetInteger(m_chart_id,m_objname,OBJPROP_BACK,bck);} // Set canvas behind the chart or in front of the chart
                                                                                          // Устанавливать холст за графиком цены или перед ним?
Файлы:
iCanvas.mqh  21 kb
 
Nikolai Semko:

пофиксил. Проверьте пожалуйста.


Добрый день.

Похоже, все отлично )

Спасибо!

 
Супер. Удобно и понятно.
 

Предлагаю добавить статус кнопок мыши. На скорость не повлияет, но бывает полезным )


struct Window
  {
   long              ChartId;     // current window identifier
   uint              Color;       // window background color
   int               Width;       // window width
   int               Height;      // window height
   int               height[];    // sub_windows height
   int               Left_bar;    // number of the leftmost bar in the window
   double            Right_bar;   // number of the rightmost bar in the window
   double            Total_bars;  // the maximum number of bars in the window
   int               BarsInWind;  // number of visible bars in the window
   double            Y_min;       // The minimum value of the price in the window
   double            Y_max;       // The maximum value of the price in the window
   double            dy_pix;      // price change for one pixel
   int               dx_pix;      // changing the number of bars per pixel
   int               MouseX;      // coordinate X of the current position of the mouse pointer
   int               MouseY;      // coordinate Y of the current position of the mouse pointer
   int               MouseStatus; // mouse buttons status
   double            MouseBar;    // the current bar position of the mouse pointer 
   double            MousePrice;  // the current price of the mouse pointer
   datetime          MouseTime;   // the current time of the mouse pointer
   int               MouseSubWin; // number of the subwindow in which the mouse pointer is located
   int               WindowsTotal;// total subwindows, including the main window
   int               SubWin;      // current subwindow
   datetime          time[];      // array of opening time of all visible bars in the window
  };


void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseStatus=(int)sparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
 
Oleksii Chepurnyi:

Предлагаю добавить статус кнопок мыши. На скорость не повлияет, но бывает полезным )

Не могу согласиться, т.к. не вижу в этом особого смысла.

Дело в том, что статус кнопок мыши и клавиш - это событийная модель, которую нужно обрабатывать только там, где наступление этого события отлавливается, а именно в OnChartEvent.
Вы же не будете огранизовывать бесконечный цикл опроса наступления какого-то события вне обработчика событий. Поэтому какой смысл выносить этот статус за пределы OnChartEvent, когда всю обработку этих нажаний нужно делать в OnChartEvent, статус которых находится в lparam и sparam.

Ну разве только с целью ввести новую структуру индификаторов событий мыши для улучшения читаемости кода.

 
Nikolai Semko:

Не могу согласиться, т.к. не вижу в этом особого смысла.

Дело в том, что статус кнопок мыши и клавиш - это событийная модель, которую нужно обрабатывать только там, где наступление этого события отлавливается, а именно в OnChartEvent.
Вы же не будете огранизовывать бесконечный цикл опроса наступления какого-то события вне обработчика событий. Поэтому какой смысл выносить этот статус за пределы OnChartEvent, когда всю обработку этих нажаний нужно делать в OnChartEvent, статус которых находится в lparam и sparam.

Ну разве только с целью ввести новую структуру индификаторов событий мыши для улучшения читаемости кода.

А зачем тогда координаты мышки хранить? ) Тоже событийное )

Про цикл не понял...

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

 
Oleksii Chepurnyi:

А зачем тогда координаты мышки хранить? ) Тоже событийное )

С координатами мышки совсем другое дело. Текущие координаты мышки не являются событийной информацией. Событием является их изменение.

Могут понадобиться моменты, когда коодинаты мышки нужны вне OnChartEvent. Например вот здесь.

Oleksii Chepurnyi:

Про цикл не понял...

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

Ну у Вас же при перетаскивании мышкой команда на перерисовку части объекта вызывается из OnChartEvent в тот момент, когда меняется координата мышки и пока нашата ЛКМ, а в OnChartEvent имеется этот статус, зачем его внедрять в структуру Window?

Если бы Вы тоже самое делали не из OnChartEvent, и при этом в экземляре W структуры Window были бы пердлагаемые Вами MouseStatus, то Вам бы пришлось организовывать бесконечный цикл опроса этого парамента (MouseStatus) для ловли момента отпускания ЛКМ, что подвесило бы CPU.

Этот цикл не нужен только в OnChartEvent.

Я просто хочу сказать что использовать статус кнопок можно и нужно только из OnChartEvent, в котором он и так имеется.

Если я не прав, то приведите конкретный пример, в котором этот статус был бы востребован не из OnChartEvent.


 
Nikolai Semko:

Если я не прав, то приведите конкретный пример, в котором этот статус был бы востребован не из OnChartEvent.

Я ж выше написал пример, все прекрасно работает )

В OnChartEvent при движении мыши меняем параметры и даем команду на перерисовку холста. Без параметра в структуре пришлось бы передавать sparam в объект, оттуда в другой, а там в метод Draw()

 
Nikolai Semko:

С координатами мышки совсем другое дело. Текущие координаты мышки не являются событийной информацией. Событием является их изменение.

Могут понадобиться моменты, когда коодинаты мышки нужны вне OnChartEvent. Например вот здесь.

Ну у Вас же при перетаскивании мышкой команда на перерисовку части объекта вызывается из OnChartEvent в тот момент, когда меняется координата мышки и пока нашата ЛКМ, а в OnChartEvent имеется этот статус, зачем его внедрять в структуру Window?

Если бы Вы тоже самое делали не из OnChartEvent, и при этом в экземляре W структуры Window были бы пердлагаемые Вами MouseStatus, то Вам бы пришлось организовывать бесконечный цикл опроса этого парамента (MouseStatus) для ловли момента отпускания ЛКМ, что подвесило бы CPU.

Этот цикл не нужен только в OnChartEvent.

Я просто хочу сказать что использовать статус кнопок можно и нужно только из OnChartEvent, в котором он и так имеется.

Если я не прав, то приведите конкретный пример, в котором этот статус был бы востребован не из OnChartEvent.


Очень странные рассуждения. Логики никакой.

И координаты мыши и нажатые клавиши - есть внешнее состояние. Оно передается через параметры в обработчик, где если уж и кладется во внутренние переменные объекта (что безусловно полезно), то должно там быть целиком, а не частями. Библиотека - это по определению нечто, что делается не под свои хотелки, а в обобщенном виде, с учетом потенциальных потребностей других. Наперед знать все потребности нельзя, поэтому нужно просто не делать искусственных ограничений, как это.