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

 
Konstantin:

メソッドX(const int x)およびY(const int y) は、フォーム内のテーブルの位置に影響を与えません。

相対座標は、カスタムクラスで要素を作成する際に設定さ れます:

//--- コントロールの作成
   if(!m_canvas_table.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);

//---

タスクは何ですか?

 
Anatoli Kazharski:

相対座標は、カスタムクラスで要素が作成されるときに設定さ れます:

//---

タスクは何ですか?

2つのテーブルを水平に配置するために、x_gap,y_ gapで水平スクロールの位置を変える、それだけ((.

PS.だから、ずれたように見えるが、なぜか2つのテーブルがずれている ))

で、メソッドの中で

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

2つのテーブルがある場合、最初のパラメータは常に0ですか、それは同じオブジェクトのシリアル番号ですか?

なぜか1つ目のテーブルは2つ目のテーブルの下にしつこく移動します。

 
Konstantin:

...

PS.それで、ずれたようだが、なぜか2つのテーブルがずれた ))

メソッドの中で

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

テーブルが2つある場合、最初のパラメータは常に0ですか、それとも同じオブジェクトのシリアル番号ですか?

最初のパラメータは、アイテムがアタッチされているフォームの番号です。おそらく、1つの同じテーブルを要素の共通リストに追加しているのでしょう。
 
Anatoli Kazharski:
最初のパラメータは、その要素が添付されているフォームの番号です。おそらく、共通リストに同じテーブルを追加しているのでしょう。


共通リストとはどういう意味ですか?

フォームクラスでの作成方法です:

/*!
 \brief オブジェクトの作成
 ¦param const string a_name - 番組名
 ¦param const uint a_pause - ステータスラインの更新のための一時停止
 ¦return 成功すればtrue、そうでなければfalse
*/.
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- テーブル・オブジェクトをオブジェクト・グループの共通配列に追加する。
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

GetTbl メソッドはCCanvasTable m_table へのポインタを返します

 
Konstantin:

...

これがあなたの望む結果ですか?

//---

アーカイブに例を添付しました:

ファイル:
 
Konstantin:

フォーム・クラスの create メソッドです:

GetTbl メソッドはCCanvasTable m_table へのポインタを返します

//--- コントロールの作成
   if(!m_canvas_table2.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);
//--- オブジェクト・グループの共通配列にオブジェクトを追加する。
   CWndContainer::AddToElementsArray(0,m_canvas_table2);
 
Anatoli Kazharski:

こんな結果を望んでいるのか?

//---

アーカイブに例を添付した:


私はこのようにしました:

/*!
 \brief オブジェクトの作成
 ¦param const string a_name - 番組名
 ¦param const uint a_pause - ステータスラインの更新を一時停止
 ¦return 成功すればtrue、そうでなければfalse
*/.
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   //--- テーブル・オブジェクトをオブジェクト・グループの共通配列に追加する。
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- テーブル・オブジェクトをオブジェクト・グループの共通配列に追加する。
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

オブジェクトを作成した後、すぐにコンテナに入れ、それから別のオブジェクトを作成する必要があることがわかりました ))


 
Anatoli Kazharski:

メイン・フォーム・クラス、テーブル・クラス1、テーブル・クラス2......といった具合に機能を管理するのに便利なのだ。
 
Konstantin:

いや、私はテーブルを他のクラスにもっているんだ。モジュラー・プログラミングを使っているんだ)だから、メイン・フォーム・クラス、テーブル・クラス1、テーブル・クラス2といった機能を管理する方が便利なんだ。
同感です。このライブラリの多くのユーザーはこのようにしている。)
 
Anatoli Kazharski:
私もそう思う。このライブラリーの多くのユーザーはそうしているけど、僕はどうしても手が出せないんだ。)


ところで、問題があります:

CWndEvents::CWndEvents(void) : m_chart_id(0),
                               m_subwin(0),
                               m_active_window_index(0),
                               m_indicator_shortname(""),
                               m_program_name(PROGRAM_NAME),
                               m_subwindow_handle(INVALID_HANDLE),
                               m_subwindow_shortname(""),
                               m_subwindows_total(1)

  {
//--- タイマーをスタートさせる。
   if(!::MQLInfoInteger(MQL_TESTER))
      ::EventSetMillisecondTimer(TIMER_STEP_MSC);
//--- 現在のチャートのIDを取得
   m_chart.Attach();
//--- マウス・イベントのトラッキングを有効にする
   m_chart.EventMouseMove(true);
//--- SpaceキーとEnterキーのコマンドライン呼び出しを無効にする。
   m_chart.SetInteger(CHART_QUICK_NAVIGATION,false);
//--- サブウィンドウ番号を決定する
   DetermineSubwindow();
  }

選択された行はテスターでは動作しません。このように選択した方がよいでしょう:

enum ENUM_GRAPHICS {
   GRAPHICS_NO    = 0,  // グラフィックは不要
   GRAPHICS_REAL  = 1,  実際の取引のための//チャート
   GRAPHICS_TEST  = 2   // テスト用グラフィック
};

/*!
 実行中のプログラムの表示を取得
*/
ENUM_GRAPHICS CCheck::GetGraphics(void) { return m_graphics; }
//-----------------------------------------------------------------------------+
/*
 グラフィックス表示の符号
 ENUM_GRAPHICS列挙からのプログラム操作の符号
*/を返します。
ENUM_GRAPHICS CCheck::CheckGraphicsDisplay(void) {
   if(MQLInfoInteger(MQL_OPTIMIZATION) || (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)))
      m_graphics = GRAPHICS_NO;
   else if(!MQLInfoInteger(MQL_OPTIMIZATION) && !MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_REAL;
   else if(MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_TEST;
//---
   return m_graphics;
}

プログラムではこのように選択します:

   //--- OnTimer()の設定
   uint _pause = 0;
   if(in_param.graphics == GRAPHICS_REAL)
      _pause = 500;                       // 500 ms
   else if(in_param.graphics == GRAPHICS_TEST)
      _pause = 60000;                     // 1分

   if(!main_form.Create(name_mts, _pause)) {
      ::Print(__FUNCTION__," > GUIの作成に失敗しました!");
      return INIT_FAILED;
   }

または、フラグを使って選択する