記事"グラフィカルインターフェイスX:マルチラインテキストボックスでのテキスト選択(ビルド13)"についてのディスカッション - ページ 12

 

タブを動的に追加/削除したり、タブの配列にチャートを追加/削除したりするタスクを実行中に、CTabs クラスでタブの名前を取得できないという問題に遭遇した。そこで、このクラスにタブ名を取得するメソッドを追加することを提案する:

   //---指定されたインデックスにテキスト(タブ名)を設定する。 (2) получает текст (имя вкладки) по указанному индексу
   void              Text(const uint index,const string text);                     // このメソッドは
   string            Text(const uint index) { return m_tab[index].text; }  // それだけでは不十分だ
このメソッドを追加する必要があるのは、足りないメソッドを補うためにCTabs クラスを継承しても、m_tab[] オブジェクトがクラスの保護領域にあるため、オーバーロードされた Text メソッドを 実装することができないからである。また、自分の都合の良いようにクラスを編集することは、OOPの原則に反する。
 
Konstantin:

...

あなたが以前の記事で書いたことをすべて実行します。
 
EasyAndFastGUI/MQL5/Images/EasyAndFastGUI/Icons/bmp16 ライブラリに画像を追加します。二本足」のアービトラージャーのために、私だけでなく役に立つでしょう ))
ファイル:
 
Anatoli Kazharski:
CWndEvents::ResetWindow() メソッドを使って、ディールの矢印がパネルの上にぶら下がらないようにしてください。
どこに挿入しますか?
 
Pavel Kolchin:
どこに置く?
OnTrade()を試してみて ください。
 
Anatoli Kazharski:
OnTrade()を試して ください。


できません、失敗します。

メニュー・ファイルにはそのようなイベントはありませんが、メイン・ファイルに挿入すると失敗します。

 
Pavel Kolchin:


できません、失敗します

メニュー・ファイルにはそのようなイベントはありませんが、メイン・ファイルに貼り付けると失敗します。

カスタム・アプリケーション・クラスにCProgram::OnTradeEvent()メソッドを作成する必要があります。

そして、メイン・ファイルのOnTrade() 関数の中で呼び出す必要があります:

//+------------------------------------------------------------------+
//| トレード機能|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   program.OnTradeEvent();
  }

//---

例えば、CProgram::OnTradeEvent()メソッドの内容は以下のようになります:

//+------------------------------------------------------------------+
//| 取引イベント|
//+------------------------------------------------------------------+
void CProgram::OnTradeEvent(void)
  {
//--- すべてのチャートにトレードイベントを送信する。
   m_events.SendEventToAllCharts(0,ON_TRADE_EVENT,0,0.0,m_program_name);
//--- 最後の位置のトランザクションを設定する
   if(m_show_deals.CheckButtonState())
      if(m_vdeals.ShowDealsLastPosition())
         ResetWindow();
//--- 損切り距離の確認
   if(m_trailing_stop.CheckButtonState())
      m_ctrade.CheckStopLossSize(::Symbol());
//--- 貿易業務のための変数のゼロ化
   m_ctrade.ZeroCalcPositionVariables();
//--- 残高配列の初期化とチャート上の系列の更新。
   InitBalanceArray();
   m_line_chart.SeriesUpdate(0,m_balance_data,"Balance",clrCornflowerBlue);
  }
 
Anatoli Kazharski:


もう少し上に加える
public:
   //--- 貿易
   void              OnTradeEvent(void);
すべてがうまくいく )
 
要素_2、例えばテーブルを、要素_1、例えば同じテーブルの下端にバインドする方法がわかりません。その結果、グラフのサイズが変わると、要素_1の下側の境界が移動し、要素_2の上側の境界が その後に移動する必要があります。ライブラリにはAutoYResizeMode メソッドとAutoYResizeBottomOffset メソッドがありますが、上境界のずれを実装する方法がわかりません。
 
Konstantin:
要素_2、例えばテーブルを、要素_1、例えば同じテーブルの下端にバインドする方法がわかりません。その結果、グラフのサイズが変わると、要素_1の下側の境界が移動し、要素_2の上側の境界が その後に移動する必要があります。ライブラリにはAutoYResizeMode メソッドとAutoYResizeBottomOffset メソッドがありますが、上境界のずれをどのように実装するのかがわかりません。

要素をバインドするメソッドもある:

   //--- 要素をウィンドウの(1)右端と(2)下端にバインドするモード(get/set)
   bool              AnchorRightWindowSide(void)               const { return(m_anchor_right_window_side);   }
   void              AnchorRightWindowSide(const bool flag)          { m_anchor_right_window_side=flag;      }
   bool              AnchorBottomWindowSide(void)              const { return(m_anchor_bottom_window_side);  }
   void              AnchorBottomWindowSide(const bool flag)         { m_anchor_bottom_window_side=flag;     }

//---

これらのプロパティと組み合わせて問題を解決してみてください。