Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar""
За такие работы памятник, воздвигнут вероятно на 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);
За такие работы памятник, воздвигнут вероятно на mql5, потомки)) Чего стоит один файл defines.mqh, в 4к строк. Если посмотреть на разницу между 70 частью и 131 частью, офигеть, сколько там работы ))
Нашел мелкую ошибку, в файле trading.mqh, SetPrices, имеет видимость приватный, а не защищенный, потомки не могут использовать функцию. Из файла TradingControl.mqh, CreatePReqClose(), идут ошибки использования.
Да. Эта ошибка была по моей недоглядке и по ошибке старого компилятора, пропустившего её. В последних версиях компилятора ошибка обнаружилась и я её исправил. В последних версиях библиотеки методы находятся в защищённой секции, а не в приватной
Может лучше создать структуру а строки превратить в массив 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);
//--- Создаёт графический объект "Текстовая метка" 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, не доходя до установки свойств.
//+------------------------------------------------------------------+ //| Возвращает объект-бар по времени в таймсерии | //+------------------------------------------------------------------+ 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 надо реализовывать отдельно в наследуемом классе для сортировки объектов, разве нет?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar":
В статье создадим функционал прокрутки содержимого контейнера кнопками горизонтальной полосы прокрутки.
Скомпилируем советник и запустим его на графике:
Как видим, прокрутка, управляемая кнопками со стрелками вполне корректно работает. При попытке сместить ползунок мышкой он "сопротивляется", что естественно — у нас ещё нет обработки смещения ползунка, но перерасчёт его размеров и координат уже есть. Соответственно, при попытке смещения ползунка мышкой, метод установки его координат возвращает его в то положение, которое соответствует положению содержимого контейнера в его видимой области. В последующих статьях всё будет доработано до правильного функционирования.
Автор: Artyom Trishkin