Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar""

 

Опубликована статья DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar":

В статье создадим функционал прокрутки содержимого контейнера кнопками горизонтальной полосы прокрутки.

Скомпилируем советник и запустим его на графике:


Как видим, прокрутка, управляемая кнопками со стрелками вполне корректно работает. При попытке сместить ползунок мышкой он "сопротивляется", что естественно — у нас ещё нет обработки смещения ползунка, но перерасчёт его размеров и координат уже есть. Соответственно, при попытке смещения ползунка мышкой, метод установки его координат возвращает его в то положение, которое соответствует положению содержимого контейнера в его видимой области. В последующих статьях всё будет доработано до правильного функционирования.

Автор: Artyom Trishkin

 

За такие работы памятник, воздвигнут вероятно на mql5, потомки)) Чего стоит один файл defines.mqh, в 4к строк. Если посмотреть на разницу между 70 частью и 131 частью, офигеть, сколько там работы ))

Нашел мелкую ошибку, в файле trading.mqh, SetPrices, имеет видимость приватный, а не защищенный, потомки не могут использовать функцию.  Из файла TradingControl.mqh, CreatePReqClose(), идут ошибки использования.


 private:
  template <typename PR,typename SL,typename TP,typename PL> 
   bool                 SetPrices(const ENUM_ORDER_TYPE action,const PR price,const SL sl,const TP tp,const PL limit,const string source_method,CSymbol *symbol_obj);
 
BillionerClub #:

За такие работы памятник, воздвигнут вероятно на mql5, потомки)) Чего стоит один файл defines.mqh, в 4к строк. Если посмотреть на разницу между 70 частью и 131 частью, офигеть, сколько там работы ))

Нашел мелкую ошибку, в файле trading.mqh, SetPrices, имеет видимость приватный, а не защищенный, потомки не могут использовать функцию.  Из файла TradingControl.mqh, CreatePReqClose(), идут ошибки использования.


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

 

COrder vs CChart

Почему создать форму в классе COrder?

 
BillionerClub #:

Почему создать форму в классе COrder?

Её можно создать в любом классе библиотеки. Позволяет для любого объекта сделать собственный визуал
 

 Может лучше создать структуру а строки превратить в массив CharArray? 

   ulong             m_ticket;                                    // Тикет выбранного ордера/сделки (MQL5)
   long              m_long_prop[ORDER_PROP_INTEGER_TOTAL];       // Целочисленные свойства
   double            m_double_prop[ORDER_PROP_DOUBLE_TOTAL];      // Вещественные свойства
   string            m_string_prop[ORDER_PROP_STRING_TOTAL];      // Строковые свойства
 
//--- Создаёт новый графический объект, возвращает указатель на объект управления чартами
   CChartObjectsControl *CreateNewStdGraphObjectAndGetCtrlObj(const long chart_id,
                                                              const string name,
                                                              int subwindow,
                                                              const ENUM_OBJECT type_object,
                                                              const datetime time1,
                                                              const double price1,
                                                              const datetime time2=0,
                                                              const double price2=0,
                                                              const datetime time3=0,
                                                              const double price3=0,
                                                              const datetime time4=0,
                                                              const double price4=0,
                                                              const datetime time5=0,
                                                              const double price5=0)
                       {
                        //--- Если объект с идентификатором графика и именем уже есть в коллекции - сообщаем об этом и возвращаем NULL
                        if(this.IsPresentGraphObjInList(chart_id,name))
                          {
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_GR_OBJ_ALREADY_EXISTS)," ChartID ",(string)chart_id,", ",name);
                           return NULL;
                          }
                        //--- Если не удалось создать новый стандартный графический объект - сообщаем об этом и возвращаем NULL
                        if(!CreateNewStdGraphObject(chart_id,name,type_object,subwindow,time1,price1,time2,price2,time3,price3,time4,price4,time5,price5))
                          {
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_STD_OBJ_ERR_FAILED_CREATE_STD_GRAPH_OBJ),StdGraphObjectTypeDescription(type_object));
                           CMessage::ToLog(::GetLastError(),true);
                           return NULL;
                          }
                        //--- Если не удалось получить объект управления графиком - сообщаем об этом
                        CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
                        if(ctrl==NULL)
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_FAILED_GET_CTRL_OBJ),(string)chart_id);
                        //--- Возвращаем указатель на объект управления графиком, либо NULL при ошибке его получения
                        return ctrl;
                       }

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

После CreateNewStdGraphObject() как созданный объект должен попадать в m_list_charts_control, чтобы в следующем вызове получить ненулевой объект?

CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
 
Или что там в  m_list_charts_control? У меня там 0 элементов.
 
//--- Создаёт графический объект "Текстовая метка"
   bool              CreateTextLabel(const long chart_id,const string name,const int subwindow,const bool extended,
                                     const int x,const int y,
                                     const string text,const int size,const ENUM_BASE_CORNER corner,
                                     const ENUM_ANCHOR_POINT anchor_point,const double angle)
                       {
                        string nm=this.m_name_program+"_"+name;
                        ENUM_OBJECT type_object=OBJ_LABEL;
                        CChartObjectsControl *ctrl=this.CreateNewStdGraphObjectAndGetCtrlObj(chart_id,nm,subwindow,type_object,0,0);
                        if(ctrl==NULL)
                           return false; 

Возвращает false, не доходя до установки свойств.

 
Получилось, добавив RefreshByChartID(chart_id) после создания...
 
//+------------------------------------------------------------------+
//| Возвращает объект-бар по времени в таймсерии                     |
//+------------------------------------------------------------------+
CBar *CSeriesDE::GetBar(const datetime time)
  {
   CBar *obj=new CBar(); 
   if(obj==NULL)
      return NULL;
   obj.SetSymbolPeriod(this.m_symbol,this.m_timeframe,time);
   this.m_list_series.Sort(SORT_BY_BAR_TIME);
   int index=this.m_list_series.Search(obj);
   delete obj;
   return this.m_list_series.At(index);
  }

Здесь таймсерии не сортирует у меня... Метод Sort() в CArray надо реализовывать отдельно в наследуемом классе для сортировки объектов, разве нет?

Причина обращения: