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

 
leonerd #:

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

Нет. В CArrayObj есть метод Sort():

//+------------------------------------------------------------------+
//| Search of position of element in a sorted array                  |
//+------------------------------------------------------------------+
int CArrayObj::Search(const CObject *element) const
  {
   int pos;
//--- check
   if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1)
      return(-1);
//--- search
   pos=QuickSearch(element);
   if(m_data[pos].Compare(element,m_sort_mode)==0)
      return(pos);
//--- not found
   return(-1);
  }
//+------------------------------------------------------------------+

Внутри метода используется метод Compare(), который и нужно переопределять в наследуемых классах.

В классе CBar, объекты которого хранятся в списке, где ищем нужный бар, метод Compare() уже переопределён (равно как и во всех классах объектов библиотеки):

//+------------------------------------------------------------------+
//| Сравнивает объекты CBar между собой по указанному свойству       |
//+------------------------------------------------------------------+
int CBar::Compare(const CObject *node,const int mode=0) const
  {
   const CBar *bar_compared=node;
//--- сравнение целочисленных свойств двух баров
   if(mode<BAR_PROP_INTEGER_TOTAL)
     {
      long value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_INTEGER)mode);
      long value_current=this.GetProperty((ENUM_BAR_PROP_INTEGER)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
//--- сравнение вещественных свойств двух баров
   else if(mode<BAR_PROP_DOUBLE_TOTAL+BAR_PROP_INTEGER_TOTAL)
     {
      double value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_DOUBLE)mode);
      double value_current=this.GetProperty((ENUM_BAR_PROP_DOUBLE)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
//--- сравнение строковых свойств двух баров
   else if(mode<BAR_PROP_DOUBLE_TOTAL+BAR_PROP_INTEGER_TOTAL+BAR_PROP_STRING_TOTAL)
     {
      string value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_STRING)mode);
      string value_current=this.GetProperty((ENUM_BAR_PROP_STRING)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
   return 0;
  }
//+------------------------------------------------------------------+

Структура поиска объектов в библиотеке организована верно.

Что у Вас не выходит? Может просто потому, что не с начала начали изучать библиотеку?

 
Artyom Trishkin #:


Что у Вас не выходит? Может просто потому, что не с начала начали изучать библиотеку?

Здравствуйте. Да я не жалуюсь, конечно, я не прочитал все ваши статьи. Сомневаюсь, что вообще такие были. Но простые вещи не работают и даже не описано толком, как они должны работать. 

Вот у вас есть стандартные графические элементы. Кстати, на множество базовых элементов даже нет примеров (Edit в данном случае).

Ну так вот, CreateEditField() не работает. Вылетает в методе CreateNewStdGraphObjectAndGetCtrlObj(). Вот здесь:

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);
CChartObjectsControl *CGraphElementsCollection::GetChartObjectCtrlObj(const long chart_id)
  {
//--- В цикле во общему количеству объектов в списке
   for(int i=0;i<this.m_list_charts_control.Total();i++)
     {
      //--- Получаем указатель на очередной объект
      CChartObjectsControl *obj=this.m_list_charts_control.At(i);
      //--- Если указатель получить не удалось - переходим к следующему
      if(obj==NULL)
         continue;
      //--- Если идентификатор графика объекта равен искомому - возвращаем указатель на объект в списке
      if(obj.ChartID()==chart_id)
         return obj;
     }
//--- Не нашли объект - возвращаем NULL
   return NULL;
  }

Ну а m_list_charts_control пустой.. соответственно, ничего не добавляется и метод ничего не возвращает.

Вообще, косяков хватает. Такое чувство, что на практике никто библиотеку не использует. Возьмите инструмент с единственным разрешенным типом заполнения IOC. Ну вот, не будет работать. Не определяет он правильно. Пришлось мне море методов отредактировать... Вы просто пройдите по своему торговому методу. Причем, изначальный метод в инициалазации корректирует filling, но торговый метод его не подцепляет.

Метод CTrading::OpenPosition()

this.m_request.type_filling=(type_filling>WRONG_VALUE ? type_filling : trade_obj.GetTypeFilling());

Ок, нашли правильный тип заполнения, если он в ордере не указан явно.

Но дальше-то мы передаем в следующий метод изначальную переменную. Какой смысл-то? Или я чего-то не понимаю...

res=trade_obj.OpenPosition(type,this.m_request.volume,this.m_request.sl,this.m_request.tp,magic,comment,deviation,type_filling);
 
leonerd #:

Здравствуйте. Да я не жалуюсь, конечно, я не прочитал все ваши статьи. Сомневаюсь, что вообще такие были. Но простые вещи не работают и даже не описано толком, как они должны работать. 

Вот у вас есть стандартные графические элементы. Кстати, на множество базовых элементов даже нет примеров (Edit в данном случае).

Ну так вот, CreateEditField() не работает. Вылетает в методе CreateNewStdGraphObjectAndGetCtrlObj(). Вот здесь:

Ну а m_list_charts_control пустой.. соответственно, ничего не добавляется и метод ничего не возвращает.

Вообще, косяков хватает. Такое чувство, что на практике никто библиотеку не использует. Возьмите инструмент с единственным разрешенным типом заполнения IOC. Ну вот, не будет работать. Не определяет он правильно. Пришлось мне море методов отредактировать... Вы просто пройдите по своему торговому методу. Причем, изначальный метод в инициалазации корректирует filling, но торговый метод его не подцепляет.

Метод CTrading::OpenPosition()

Ок, нашли правильный тип заполнения, если он в ордере не указан явно.

Но дальше-то мы передаем в следующий метод изначальную переменную. Какой смысл-то? Или я чего-то не понимаю...

Вот это обсуждение как-то относится именно к этой статье? Нет. 
По какой именно статье вопросы? 
Давайте в еë обсуждении и разберëм их. 
PS  не помню, чтобы делал уже для библиотеки класс поля ввода. CreateEditField() откуда взяли? 
 
Artyom Trishkin #:
Вот это обсуждение как-то относится именно к этой статье? Нет. 
По какой именно статье вопросы? 
Давайте в еë обсуждении и разберëм их. 
PS  не помню, чтобы делал уже для библиотеки класс поля ввода. CreateEditField() откуда взяли? 

CreateEditField() в Engine.mqh

 
leonerd #:

CreateEditField() в Engine.mqh

С телефона не погляжу) 
Потом отвечу, как посмотрю код. 
 
leonerd #:
Ну так вот, CreateEditField() не работает. Вылетает в методе CreateNewStdGraphObjectAndGetCtrlObj().

А зачем Вы в приватные методы лезете? Они нужны только для работы библиотеки.

Для пользователя нужны публичные методы. Конечному пользователю не нужна работа внутренних методов.

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

leonerd #:
Вообще, косяков хватает. Такое чувство, что на практике никто библиотеку не использует.

Если не читали описания, и пытаетесь под себя переделывать и для себя использовать внутренние методы, то косяков хватает не у автора, а у переделывающего.

И, да, библиотека ещё на стадии разработки.

С типом заливки погляжу, спасибо.

Но лучше обсуждать в обсуждении соответствующих статей - чтобы сразу же было видно описание, а не разговор вести об одном в обсуждении совсем другого.

 
А зачем Вы в приватные методы лезете? Они нужны только для работы библиотеки.
Не имею ни малейшего желания туда лезть. Если б всё работало, то даже не открывал бы.
 
leonerd #:
Не имею ни малейшего желания туда лезть. Если б всё работало, то даже не открывал бы.

Что у Вас не работает? Код, пожалуйста. Просто говорить, что не работает - не продуктивно.

 
Artyom Trishkin #:

Что у Вас не работает? Код, пожалуйста. Просто говорить, что не работает - не продуктивно.

Согласен, что непродуктивно. Поэтому я и предоставил максимум деталей в этом комменте https://www.mql5.com/ru/forum/438481/page2#comment_53551638

Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar""
Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar""
  • 2023.06.19
  • Artyom Trishkin
  • www.mql5.com
Опубликована статья DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar" : Автор: Artyom Trishkin...
 
leonerd #:
я и предоставил максимум деталей в этом комменте

Максимум деталей - это код, который можно скомпилировать, запустить, посмотреть, что не работает и найти и сообщить причину.

Без тестов статьи не публикуются. В тестах всё работает. Потому и задаю третий раз вопрос: что делаете, и что там у Вас не работает. Код, пожалуйста.