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

 
Konstantin:

ところで、問題がある:

ハイライトされたラインはテスターでは使えない。

テスターでのテストはまだしていない。ですから、今のところ一時的にです。

テスターでGUIを テストしてみましたか?結果はどうでしたか?イベントは機能しますか?グラフィカル・オブジェクトはすべて表示されていますか?

 
Anatoli Kazharski:

テスターでのテストはまだしていないんだ。そのため、今は一時的にこのような状態になっています。

テスターでGUIをテストしてみましたか?結果はどうですか?イベントは動作しますか?すべてのグラフィカル・オブジェクトが表示されていますか?


はい、すべてのオブジェクトが表示されます。テスターではチャートのマウスイベントは動作しませんが、インターフェイス全体は生きています。

一般的には、ライブラリを編集しないために、内蔵タイマーをあきらめることになるでしょう。)

 

つまり、X上でチャートのサイズを変更しても、フォームはサイズを変更せずに右/左に移動してしまいます。

CWndEventsクラスの ChartEventChartChangeメソッドをオーバーライドするオプションとして、このメソッドはprivateセクションにあります:

void ChartEventCustom(void);
void ChartEventClick(void);
void ChartEventMouseMove(void);
void ChartEventObjectClick(void);
void ChartEventEndEdit(void);
void ChartEventChartChange(void);

メソッドをprotectedセクションに移動させるのは理にかなっていると思いますが、やはりprivateセクションのメソッドもそこで使われているのでしょうか?一般的に、もしこのような問題に遭遇された方がいらっしゃいましたら、解決策をご提案ください。

 
Konstantin:

つまり、X上でチャートのサイズを変更しても、フォームはサイズを変更せずに右/左に移動してしまいます。

CWndEventsクラスの ChartEventChartChangeメソッドをオーバーライドするオプションとして、このメソッドはprivateセクションにあります:

メソッドをprotectedセクションに移動させるのは理にかなっていると思いますが、やはりprivateセクションのメソッドもそこで使われているのでしょうか?一般的に、もしこのような問題に遭遇された方がいらっしゃいましたら、解決策をご提案ください。

だいたいこんな感じ:

//+------------------------------------------------------------------+
//|| コントロール用のフォームを作成する。
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- ウィンドウ配列にウィンドウ・ポインタを追加する。
   CWndContainer::AddWindow(m_window);
//--- 寸法
   int x_size =200;
   int y_size =200;
//--- 座標
   int x =m_chart.WidthInPixels()-(x_size+1);
   int y =1;
//--- プロパティ
...
//--- フォームの作成
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,x,y))
      return(false);
//---
   return(true);
  }

//---

MQLアプリケーション・ユーザー・クラスのイベント・ハンドラで、CHARTEVENT_CHART_CHANGE イベントを処理するとき:

//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      m_window.X(m_chart.WidthInPixels()-(m_window.XSize()+1));
     }
  }

//---

結果

//---

CHARTEVENT_CHART_CHANGE イベントはさまざまなケースで生成されるため、チャート・ウィンドウのサイズ(幅)が変更されたかどうかのチェックも追加できます。例えば、チャートをスクロールする場合です。

 
Anatoli Kazharski:

こんな感じだ:

//---

カスタムMQLアプリケーション・クラスのイベント・ハンドラで、CHARTEVENT_CHART_CHANGE イベントを処理するとき:

//---

結果を返します:

//---

CHARTEVENT_CHART_CHANGE イベントはさまざまなケースで生成されるため、チャート・ウィンドウのサイズ(幅)が変更されたかどうかのチェックも追加できます。例えば、チャートをスクロールする場合などです。


おっと、うまくいった ))
 

テーブル作成 時にSelectableRow(false) が設定されている場合、マウスの左ボタンがクリックされた行のインデックスをテーブルで取得するにはどうすればよいですか?OnEventで sparam パラメータを解析するのはエレガントには見えません。もちろん、SelectableRow(true)を 使用してSelectedItem()を 使用することは可能ですが、このタスクはテーブル内の行を選択することなく行われます。

 
Konstantin:

テーブル作成時にSelectableRow(false) が設定されている場合、マウスの左ボタンがクリックされた行のインデックスをテーブルで取得するにはどうすればよいですか?OnEventで sparam パラメータを解析するのは、エレガントには見えません。もちろん、SelectableRow(true)を使ってSelectedItem()を 使うこともできるが、テーブルの行を選択する必要がない。

今のところ、このような機能しかありませんが、この機能を追加するつもりです。
 
テーブルの行を選択したときのイベントと、コンボボックスの項目を選択したときのイベントを区別するにはどうすればよいですか? コードから、同じON_CLICK_LIST_ITEM イベントを使用していることがわかります。
 
Konstantin:
テーブルの行を選択したときのイベントと、コンボボックスの項目を選択したときのイベントを区別するにはどうすればよいでしょうか? コードから、両者が同じON_CLICK_LIST_ITEM イベントを使用していることは明らかです。
なぜですか?一体何がこれを妨げているのでしょうか?
 

フォームにテーブルを表示し、その中の行を選択し、コンボボックスで値を選択し、テーブルの行のデータとコンボボックスの値を別々のエンティティに書き込む必要があります。今、イベントは区切られておらず、タスクを実現する松葉杖を作る必要があります:


もしかしたら、他のメカニズムを提案できるかもしれない。

基本的に、テーブルはティッカーペアの配列であり、コンボボックスはシグナルのタイプを含み、別のエンティティはシグナルの配列のオブジェクトである。オブジェクト自体は単一のフィールドではなく、複雑なカスタムデータ型であり、テーブルのティッカーペアとシグナルタイプが記録され、別の処理が行われる。