文章 "DoEasy. 控件(第三十一部分):滚动条控件内内容的滚动" - 页 2

 
leonerd CArray 中的 Sort() 方法应该在继承类中单独实现,以便 对象进行排序,不是吗?

CArrayObj.Compare()方法内部有一个 Sort()方法:

//+------------------------------------------------------------------+
// 搜索排序数组中元素的位置
//+------------------------------------------------------------------+
int CArrayObj::Search(const CObject *element) const
  {
   int pos;
//--- 检查
   if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1)
      return(-1);
//--- 搜索
   pos=QuickSearch(element);
   if(m_data[pos].Compare(element,m_sort_mode)==0)
      return(pos);
//--- 未找到
   return(-1);
  }
//+------------------------------------------------------------------+

Compare()方法中的Sort()方法,在继承类中需要覆盖该方法。

在 CBar 类(其对象存储在我们要查找的条形列表中)中,Compar() 方法已经被覆盖(在库对象的所有类中也是如此):

//+------------------------------------------------------------------+
//| 根据指定属性比较 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 #:


有什么问题?也许是因为您没有从一开始就使用图书馆?

您好。我不是在抱怨,当然我也没有读过您所有的文章。我怀疑有没有。但是一些简单的东西并不能正常工作,甚至没有说明它们应该如何工作。

这里有标准的图形元素。顺便说一下,许多基本元素(本例中的编辑)甚至都没有示例。

因此,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 类型,那么它将无法工作。那么,它将无法工作。因为它没有正确定义。我不得不编辑大量的方法....。你只要通过你的交易方法就可以了。此外,初始化中的初始方法纠正了填充,但交易方法并没有接受它。

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 #:

您好。我不是在抱怨,我当然没有读过你所有的文章。我怀疑你有没有读过。但是,简单的东西都不能用,甚至都没有说明它们应该如何工作。

这里有标准的图形元素。顺便说一下,您甚至没有为许多基本元素(这里是编辑)提供示例。

因此,CreateEditField() 无法运行。它在 CreateNewStdGraphObjectAndGetCtrlObj() 方法中崩溃。就是这样:

嗯,m_list_charts_control 是空的......因此,没有添加任何内容,该方法也没有返回任何内容。

总的来说,错误已经够多了。我感觉没有人会实际使用这个库。如果一个工具只允许填充 IOC 类型,那么它将无法工作。那么,它将无法工作。因为它没有正确定义。我不得不编辑大量的方法....。你只需查看你的交易方法。初始化中的初始方法修正了填充,但交易方法却没有修正。

CTrading::OpenPosition() 方法

好了,我们找到了正确的填充类型,如果订单中没有明确指定的话。

但是,我们将原始变量传递给了下一个方法。这有什么意义呢?还是我有什么不明白的地方?

这个讨论与本文有什么关系吗?没有。
哪篇文章有问题?
让我们在讨论中解决它们。
PS 我不记得我为库制作了一个输入域类。CreateEditField() 你是从哪里得到的?
 
Artyom Trishkin #:
这种讨论与这篇文章有关系吗?没有。
问题是关于哪篇文章的?
让我们在讨论中解决它们。
PS 我不记得我为库制作了一个输入字段类。CreateEditField() 你是从哪里得到的?

Engine.mqh 中的 CreateEditField()

 
leonerd #:

Engine.mqh 中的 CreateEditField()

我无法用手机查看)。
等我看到代码后再回答你。
 
leonerd #:
CreateEditField()不起作用。它在 CreateNewStdGraphObjectAndGetCtrlObj() 方法中崩溃。

你为什么要插手私有方法?只有库工作时才需要它们。

用户需要的是公共方法。最终用户并不需要内部方法的工作。

如果你想了解这一切的工作原理,那么介绍所有这些厨房的文章就是为此目的而写的。你想做什么和怎么做并不是很清楚。你不说,也不举例,只是指着从大量例子中抽出的一行说它不起作用....。

leonerd#:
一般来说,有足够多的接头。我感觉没有人会实际使用这个库。

如果你不看说明,试图自己修改和使用内部方法,那么有足够 bug 的不是作者,而是修改它的人。

是的,这个库还在开发中。

我会看看填充类型,谢谢。

但最好还是在相应文章的讨论中进行讨论--这样您就能一次性看到相关说明,而不是在讨论其他内容时谈论一件事。

 
А зачем Вы в приватные методы лезете? Они нужны только для работы библиотеки.
我根本不想进去。如果一切正常,我甚至不会打开它。
 
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 #:
我在这条评论中提供了最详细的信息。

最详细的代码就是你可以编译、运行、查看不工作的地方并找到和报告原因的代码。

没有测试,文章就无法发表。测试中一切正常。这就是为什么我第三次问你:你在做什么?请提供代码。