記事"グラフィカルインタフェースVII: タブコントロール(チャプター2)"についてのディスカッション - ページ 3

 

CLabelアイテムを作成 し、タブに追加しようとすると、コンパイラが次のようなエラーを出します:


CLabel m_overview_titlte_label;

bool CMainPanel::CreateOverviewTitleLabel(const string text)
  {

//--- パネルオブジェクトを渡す
   m_overview_title_label.WindowPointer(m_window);
//--- 最初のタブグループの4番目のタブに貼り付ける
   m_main_panel_tabs.AddToElementsArray(0,m_overview_title_label);  
   m_main_panel_tabs.AddToElementsArray( 
//--- 座標
   int x=m_window.X()+OVERVIE_TITLE_LABEL_GAP_X;
   int y=m_window.Y()+OVERVIE_TITLE_LABEL_GAP_Y;
//--- 作成前にプロパティを設定する
   m_overview_title_label.XSize(140);
   m_overview_title_label.YSize(18);
   //m_overview_title_label.
//--- コントロールの作成
   if(!m_overview_title_label.Create(m_chart_id,text,m_subwin,x,y))
      return(false);
//--- オブジェクト・グループの共通配列にオブジェクトを追加する。
   //CWndContainer::AddToElementsArray(0,m_overview_title_label);
   return(true);
  }


Compiler Error:

'WindowPointer' - function not defined MainPanel.mqh 233 27

'm_overview_title_label' - parameter conversion not allowed MainPanel.mqh 235 43

'm_overview_title_label' - 期待されるものと同じ型の変数 MainPanel.mqh 235 43

 
Martin Fischer 関数が ありません。 これらのオブジェクトを作成することはできますが、ウィンドウに添付することができません。 この場合、 は機能しません。 2.) CComboBoxは静的オブジェクトですか。 の要素リストを変更することは可能ですか?







ComboBox-Listviewの要素のリストをComboBoxの作成後に変更することは可能ですか?

ありがとうございます!

私も同じ問題がありました。インクルード・ファイルを作成して、ラベル・クラスを書いて、それを使うことで解決しました。このファイルはIncludeEasyAndFastGUIに作成する必要があります。

そのコードは

//+------------------------------------------------------------------+
//|MyLabel.mqh
//|著作権 2023, Sassiz.ルート
//|https://t.me/R00T_S4SS12
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, Sassiz.Root"
#property link      "https://t.me/R00T_S4SS12"
#property strict

#include "Element.mqh"
#include "Window.mqh"
//+------------------------------------------------------------------+
//| チェックボックスを作成するクラス|
//+------------------------------------------------------------------+
class MyLabel : public CElement
  {
private:
   //--- 要素がアタッチされているフォームへのポインタ
   CWindow          *m_wnd;
   //--- チェックボックスを作成するためのオブジェクト

   CLabel            m_label;

   //--- チェックボックスのテキスト
   string            m_label_text;
   //--- テキスト・ラベルの余白
   int               m_label_x_gap;
   int               m_label_y_gap;
   //--- さまざまな状態におけるテキスト・ラベルの色
   color             m_label_color;
   color             m_label_color_off;
   color             m_label_color_hover;
   color             m_label_color_locked;
   color             m_label_color_array[];
   //--- マウスの左ボタン押下の優先順位
   int               m_zorder;
   int               m_area_zorder;

   //---
public:
                     MyLabel(void);
                    ~MyLabel(void);
   //--- チェックボックスを作成するためのメソッド
   bool              CreateLabel(const long chart_id,const int subwin,const string text,const int x,const int y);
   //---
private:
   bool              CreateLabel2(void);
   //---
public:
   //--- (1) フォームポインタを格納 (2) チェックボックスの状態を返す/設定する
   void              WindowPointer(CWindow &object)                 { m_wnd=::GetPointer(object);            }

   //--- (1) 背景色、(2) テキストラベルの余白

   void              LabelXGap(const int x_gap)                     { m_label_x_gap=x_gap;                   }
   void              LabelYGap(const int y_gap)                     { m_label_y_gap=y_gap;                   }
   //--- 異なる状態でのテキストの色
   void              LabelColor(const color clr)                    { m_label_color=clr;                     }

   //--- (1)チェックボックスの説明、(2)チェックボックスボタンの状態を返す/設定する。
   string            LabelText(void)                          const { return(m_label.Description());         }

   //--- 色を変える
   void              ChangeObjectsColor(void);
   //---
public:
   //--- チャート・イベント・ハンドラ
   virtual void      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   //--- タイマー
   virtual void      OnEventTimer(void);
   //--- 要素の移動
   virtual void      Moving(const int x,const int y);
   //--- (1) 表示、(2) 非表示、(3) リセット、(4) 削除
   virtual void      Show(void);
   virtual void      Hide(void);
   virtual void      Reset(void);
   virtual void      Delete(void);
   //--- (1) マウスの左ボタン押下の優先順位の設定、(2) リセット
   virtual void      SetZorders(void);
   virtual void      ResetZorders(void);
   //--- 色をリセットする
   virtual void      ResetColors(void);
   virtual void      SetText(string text);
   virtual void      SetFontSize(int fontSize);
   //---
private:
   //--- エレメントへのプレスの処理
   bool              OnClickLabel(const string clicked_object);
  };
//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
MyLabel::MyLabel(void) :      
                             m_label_x_gap(20),
                             m_label_y_gap(2),
                             m_label_color(clrBlack)
                             
  {
//--- エレメント・クラスの名前をベース・クラスに格納する。
   CElement::ClassName(CLASS_NAME);
//--- マウスの左ボタンクリックの優先順位を設定する。
   m_zorder      =0;
   m_area_zorder =1;
  }
//+------------------------------------------------------------------+
//| デストラクタ|
//+------------------------------------------------------------------+
MyLabel::~MyLabel(void)
  {
  }
//+------------------------------------------------------------------+
//| イベント処理|
//+------------------------------------------------------------------+
void MyLabel::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- カーソル移動イベントの処理
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      //--- 要素が非表示の場合は残す
      if(!CElement::IsVisible())
         return;
      //--- サブウィンドウの数が一致しない場合は、そのままにしておく。
      if(CElement::m_subwin!=CElement::m_mouse.SubWindowNumber())
         return;
      //--- 要素上のフォーカスをチェックする
      CElement::MouseFocus(m_mouse.X()>X() && m_mouse.X()<X2() && m_mouse.Y()>Y() && m_mouse.Y()<Y2());
      return;
     }
//--- オブジェクトに対するマウスの左クリックを処理する。
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      //--- チェックボックスを押す
      if(OnClickLabel(sparam))
         return;
     }
  }
//+------------------------------------------------------------------+
//| タイマー|
//+------------------------------------------------------------------+
void MyLabel::OnEventTimer(void)
  {
//--- フォームがブロックされていない場合
   if(!m_wnd.IsLocked())
      //--- 要素オブジェクトの色を変更する
      ChangeObjectsColor();
  }
//+------------------------------------------------------------------+
//| チェックボックスオブジェクトのグループを作成します。|
//+------------------------------------------------------------------+
bool MyLabel::CreateLabel(const long chart_id,const int subwin,const string text,const int x,const int y)
  {
//--- フォーム・ポインタがない場合は、そのままにしておく。
   if(!CElement::CheckWindowPointer(::CheckPointer(m_wnd)))
      return(false);
//--- 変数の初期化
   m_id         =m_wnd.LastId()+1;
   m_chart_id   =chart_id;
   m_subwin     =subwin;
   m_x          =x;
   m_y          =y;
   m_label_text =text;
//--- 端からのマージン
   CElement::XGap(CElement::X()-m_wnd.X());
   CElement::YGap(CElement::Y()-m_wnd.Y());
//--- 要素の作成

   if(!CreateLabel2())
      return(false);
//--- ウィンドウがダイアログであるか、最小化されている場合、要素を隠す
   if(m_wnd.WindowType()==W_DIALOG || m_wnd.IsMinimized())
      Hide();
//---
   return(true);
  }


//+------------------------------------------------------------------+
//| チェックボックスのラベルを作成する|
//+------------------------------------------------------------------+
bool MyLabel::CreateLabel2(void)
  {
//--- オブジェクト名の形成
   string name=CElement::ProgramName()+"_lable_"+(string)CElement::Id();
//--- 座標
   int x =CElement::X()+m_label_x_gap;
   int y =CElement::Y()+m_label_y_gap;
//--- 状態に応じた文字色
   color label_color=clrBlack;//(m_check_button_state) ? m_label_color : m_label_color_off;
//--- オブジェクトを設定する
   if(!m_label.Create(m_chart_id,name,m_subwin,x,y))
      return(false);
//--- プロパティを設定する
   m_label.Description(m_label_text);
   m_label.Font(FONT);
   m_label.FontSize(FONT_SIZE);
   m_label.Color(label_color);
   m_label.Corner(m_corner);
   m_label.Anchor(m_anchor);
   m_label.Selectable(false);
   m_label.Z_Order(m_zorder);
   m_label.Tooltip("\n");
//--- 端からのマージン
   m_label.XGap(x-m_wnd.X());
   m_label.YGap(y-m_wnd.Y());
//--- グラデーション配列の初期化
   CElement::InitColorArray(label_color,m_label_color_hover,m_label_color_array);
//--- オブジェクト・ポインタを格納する
   CElement::AddToArray(m_label);
   return(true);
  }
//+------------------------------------------------------------------+
| エレメントの移動|
//+------------------------------------------------------------------+
void MyLabel::Moving(const int x,const int y)
  {
//--- 要素が非表示の場合は残す
   if(!CElement::IsVisible())
      return;
//--- 要素フィールドにインデントを保存する
   CElement::X(x+XGap());
   CElement::Y(y+YGap());
//--- オブジェクトのフィールドに座標を格納する
   m_label.X(x+m_label.XGap());
   m_label.Y(y+m_label.YGap());
//--- グラフィカル・オブジェクトの座標を更新する
   m_label.X_Distance(m_label.X());
   m_label.Y_Distance(m_label.Y());
  }
//+------------------------------------------------------------------+
//| カーソルをオブジェクトの上に置いたときのオブジェクトの色を変更する。
//+------------------------------------------------------------------+
void MyLabel::ChangeObjectsColor(void)
  {
//--- 要素がブロックされている場合は退出する。

//---
   color label_color=clrBlack;//(m_check_button_state) ? m_label_color : m_label_color_off;
   CElement::ChangeObjectColor(m_label.Name(),CElement::MouseFocus(),OBJPROP_COLOR,label_color,m_label_color_hover,m_label_color_array);
  }
//+------------------------------------------------------------------+
//| コンボボックスを表示|
//+------------------------------------------------------------------+
void MyLabel::Show(void)
  {
//--- 要素がすでに表示されている場合は、そのままにしておく。
   if(CElement::IsVisible())
      return;
//--- すべてのオブジェクトを可視化する
   for(int i=0; i<CElement::ObjectsElementTotal(); i++)
      CElement::Object(i).Timeframes(OBJ_ALL_PERIODS);
//--- 視認性の状態
   CElement::IsVisible(true);
  }
//+------------------------------------------------------------------+
//| コンボボックスを隠す|
//+------------------------------------------------------------------+
void MyLabel::Hide(void)
  {
//--- 要素がすでに表示されている場合は、そのままにしておく。
   if(!CElement::IsVisible())
      return;
//--- すべてのオブジェクトを隠す
   for(int i=0; i<CElement::ObjectsElementTotal(); i++)
      CElement::Object(i).Timeframes(OBJ_NO_PERIODS);
//--- 視認性の状態
   CElement::IsVisible(false);
  }
//+------------------------------------------------------------------+
//| 再描画|
//+------------------------------------------------------------------+
void MyLabel::Reset(void)
  {
//--- ドロップダウン要素の場合は、そのままにしておく。
   if(CElement::IsDropdown())
      return;
//--- 非表示と表示
   Hide();
   Show();
  }
//+------------------------------------------------------------------+
| 削除|
//+------------------------------------------------------------------+
void MyLabel::Delete(void)
  {
//--- オブジェクトの削除
   m_label.Delete();
//--- オブジェクトの配列を空にする
   CElement::FreeObjectsArray();
//--- デフォルト値による変数の初期化
   CElement::MouseFocus(false);
   CElement::IsVisible(true);
  }
//+------------------------------------------------------------------+
//| 優先順位を決める|
//+------------------------------------------------------------------+
void MyLabel::SetZorders(void)
  {
   m_label.Z_Order(m_zorder);
  }
//+------------------------------------------------------------------+
//| 優先順位のリセット|
//+------------------------------------------------------------------+
void MyLabel::ResetZorders(void)
  {
   m_label.Z_Order(0);
  }
//+------------------------------------------------------------------+
//| オブジェクトの色をリセットする。|
//+------------------------------------------------------------------+
void MyLabel::ResetColors(void)
  {

//--- 色をリセットする
   m_label.Color(clrBlack);
//--- フォーカスをゼロにする
   CElement::MouseFocus(false);
  }

//+------------------------------------------------------------------+
//| 要素のヘッダーをクリックする|
//+------------------------------------------------------------------+
bool MyLabel::OnClickLabel(const string clicked_object)
  {

//--- マウスカーソルは現在、要素の上にある。
   m_label.Color(m_label_color_hover);
//--- メッセージを送る
   ::EventChartCustom(m_chart_id,ON_CLICK_LABEL,CElement::Id(),0,m_label.Description());
   return(true);
  }
//+------------------------------------------------------------------+


void MyLabel::SetText(string text){
   m_label.Description(text);
}

void MyLabel::SetFontSize(int fontSize){
   m_label.FontSize(fontSize);
}

そして、このようにMyLabelクラスからオブジェクトを作って、それを使う:

   //---ラベル
   MyLabel           m_overview_title_label;

そして

//+------------------------------------------------------------------+
//| 概要タイトルラベルの作成|
//+------------------------------------------------------------------+
bool CMainPanel::CreateOverviewTitleLabel(const string text)
  {

//--- パネルオブジェクトを渡す
   m_overview_title_label.WindowPointer(m_window);
//--- 最初のタブグループの4番目のタブに取り付ける
   m_main_panel_tabs.AddToElementsArray(0,m_overview_title_label);  
//--- 座標
   int x=m_window.X()+OVERVIE_TITLE_LABEL_GAP_X;
   int y=m_window.Y()+OVERVIE_TITLE_LABEL_GAP_Y;
//--- 作成前にプロパティを設定する
   m_overview_title_label.XSize(140);
   m_overview_title_label.YSize(18);
   m_overview_title_label.SetText(text);
   m_overview_title_label.SetFontSize(18);
   //m_overview_title_label.
//--- コントロールの作成
   if(!m_overview_title_label.CreateLabel(m_chart_id,m_subwin,text,x,y))
      return(false);
//--- オブジェクト・グループの共通配列にオブジェクトを追加する。
   CWndContainer::AddToElementsArray(0,m_overview_title_label);
   return(true);
  }
 
タブの数を増やすと、縦であれ横であれ、スクロールができなくなり、ウィンドウが限界を超えて広がり、効率が落ちる。