Тестируем CGraphic - вопросы и предложения - страница 4

 
Roman Konopelko:

Даже сделав их virtual вы не сможете делать нормальные перегрузки без полного доступа к членам класса CGraphics, следовательно их все(большинство) нужно объявлять как protected.

а эти функции ***Plot как раз protected


 
o_O:

а эти функции ***Plot как раз protected

class CGraphic
  {
private:
   CArrayObj         m_arr_curves;
   CCanvas           m_canvas;
   //--- parameters background
   int               m_height;
   int               m_width;
   //--- parameters work space
   int               m_left;
   int               m_right;
   int               m_up;
   int               m_down;
   //--- default parameters work space
   int               m_left0;
   int               m_right0;
   int               m_up0;
   int               m_down0;
   //--- size of dash on the axes
   int               m_mark_size;
   //--- scaling parameters
   double            m_dx;
   double            m_dy;
Я говорил про члены класса CGraphic, сейчас они все private, а без доступа в наследнике к m_canvas, m_dx, m_dy и другим членам перегрузки не получатся сделать.
 
Roman Konopelko:
Я говорил про члены класса CGraphic, сейчас они все private, а без доступа в наследнике к m_canvas, m_dx, m_dy и другим членам перегрузки не получатся сделать.

ок, тогда всё в ваших руках)  буду ждать.

пока что временно локально у себя поменял

 

в некоторых функциях (не везде) если есть деление, то оно без проверки на 0.

например

void CGraphic::CalculateXAxis(void)
  {
...
...
   double x_size=(m_x.Max()-m_x.Min());
   double xf_size=xf2-xf1;
//--- keep scaling parameters  
   m_dx=xf_size/x_size;

тут возникнет zero_devide если х.Max() == Min()

также в Axis::CalcStepSize  / CalcBoundedStepSize / SelectAxisScale и т.д

 
o_O:

в некоторых функциях (не везде) если есть деление, то оно без проверки на 0.

например

void CGraphic::CalculateXAxis(void)
  {
...
...
   double x_size=(m_x.Max()-m_x.Min());
   double xf_size=xf2-xf1;
//--- keep scaling parameters  
   m_dx=xf_size/x_size;

тут возникнет zero_devide если х.Max() == Min()

также в Axis::CalcStepSize  / CalcBoundedStepSize / SelectAxisScale и т.д

Спасибо, исправлю.

Что бы не перегружать библиотеку множеством проверок постарался учесть все случаи в методе Axis::SelectAxisScal.

Файлы:
Axis.mqh  11 kb
 

1. кажется это файл без утренних правок по enum ENUM_AXIS_TYPE

---

2. протестил работу ENUM_AXIS_TYPE c предыдущей страницы

так как вы делаете ValuesFunctionFormat в стиле callback функции, то в функции надо возвращать некий void* параметр.

typedef string(*DoubleToStringFunction)(double, void*);

в CAxis добавить

   DoubleToStringFunction m_values_func;
   void* m_cbdata; // <---

...

// изменить
   void              ValuesFunctionFormat(DoubleToStringFunction func, void* cbdata) { m_values_func=func; m_cbdata=cbdata; }

// добавить получение этого void*
   void* ValuesFunctionFormatCBData(void)    const { return m_cbdata; }


в CGraphic::CalculateXAxis

   DoubleToStringFunction xfunc=m_x.ValuesFunctionFormat();
   void* cbdata=m_x.ValuesFunctionFormatCBData(); // <---

...

         case AXIS_TYPE_CUSTOM:
           {
            m_xvalues[i]=(xfunc==NULL) ? NULL : xfunc(x, cbdata); // <---


----

Этот callback параметр нужен для передачи указателя на объект, который знает где находится массив arrX.

Ибо функция по сути static, и знать что именно её вызывало невозможно.


ЗЫ.

А вот так в принципе уже выглядит результат показа таймсерии (о линиях с показаниями я еще буду просить позже, там есть неудобство получения координат :)

 
o_O:

А вот так в принципе уже выглядит результат показа таймсерии (о линиях с показаниями я еще буду просить позже, там есть неудобство получения координат :)

Сделайте, пожалуйста, видео или более длинную анимацию с момента пустого чарта. По GIF-у не понял, что это.
 
fxsaber:
Сделайте, пожалуйста, видео или более длинную анимацию с момента пустого чарта. По GIF-у не понял, что это.

так лучше?

это эксперт работает на Canvas + CGraphic Романа

в данном случае я строю на нём P/L от нескольких инструментов
 
o_O:

это эксперт работает на Canvas + CGraphic Романа

в данном случае я строю на нём P/L от нескольких инструментов

Теперь яснее. Перекрестье (и, возможно, другая интерактивность) - это встроенный (нужный) функционал библы Романа, или Вы дописали наследованием?

Хочется видеть в СБ-графики элементы интерактивности - перекрестье, зум (в обе стороны) и подсветка значений курсора.

Т.е. делаю GraphPlot через советник/индикатор, и получаю сразу такой функционал. 

 
fxsaber:

Теперь яснее. Перекрестье (и, возможно, другая интерактивность) - это встроенный (нужный) функционал библы Романа, или Вы дописали наследованием?

Да, дописал наследованием.

Хочется видеть в СБ-графики элементы интерактивности - перекрестье, зум (в обе стороны) и подсветка значений курсора.

Будем общаться с главным. Мне тоже кое что надо.

- подсветка (если не она, то как минимум функция GetNearY/X) нужна. Подсветку все равно лучше реализовывать наследованием. Она у каждого в своём представлении разная )

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

- получение значений шкалы - которое по пиксельной координате определяется - это надо.

- С зумомо сложно. Так как нет полос прокруток. И если честно я бы не хотел чтоб их внедряли в этот класс. Он сейчас юзает только CCanvas, и не просит других объектов. И это очень хорошо.
Зум я планирю реализовывать самостоятельно наследованием, поставлю полосы прокрутки и отмасштабирую как надо.