記事「DoEasy - コントロール(第31部):ScrollBarコントロールのコンテンツのスクロール」についてのディスカッション

 

新しい記事「DoEasy - コントロール(第31部):ScrollBarコントロールのコンテンツのスクロール」はパブリッシュされました:

この記事では、水平スクロールバーのボタンを使用してコンテナのコンテンツをスクロールする機能を実装します。

EAをコンパイルし、チャート上で起動します。


ご覧のとおり、矢印ボタンによるスクロールはうまく機能しています。マウスでスライダーを動かそうとすると、自然に「抵抗」します。スライダーのシフトの処理はまだありませんが、サイズと座標の再計算は既におこなわれています。そのため、マウスでスライダーを動かそうとすると、その座標を設定するメソッドによって、可視エリア内のコンテナコンテンツの位置に対応する位置にスライダーが返されます。この動作は、後続の記事で最終決定されます。


作者: Artyom Trishkin

 

このような作品には、おそらくmql5、子孫))に記念碑が建てられるだろう。)defines.mqhという4k行のファイル1つ分の価値がある。70の部分と131の部分の 違いを見れば、どれだけの仕事があるのか驚くばかりだ )))

私は、ファイルtrading.mqh、SetPricesで、小さなエラーを発見し、可視性がprivateを持っている、保護されていない、子孫が関数を使用することはできません。 ファイル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、子孫))に記念碑が建てられるだろう。)defines.mqhという4k行のファイル1つ分の価値がある。70の部分と131の部分の 違いを見れば、どれだけの仕事があるのか驚くばかりだ )))

私は小さなエラーを発見し、ファイルtrading.mqhの、SetPricesは、可視性がprivateを持っている、保護されていない、子孫が関数を使用することはできません。 ファイルTradingControl.mqhから、CreatePReqClose()、使用のエラーがあります。


はい。このエラーは私の見落としであり、古いコンパイラが見落としていました。コンパイラの最新バージョンではエラーが検出されたので修正しました。最近のバージョンのライブラリでは、メソッドはprivateセクションではなくprotectedセクションにあります。

 

COrder vs 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);
                        //--- スケジュール・コントロール・オブジェクトへのポインタを返す。
                        return ctrl;
                       }

単純なオブジェクト(テキスト・ラベル)を作成しようとしましたが、できませんでした。

CreateNewStdGraphObject()の後、作成されたオブジェクトは どのようにm_list_charts_controlに取り込まれ、次の呼び出しでゼロでないオブジェクトを取得するのでしょうか?

CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
 
あるいは、m_list_charts_controlには 何がありますか?私はそこに0個のアイテムを持っています。
 
//--- グラフィカル・オブジェクト "Text Label" を作成する。
   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()メソッドは、オブジェクトをソートするために継承したクラスで別途実装する必要があるのではないでしょうか?