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

 

新文章 DoEasy. 控件(第三十一部分):滚动条控件内内容的滚动已发布:

在本文中,我将实现通过按钮滚动水平滚动条容器内容的功能。

编译 EA,并在图表上启动它:


如您所见,由箭头按钮管理的滚动效果良好。 当尝试用鼠标移动滑块时,它会“抗拒”,这是很自然的 — 我们仍未处理滑块移位,但我们已经重新计算了它的尺寸和坐标。 故此,当我们尝试用鼠标移动滑块时,设置其坐标的方法会返回到与其可见区域中容器内容的位置相对应的位置。 此行为将在后续文章中终结。


作者:Artyom Trishkin

 

对于这样的作品,可能会在 mql5 上竖立一座纪念碑,后人)))一个 4k 行的 defines.mqh 文件价值几何?如果你看看 70 个部分和 131个部分 之间的差别,就会惊叹工作量之大 )))

我发现了一个小错误,在文件trading.mqh 中,SetPrices 的 可见性为 private,而非 protected,因此后代无法使用该函数。 在文件 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 上竖立一座纪念碑,后人)))一个 4k 行的 defines.mqh 文件价值几何?如果你看看 70 个部分和 131个部分 之间的差别,就会惊叹工作量之大 )))

我发现了一个小错误,在文件trading.mqh 中,SetPrices 的 可见性为 private,而非 protected,因此后代无法使用该函数。 在文件 TradingControl.mqh 中,CreatePReqClose() 存在使用错误。


是的,这个错误是我的疏忽和旧编译器的错误造成的。在最新版本的编译器中,该错误已被检测到并得到修复。在最新版本的库中,这些方法位于受保护部分,而不是私有部分

 

COrder 与 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)
                       {
                        //--- 如果图表 ID 和名称的对象已存在于集合中,则报告并返回 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);
  }

这里的时间序列没有为我排序....CArray 中的 Sort() 方法应该在继承类中单独实现,以便对对象进行排序,不是吗?