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

 
Anatoli Kazharski:

エレメントをバインドする方法は他にもある:

//---

これらのプロパティと組み合わせて、問題を解決してみよう。


X(...)とY(...)のメソッドは、要素をX座標とY座標にリジッドにバインドし、メイン・フォーム・ウィンドウのサイズ変更に関するイベントを受け取るとき、X座標とY座標の位置には一切反応しないことを理解した。
 
Konstantin:

X(...)とY(...)メソッドは要素をX座標とY座標にリジッドにバインドし、メインフォームウィンドウのサイズを変更するイベントを受け取るとき、X座標とY座標の位置には一切反応しないことを理解しました。

既成のWindowsアプリケーションの例で、必要なものの類似を示してもらえますか?何が必要なのかよくわかりません。あるいは、それをグラフィカルに描いてください。

私の理解が正しければ、element_2はフォームの下端にバインドされ、element_1はelement_2の高さにインデントされた状態で縦方向に自動リサイズされるはずです。

 
Anatoli Kazharski:

既製のWindowsアプリケーションの例で、必要なもののアナログを示してもらえますか?何が必要なのかよくわかりません。あるいは、それをグラフィカルに描いてください。

私の理解が正しければ、element_2はフォームの下端にバインドされ、element_1はelement_2の高さにインデントされた状態で縦方向に自動リサイズされるはずです。


つまり、ウィンドウのサイズが変わると、element_1 の Y サイズが変わり、element_2 もそれに追従する必要があります。今のところ、私はelement_1がスケーリングされないような工夫をしています)。この問題については、後ほど対処します。
 
というのも、オープン・オーダー/ポジションのアイコンは優先順位が高く、それに応じてライブラリのすべてのグラフィカル 要素の上に配置されるからです。
 
Konstantin:
というのも、オープン・オーダー/ポジションのアイコンは優先順位が高く、それに応じてライブラリのすべてのグラフィカル要素の上に配置されるからです。ライブラリの「コア」にグラフィカル・オブジェクトを作成する ことで実現できると思います。

このようにしてみてください:

取引、自動取引システム、取引戦略のテストに関するフォーラム

記事「GUI X: 複数行入力フィールドでのテキスト選択(ビルド13)」についての議論。

Anatoli Kazharski, 2017.05.08 21:40

カスタムアプリケーションクラスに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:

このようにやってみてください:


これは見たことがあるが、ライブラリの「コア」、つまりグラフィカル・オブジェクトを作成する ときの使い方を補足する必要があると思う:

bool  ObjectSetInteger( 
   long                             chart_id,      // チャートの識別子 
   string                           name,          // 名前 
   ENUM_OBJECT_PROPERTY_INTEGER     prop_id,       // プロパティ 
   long                             prop_value     // 値 
   );

プロパティを追加する必要があると思います:

OBJPROP_BACK

 
Konstantin:

しかし、ライブラリの "コア"、つまりグラフィカル・オブジェクトを作成する 際には、使い方を補足する必要があると思います:

プロパティを追加する必要があると思います:

OBJPROP_BACK

そうすれば、グラフィックスはインターフェースのグラフィカル・オブジェクトの上にあることになります。

//---

とりあえずResetWindow()を実行する。後でカーネルに組み込んで、自動的に更新されるようにするつもりだ。

 
Anatoli Kazharski:

そして、グラフはインターフェイスのグラフィカル・オブジェクトの上に配置される。

//---

とりあえずResetWindow()を実行する。後でカーネルに組み込んで、自動的に更新されるようにするつもりだ。


そうではなく、すべてのグラフィカル・オブジェクトをフォアグラウンドに置く必要がある。)
 
Konstantin:

正確には、すべてのグラフィカル・オブジェクトをフォアグラウンドに優先させる必要があります。)

あなたが何をどのようにしたのか知りませんが、デフォルトでは、グラフはフォアグラウンドにあります。一番最近作成されたものが一番上になります。作成後に優先順位を変更する唯一の方法は、下にあるべきものを除いて、オブジェクトを再度非表示にして表示することです。

 

CTabs.クラスのメソッドでは、NULL配列のチェックを追加する必要があります:

void CTabs::CalculatingPatch(int &x,int &y,int &x_size,int &y_size)
  {
   if(ArraySize(m_tabs) == 0)
      return;

   if(m_position_mode==TABS_TOP)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y2()-1;
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_BOTTOM)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y();
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_LEFT)
     {
      x      =m_tabs[m_selected_tab].X2()-1;
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
   else if(m_position_mode==TABS_RIGHT)
     {
      x      =m_tabs[m_selected_tab].X();
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
  }

このチェックがないと、タブがない場合、フォーム全体がエラーでクラッシュしてしまうからです。