記事"グラフィカルインタフェースX:リストとテーブルの高度な管理コードの最適化(ビルド7)"についてのディスカッション - ページ 9

 

トール、ヒントをありがとう:

//--- コラム
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- 垂直スクロールバー・スライダーの現在位置を取得する。
      v=m_scrollv.CurrentPos()+t;
      //--- 行
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- オフセット・テーブル・データ
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- ハイライトされた行の調整
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
            //--- セルの (1) 値、(2) 背景色、(3) 文字色、(4) 文字揃えを調整する。
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }
というわけで、すべて思い通りに動きました ;)
 

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

EasyAndFastGUIライブラリ

Viktor Glovluk, 2017.01.26 10:42 AM.

フォーラムの皆様、助けてください!

Anatoli Kazharskiから このライブラリに基づいて、フクロウを溶接しようとしており、チェックボックスの状態と入力フィールドの値のファイル内のレコードを整理したかった!しかし、すべての値を毎回記録しないために、私はクリックされた要素を決定する方法を理解することができません!ユーザーアプリケーションにはイベントハンドラがあり、パラメータlparamは要素のインデックスを担当しているだけなのですが、このインデックスによってどのように要素を見つけ、それを使って動作するのかが理解できません!

よろしくお願いします!


 

Viktor Glovluk, 2017.01.26 10:42

フォーラムの皆さん、助けてください!

Anatoli Kazharskiの このライブラリに基づいて、フクロウを作成しようとしており、チェックボックスの状態や入力フィールドの値をファイルに記録したいと考えています!しかし、すべての値を毎回記録しないために、クリックされた要素を判断する方法がわかりません!ユーザーアプリケーションにはイベントハンドラがあり、パラメータlparamは要素のインデックスを担当しているだけなのですが、このインデックスによってどのように要素を見つけ、それを使って動作するのかが理解できません!

よろしくお願いします!

チェックボックスのクリックは、ON_CLICK_LABELという 識別子を持つイベントで追跡できます。

lparamには 、要素の識別子の値が入ります。

//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- テキストラベルのクリックイベント
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      //--- 最初のチェックボックスをクリックした場合
      if(lparam==m_checkbox1.Id())
        {
         //---
        }
     }
  }
 

本当にこの方法しかないのでしょうか?

//--- 最初のチェックボックスをクリックした場合

if(lparam==m_checkbox1.Id())

この投稿を残した後、すでに回答がありました!ありがとうございます!そして、私はすべてのチェックボックスと入力フィールドを 通過しなければなりませんか?そして、それらの "ヒープ "がある場合の例として?項目のすべてのインデックスを格納する配列はありません?そして、このインデックスによって、必要な値(例えば、クリックされた、またはクリックされていないチェックボックス、入力フィールドの値)を取得します!
 
Viktor Glovluk:

それしかないのか?

どうしたい?明確にする。
 
Viktor Glovluk:

...

ヒープ」がある場合の例は?要素のすべてのインデックスを格納する配列はないのですか?そして、このインデックスによって必要な値(例えば、クリックされたチェックボックスやクリックされていないチェックボックス、入力フィールドの値)を取得します!

CWndContainer クラスの内容を見てください。これらはすべてWindowElements 構造体に格納されています。これらはユーザークラスからアクセスできます。

   //--- 要素の配列の構造
   struct WindowElements
     {
      //--- 全オブジェクトの合計配列
      CChartObject     *m_objects[];
      //--- 全要素の合計配列
      CElementBase     *m_elements[];

      //--- 要素の個人配列:
      // コンテキストメニューの配列
      CContextMenu     *m_context_menus[];
      //--- メインメニューの配列
      CMenuBar         *m_menu_bars[];
      //--- ツールチップ
      CTooltip         *m_tooltips[];
      //--- さまざまなタイプのドロップダウンリストの配列
      CElementBase     *m_drop_lists[];
      //--- スクロールバーの配列
      CElementBase     *m_scrolls[];
      //--- テキスト・ラベルの表の配列
      CElementBase     *m_labels_tables[];
      //--- 入力フィールドからのテーブルの配列
      CElementBase     *m_tables[];
      //--- 描画されたテーブルの配列
      CElementBase     *m_canvas_tables[];
      //--- タブの配列
      CTabs            *m_tabs[];
      //--- 写真付きタブの配列
      CIconTabs        *m_icon_tabs[];
      //--- カレンダーの配列
      CCalendar        *m_calendars[];
      //--- ドロップダウン・カレンダーの配列
      CDropCalendar    *m_drop_calendars[];
      //--- ツリーリスト
      CTreeView        *m_treeview_lists[];
      //--- ファイル・ナビゲーター
      CFileNavigator   *m_file_navigators[];
      //--- 標準グラフィックス(グラフィックスオブジェクト)
      CStandardChart   *m_sub_charts[];
      //--- ピクチャー・スライダー
      CPicturesSlider  *m_pictures_slider[];
      //--- 時間
      CTimeEdit        *m_time_edits[];
      //--- 複数行のフィールド
      CTextBox         *m_text_boxes[];
     };
   //--- 各ウィンドウの要素配列の配列
   WindowElements    m_wnd[];
 

遠ければ遠いほどいい!:)

またしても、理解できないイベント・ハンドラの実装に出くわした!カスタム・アプリケーションを作るときは、クラスを通してGUIに接続することになっている:

//--- 取引パネルクラスの接続
#include "Menu.mqh"
CProgram program;

でも、もしそれらがCProgramクラスのprivate ゾーンにあるのなら、どうやってボタンが押されたのをキャッチするのか、どうやってチェックボックスの状態や入力フィールドの 値を取得するのか?必要なものはpublicに 移すべきなのでしょうか、それとも何か誤解しているのでしょうか?

 
Viktor Glovluk:

...

しかし、ボタンが押されたのをどうやってキャッチするか、チェックボックスの状態や入力フィールドの 値をどうやって取得するか、...。

CProgram ハンドラでは

//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- テキストラベルのクリックイベント
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

すべての記事には、コントロールの イベントを処理する方法を示すMQLアプリケーションのサンプル・ファイルがあります。

 
Anatoli Kazharski:

CProgram ハンドラで。

//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- テキストラベルのクリックイベント
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

どの記事にもMQLアプリケーションのサンプル・ファイルがあり、コントロール・イベントの処理方法が示されています。

CProgram ハンドラーでは明確ですが、このハンドラーはインターフェースのためのものですよね?そこに貿易ソリューションを押し込んではいけない!私はOOPについてほとんど理解していません!:)

例えば、エキスパートアドバイザーで、入力フィールドに 設定されたロット数の注文を出すにはどうすればいいのでしょうか?EA自体でこのフィールドの値を取得する必要があります!

 
Viktor Glovluk:

CProgram ハンドラーでは明確ですが、このハンドラーはインターフェイスのためのものですよね?そこにトレード・ソリューションを押し込むべきではない!

なぜダメなんですか?はい、できます。これはMQLアプリケーション(インジケーターまたはExpert Advisor)のクラスです。すべては同じです。

このように入力フィールドから 値を取得することができます:

m_spin_edit1.GetValue()