記事"グラフィカルインターフェイスX:マルチラインテキストボックスでのテキスト選択(ビルド13)"についてのディスカッション - ページ 11 1...45678910111213141516 新しいコメント Konstantin 2017.05.03 15:06 #101 Anatoli Kazharski:要素を作成する前にタブを追加してください。この要素またはその要素に関する記事の例を参照してください。言及されていないものがあれば、それはその機能がまだ存在しないことを意味します。要素が作成された後の追加と削除は、現在リストとテーブルでのみ機能します。 つまり、このクラスではCreateTabs メソッドがタブを作成するための基本なのですね?また、タブの数を変更する場合、Delete メソッドを使用し、その後にCreateTabs メソッドを使用すれば正しいのでしょうか?それとも、Delete メソッドの後に、最初の作成時と同じようにすべてのプロパティを指定し直す必要があるのでしょうか? Anatoli Kazharski 2017.05.03 15:23 #102 Konstantin: つまり、このクラスでは、CreateTabs メソッドがタブを作成するための基本的なメソッドなのでしょうか?タブの数を変更する場合、Delete メソッドを使用し、その後にCreateTabs メソッドを使用するのが正しいのでしょうか?それとも、Delete メソッドの後に、最初の作成時と同じようにすべてのプロパティを再度指定する必要がありますか?はい、最初にプロパティを指定してから項目を作成します。現時点では、実行 時に要素を正しく削除するメカニズムはありません。それらは要素の一般的なリストに残ります。しかし、ご質問にあるように試してみてください。私はまだこの方法をテストしていません。 Konstantin 2017.05.03 15:25 #103 Anatoli Kazharski:最初にプロパティを指定してから要素を作成します。今のところ、実行 時に要素を正しく削除するメカニズムはありません。それらは要素の一般的なリストに残ります。しかし、あなたの質問にあるように試してみてください。この方法はまだ試していません。))) 私はすでに試しています。もしすべてがうまくいったら、例を投稿します。 Konstantin 2017.05.03 16:02 #104 これがその仕組みだ:#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 メソッドで基本的に使われるので、色で強調しました。すべてのイベントとインタラクションのメカニズムは、プログラムのメイン・フォーム・クラスに記述されています。 Anatoli Kazharski 2017.05.03 17:09 #105 Konstantin:そういうことだ:例をありがとう。面白いですね。 Konstantin 2017.05.03 17:53 #106 Anatoli Kazharski:例をありがとう。興味深いです。 タブがない場合、チャート(フォーム)のサイズを変更すると、'Tabs.mqh' (821,21)のarray out of rangeという エラーでプログラムがクラッシュします。 Anatoli Kazharski 2017.05.03 18:08 #107 Konstantin: タブがない場合、チャート(フォーム)のサイズを変更すると、'Tabs.mqh' (821,21)のarray out of rangeという エラーでプログラムがクラッシュします。 次回のアップデートで修正する予定です。 Konstantin 2017.05.03 18:33 #108 オブジェクト(フォーム要素)を作成する 際、CWndContainer::AddToElementsArray(0, m_object); メソッドが使用されますが、このコンテナから与えられたオブジェクトを正しく削除するメカニズムはありますか?これは、上記のタブの追加/削除のメカニズムを使用する際に、チャートを作成/削除する際に必要となります。 Anatoli Kazharski 2017.05.03 18:49 #109 Konstantin:オブジェクト(フォーム要素)を作成する 際、CWndContainer::AddToElementsArray(0, m_object); メソッドが使用されますが、このコンテナから与えられたオブジェクトを正しく削除するメカニズムはありますか?これは、上記のタブの追加/削除のメカニズムを使用する場合、チャートの作成/削除時に必要となります。これはまだ実装されていません。 Konstantin 2017.05.04 04:58 #110 Anatoli Kazharski:これはまだ実装されていません。なぜなら、ダイナミクスでオブジェクトを操作 すると、インターフェイスがよりアニメーション化されるからです。私のタスクでは、ティッカーペアの数でチャートの数を入力するつもりですが、27のティッカーに基づいて702のティッカーペアを持っているので、より多くのティッカーがある別の市場に行った場合、ブレーキがどうなるかを計算するのは難しくありません ))ちなみに、これだけの数のティッカーペアで、どれだけのメモリーを消費するのかも調べてみます )) 1...45678910111213141516 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
要素を作成する前にタブを追加してください。この要素またはその要素に関する記事の例を参照してください。言及されていないものがあれば、それはその機能がまだ存在しないことを意味します。
要素が作成された後の追加と削除は、現在リストとテーブルでのみ機能します。
つまり、このクラスでは、CreateTabs メソッドがタブを作成するための基本的なメソッドなのでしょうか?タブの数を変更する場合、Delete メソッドを使用し、その後にCreateTabs メソッドを使用するのが正しいのでしょうか?それとも、Delete メソッドの後に、最初の作成時と同じようにすべてのプロパティを再度指定する必要がありますか?
はい、最初にプロパティを指定してから項目を作成します。
現時点では、実行 時に要素を正しく削除するメカニズムはありません。それらは要素の一般的なリストに残ります。しかし、ご質問にあるように試してみてください。私はまだこの方法をテストしていません。
最初にプロパティを指定してから要素を作成します。
今のところ、実行 時に要素を正しく削除するメカニズムはありません。それらは要素の一般的なリストに残ります。しかし、あなたの質問にあるように試してみてください。この方法はまだ試していません。
これがその仕組みだ:
クラス作成 メソッドで不要になったものは、ReInit メソッドで基本的に使われるので、色で強調しました。
すべてのイベントとインタラクションのメカニズムは、プログラムのメイン・フォーム・クラスに記述されています。
そういうことだ:
例をありがとう。面白いですね。
例をありがとう。興味深いです。
タブがない場合、チャート(フォーム)のサイズを変更すると、'Tabs.mqh' (821,21)のarray out of rangeという エラーでプログラムがクラッシュします。
タブがない場合、チャート(フォーム)のサイズを変更すると、'Tabs.mqh' (821,21)のarray out of rangeという エラーでプログラムがクラッシュします。
オブジェクト(フォーム要素)を作成する 際、CWndContainer::AddToElementsArray(0, m_object); メソッドが使用されますが、このコンテナから与えられたオブジェクトを正しく削除するメカニズムはありますか?
これは、上記のタブの追加/削除のメカニズムを使用する際に、チャートを作成/削除する際に必要となります。
オブジェクト(フォーム要素)を作成する 際、CWndContainer::AddToElementsArray(0, m_object); メソッドが使用されますが、このコンテナから与えられたオブジェクトを正しく削除するメカニズムはありますか?
これは、上記のタブの追加/削除のメカニズムを使用する場合、チャートの作成/削除時に必要となります。
これはまだ実装されていません。
これはまだ実装されていません。
なぜなら、ダイナミクスでオブジェクトを操作 すると、インターフェイスがよりアニメーション化されるからです。私のタスクでは、ティッカーペアの数でチャートの数を入力するつもりですが、27のティッカーに基づいて702のティッカーペアを持っているので、より多くのティッカーがある別の市場に行った場合、ブレーキがどうなるかを計算するのは難しくありません ))
ちなみに、これだけの数のティッカーペアで、どれだけのメモリーを消費するのかも調べてみます ))