記事"グラフィカルインタフェースXI:標準グラフィックライブラリの統合(ビルド16)"についてのディスカッション - ページ 7

 

再現しました。スライダーがパネルの一番上にあるとき、パネルのサイズを変更しなければなりません。その後、スライダーとパネル上のすべての要素がハングします。

削除済み  

こんにちは

上の投稿の不具合の原因を見つけた方はいらっしゃいますか?

"array out of range in 'WndEvents.mqh' (287,72)" というエラーが出ます

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

こんにちは

上の投稿の不具合の原因を見つけた方はいらっしゃいますか?

"array out of range in '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);               }

それは大丈夫です )

そして、同じことを他のものについても行わなければならないだろう )