文章 "图形界面 XI: 集成标准图形库 (统合构建 16)" - 页 7

 

我复制了它。当滑块位于面板顶部时,我必须调整面板的大小。之后,滑块和面板上的所有元素都会挂起。

[删除]  

您好

有人找到上面帖子中的故障原因了吗?

我得到的错误信息是"'WndEvents.mqh' (287,72) 中的数组超出范围"

 
Спартак Угланов:

您好

有人找到上面帖子中的故障原因了吗?

我得到的错误信息是"'WndEvents.mqh' (287,72) 中的数组超出范围"。

在这里检查一下是否超出范围,就是这样。

[删除]  
Konstantin:

只需在其中加入超限检查就可以了。

这是个有趣的想法,但怎么做呢?


      int available_elements_total=CWndContainer::AvailableElementsTotal(m_active_window_index);
      int ass = ArraySize(m_wnd[m_active_window_index].m_available_elements);
      Print("ass = ",ass," available_elements_total = ",available_elements_total);
      for(int e=0; e<available_elements_total; e++)
        {
         CElement *el=m_wnd[m_active_window_index].m_available_elements[e];


12 个元素,理论上不应该超出范围。

(系列文章中的 TradePanelTest 示例)

 
Спартак Угланов:

这是一个有趣的想法,但怎么做呢?



12 个元素,理论上不应该超出范围。

(文章系列中的 TradePanelTest 示例)

如果出现错误,就意味着有错误,用调试器运行它,这是查看发生了什么的最可靠方法。

[删除]  
Konstantin:

如果出现错误,就说明它确实存在,用调试器运行它,这是最可靠的方法。

我把项目 移到了另一个文件夹,并重新命名了指标文件,结果运行时没有出错。

我是星期一出生的:O)

 
Anatoli Kazharski:


 

在最近的版本中,我们为编译器添加了一条信息,用于处理子代中重载 祖先方法的 情况:

deprecated behavior, hidden method calling will be disabled in a future MQL compiler version    

示例

struct SFoo
  {
   static void func(int)
     {
      Print(__FUNCSIG__);
     }
  };
 
struct SBar : SFoo
  {
   static void func(double)
     {
      Print(__FUNCSIG__);
     }     
  };

void OnStart()
  {
   SBar::func(_Digits);       // !!! 将被调用为 SFoo::func(int) --这样更合适。
  }

在本例中,SFoo 祖先类的 func(int) 函数在 SBar 子类中被调用,因为编译器没有在子类中找到该函数。 子类只有 func(double) 函数,编译器试图在继承树中找到具有合适参数的函数。

也就是说,MQL5 编译器执行的是重载,而不是覆盖子代中的方法。在语言开发之初,MQL5 编译器的这种放宽并不重要。但将来可能会发生变化,因此现在明确警告 MQL5 程序的开发人员注意并更正他们的代码。

严格来说,重载是一个更宽泛的概念,您可以在互联网
上搜索重载和重载之间的区别。

 
MetaQuotes Software Corp.:

我什么也不懂,但它非常有趣!编译器对几个函数说了脏话,这是其中之一,它在哪里不喜欢它?

//+------------------------------------------------------------------+
//| 元素的可用性|
//+------------------------------------------------------------------+
void CElement::IsAvailable(const bool state)
  {
//--- 如果已经设置,则退出
   if(state==CElementBase::IsAvailable())
      return;
//--- 设置
   CElementBase::IsAvailable(state);
//--- 其他元素
   int elements_total=ElementsTotal();
   for(int i=0; i<elements_total; i++)
      m_elements[i].IsAvailable(state);
//--- 设置鼠标左键点击的优先级
   if(state)
      SetZorders();
   else
      ResetZorders();
  }
 
Pavel Kolchin:

我什么也不懂,但它非常有趣!编译器对几个函数说了脏话,这是其中之一,它在哪里不喜欢它?

因为还有

bool              IsAvailable(void)                         const { return(m_is_available);               }


我试着把它改成

   virtual void      Set Available(const bool state)                  { m_is_available=state;                 }
   bool              IsAvailable(void)                         const { return(m_is_available);               }

没关系 )

其他的也要这么做 )