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

 
Anatoli Kazharski:

要素を作成する前にタブを追加してください。この要素またはその要素に関する記事の例を参照してください。言及されていないものがあれば、それはその機能がまだ存在しないことを意味します。

要素が作成された後の追加と削除は、現在リストとテーブルでのみ機能します。

つまり、このクラスではCreateTabs メソッドがタブを作成するための基本なのですね?また、タブの数を変更する場合、Delete メソッドを使用し、その後にCreateTabs メソッドを使用すれば正しいのでしょうか?それとも、Delete メソッドの後に、最初の作成時と同じようにすべてのプロパティを指定し直す必要があるのでしょうか?
 
Konstantin:
つまり、このクラスでは、CreateTabs メソッドがタブを作成するための基本的なメソッドなのでしょうか?タブの数を変更する場合、Delete メソッドを使用し、その後にCreateTabs メソッドを使用するのが正しいのでしょうか?それとも、Delete メソッドの後に、最初の作成時と同じようにすべてのプロパティを再度指定する必要がありますか?

はい、最初にプロパティを指定してから項目を作成します。

現時点では、実行 時に要素を正しく削除するメカニズムはありません。それらは要素の一般的なリストに残ります。しかし、ご質問にあるように試してみてください。私はまだこの方法をテストしていません。

 
Anatoli Kazharski:

最初にプロパティを指定してから要素を作成します。

今のところ、実行 時に要素を正しく削除するメカニズムはありません。それらは要素の一般的なリストに残ります。しかし、あなたの質問にあるように試してみてください。この方法はまだ試していません。

))) 私はすでに試しています。もしすべてがうまくいったら、例を投稿します。
 

これがその仕組みだ:

#ifndef __TBLTABS_MQH__
#define __TBLTABS_MQH__

#include "..\\..\\..\\v1.00\\lib\\define.mqh"

#include <Arrays\List.mqh>
#include <EasyAndFastGUI\WndEvents.mqh>

//+------------------------------------------------------------------+
class CTblTabs
  {
private:
   int      m_x;
   int      m_y;
   long     m_chart_id;
   int      m_subwin;
   string   m_text[];
   int      m_width[];
   CTabs    m_tabs;
   CWindow  *m_form;

public:
                     CTblTabs(void);
                    ~CTblTabs(void);
   bool              Create(CWindow &a_form,const long a_chart_id,const int a_subwin,     // オブジェクトの作成
                              const int a_x,const int a_y);
   void              OnLinkProgram(CList &a_pair);                                        // プログラムとのコミュニケーション
   CTabs*            GetTbl(void) { return &m_tabs; }

private:
   void              UpdateTabs(CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[]);   // テーブルの値を更新する
   bool              ReInit(CWindow &a_form,CList &a_pair,CTabs &a_tabs,string &a_text[],       // オブジェクト・タブの再初期化
                              int &a_width[],const long a_chart_id,const int a_subwin,const int a_x,const int a_y);
  };
//+------------------------------------------------------------------+
/*
 デザイナー
*/
CTblTabs::CTblTabs(void) : m_x(0), m_y(0), m_chart_id(0), m_subwin(0), m_form(NULL) { }
/*
 ¦デストラクタ
*/
CTblTabs::~CTblTabs(void) {
   m_form = NULL;
}
/*!
 \オブジェクトの作成
 ¦param CWindow &a_form - フォームオブジェクト
 ¦param const long a_chart_id - チャートID
 ¦paramconst int a_subwin - チャートサブウィンドウ
 ¦param const int a_x - X座標
 ¦param const int a_y - Y座標
 ¦成功したらtrueを,そうでなければfalseを返します
*/.
bool CTblTabs::Create(CWindow &a_form,const long a_chart_id,const int a_subwin,const int a_x,const int a_y) {
   m_x = a_x;
   m_y = a_y;
   m_chart_id = a_chart_id;
   m_subwin   = a_subwin;
   m_form     = &a_form;

   //--- タブのテキストと幅の配列
   //::ArrayResize(m_text, 1);
   //m_text[0] = "NULL_NULL";
   //::ArrayResize(m_width, 1);
   //m_width[0] = 65;

   m_tabs.WindowPointer(a_form);       // フォームへのポインタを保存する

   //--- 座標
   int _x = a_form.X() + m_x;
   int _y = a_form.Y() + m_y;

   //--- 寸法
   m_tabs.XSize(400);
   m_tabs.YSize(200);

   //--- プロパティ
   m_tabs.TabYSize(20);
   m_tabs.PositionMode(TABS_TOP);
   m_tabs.AutoXResizeMode(true);
   m_tabs.AutoYResizeMode(true);
   m_tabs.AutoXResizeRightOffset(200);
   m_tabs.AutoYResizeBottomOffset(23);
   m_tabs.TabBorderColor(clrLightSteelBlue);
   m_tabs.SelectedTab((m_tabs.SelectedTab() == WRONG_VALUE) ? 0 : m_tabs.SelectedTab());


   //--- 指定されたプロパティを持つタブを追加する
   //for(int i = 0, _size = ArraySize(m_text); i < _size; ++i)
   // m_tabs.AddTab(m_text[i], m_width[i]);

   //--- コントロールを作成する
   //if(!m_tabs.CreateTabs(a_chart_id, a_subwin, _x, _y))
   //   return false;

//---
   return true;
}
/*
 ¦プログラムとの接続
 ¦param CList &a_pair - シグナルを持つ取引ペアリストへのポインタ
*/
void CTblTabs::OnLinkProgram(CList &a_pair) {
   if(a_pair.Total() != m_tabs.TabsTotal())
      this.ReInit(m_form, a_pair, m_tabs, m_text, m_width, m_chart_id, m_subwin, m_x, m_y);
   else
      this.UpdateTabs(a_pair, m_tabs, m_text, m_width);
}
//+------------------------------------------------------------------+
/*!
 \タブの値を更新する
 ¦CList &a_pair - シグナル付き取引ペアリストへのポインタ
 ¦CTabs &a_tabs - テーブルオブジェクト ¦String &a_text[ - タブ名を指定する配列 ¦int &a_width[ - タブの幅サイズを指定する配列 a_tabs - テーブルオブジェクト
 ¦param string &a_text[] - タブ名の配列
 ¦param int &a_width[] - タブ幅サイズの配列
*/.
void CTblTabs::UpdateTabs(CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[]) {
   int _total = a_tabs.TabsTotal();
   //--- データをテーブルに分解する。
   int _count = 0;
   for(CWrapUnitPair *_unit = a_pair.GetFirstNode(); _unit != NULL; _count++, _unit = a_pair.GetNextNode())
      a_tabs.Text(_count, _unit.data_tt[0].ticker + " " + _unit.data_tt[1].ticker);

}
/*!
 \オブジェクトタブの再初期化
 ୧param CWindow &a_form - フォームオブジェクト
 ୧param CList &a_pair - シグナルを持つ取引ペアのリストへのポインタ
 ■param CTabs &a_tabs - テーブルオブジェクト
 ■param string &a_text[] - タブ名の配列
 \param int &a_width[] - タブの幅サイズを表す配列
 ¦ const long a_chart_id - チャートID
 ¦ const int a_subwin - チャートのサブウィンドウ
 \param const int a_x - X座標
 ¦param const int a_y - Y座標
 ¦成功したらtrueを返し、そうでなければfalseを返します
*/.
bool CTblTabs::ReInit(CWindow &a_form,CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[],const long a_chart_id,
                                                                                  const int a_subwin,
                                                                                  const int a_x,
                                                                                  const int a_y) {

   a_tabs.Delete();     // オブジェクトからタブを消去する

   //--- 値の配列を再初期化する
   int _total = a_pair.Total();
   ::ArrayResize(a_text, _total);
   ::ArrayResize(a_width, _total);

   //--- 配列をタブ名で埋める
   int _count = 0;
   for(CWrapUnitPair *_unit = a_pair.GetFirstNode(); _unit != NULL; _count++, _unit = a_pair.GetNextNode()) {
      a_text[_count]  = _unit.data_tt[0].ticker + " " + _unit.data_tt[1].ticker;
      a_width[_count] = 65;
   }

   //--- 指定されたプロパティを持つタブを追加する
   for(int i = 0, _size = ArraySize(m_text); i < _size; ++i)
      a_tabs.AddTab(a_text[i], a_width[i]);

   //--- 座標
   int _x = a_form.X() + a_x;
   int _y = a_form.Y() + a_y;

   //--- コントロールを作成する
   if(!a_tabs.CreateTabs(a_chart_id, a_subwin, _x, _y))
      return false;
//---
   return true;
}
//+------------------------------------------------------------------+

#endif // __tbltabs_mqh__

クラス作成 メソッドで不要になったものは、ReInit メソッドで基本的に使われるので、色で強調しました。

すべてのイベントとインタラクションのメカニズムは、プログラムのメイン・フォーム・クラスに記述されています。


 
Konstantin:

そういうことだ:

例をありがとう。面白いですね。

 
Anatoli Kazharski:

例をありがとう。興味深いです。


タブがない場合、チャート(フォーム)のサイズを変更すると、'Tabs.mqh' (821,21)のarray out of rangeという エラーでプログラムがクラッシュします。

 
Konstantin:

タブがない場合、チャート(フォーム)のサイズを変更すると、'Tabs.mqh' (821,21)のarray out of rangeという エラーでプログラムがクラッシュします。

次回のアップデートで修正する予定です。
 

オブジェクト(フォーム要素)を作成する 際、CWndContainer::AddToElementsArray(0, m_object); メソッドが使用されますが、このコンテナから与えられたオブジェクトを正しく削除するメカニズムはありますか?

これは、上記のタブの追加/削除のメカニズムを使用する際に、チャートを作成/削除する際に必要となります。

 
Konstantin:

オブジェクト(フォーム要素)を作成する 際、CWndContainer::AddToElementsArray(0, m_object); メソッドが使用されますが、このコンテナから与えられたオブジェクトを正しく削除するメカニズムはありますか?

これは、上記のタブの追加/削除のメカニズムを使用する場合、チャートの作成/削除時に必要となります。

これはまだ実装されていません。

 
Anatoli Kazharski:

これはまだ実装されていません。

なぜなら、ダイナミクスでオブジェクトを操作 すると、インターフェイスがよりアニメーション化されるからです。私のタスクでは、ティッカーペアの数でチャートの数を入力するつもりですが、27のティッカーに基づいて702のティッカーペアを持っているので、より多くのティッカーがある別の市場に行った場合、ブレーキがどうなるかを計算するのは難しくありません ))

ちなみに、これだけの数のティッカーペアで、どれだけのメモリーを消費するのかも調べてみます ))