記事"任意の複雑さのレベルのグラフィカルなパネルを作成する方法"についてのディスカッション - ページ 12

 
Vladimir Karputov #:

それは禁じられている。パネルはチャートにリンクしている。

ありがとうございます。なるほど。

もうひとつ質問させてください。

このような表を表示するパネルを作りたいのですが






















でも、下のコントロールしか見つからないのですが、これはパネルがテーブルの作成をサポートできないということでしょうか?

CLabel

テキストラベル」グラフィックオブジェクトに基づくコントロール

CBmpButton

ビットマップラベル」グラフィックオブジェクトに基づくコントロール

CButton

ボタン」グラフィックオブジェクトを元にしたコントロール

CEdit

Edit field" グラフィックオブジェクトを元にしたコントロール。

CPanel

長方形ラベル" を元にしたコントロール。

CPicture

ビットマップラベル" に基づくコントロール。

Documentation on MQL5: Standard Library / Panels and Dialogs / CEdit
Documentation on MQL5: Standard Library / Panels and Dialogs / CEdit
  • www.mql5.com
CEdit - Panels and Dialogs - Standard Library - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Quan tum # :

ありがとうございます。なるほど。

もうひとつ質問してもいいですか?

次のような表を表示するパネルを作りたいのですが。






















しかし、私は下のコントロールしか見つけることができません、それはパネルがテーブルを作成するためにサポートすることができないということですか、ありがとうございます。

CLabel

テキストラベル」グラフィックオブジェクトに基づくコントロール

CBmpButton

ビットマップラベル」グラフィックオブジェクトに基づくコントロール

CButton

ボタン」グラフィックオブジェクトを元にしたコントロール

CEdit

Edit field" グラフィックオブジェクトを元にしたコントロール。

CPanel

長方形ラベル" を元にしたコントロール。

CPicture

ビットマップラベル" に基づくコントロール。

自分でテーブルを作成する必要があります。ArticlesやCodeBaseで例を探してください。

 
Vladimir Karputov #:

自分でテーブルを作る必要がある。ArticlesやCodeBaseで例を探してください。

わかりました、ありがとうございます。そう思います。

アーティクルやコードベースで探してみます。

本当に ありがとう ございました

 
好き
 

パネルにリンクせずに、チャート上だけに垂直スクロールバーを作ろうとしているのですが、なぜかうまくいきません。

例えば、チェックボックスの場合、このコードはマウスクリックに反応します。目盛りが表示されたり消えたりする。

#include <Controls\CheckBox.mqh>
CCheckBox Chbox;
//+------------------------------------------------------------------+
void OnInit()
{
  Chbox.Create(0, "MyCheckBox", 0, 20, 20, 100, 40);
  ChartRedraw();
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Chbox.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+


しかし、垂直スクロールでは、マウス・クリックに反応しません。

#include <Controls\Scrolls.mqh>
CScrollV Scroll;

void OnInit()
{
  Scroll.Create(0, "MyScrollV", 0, 20, 20, 40, 200);
  ChartRedraw();
}

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Scroll.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+

この結合要素をチャート上で動作させる方法をご存知の方、教えていただけませんか?

 


例えば、 すべてのポジションを閉じる」というボタンがあるパネルを作りました。このボタンをクリックすると、「よろしいですか?はい/いいえ。これを実装するには?

現在CAppDialogを継承して、Ok/Cancelボタンを持つ小さなフォームを作りました。Okボタンをクリックすると、次の行が追加されます。

gDialogForm.Destroy();
ChartRedraw();


どうすれば直りますか?

 
Nextor 「 すべてのポジションを閉じる」というボタンがあるパネルを作りました。このボタンをクリックすると、「よろしいですか?はい/いいえ。どのように実装しますか?

現在CAppDialogを継承して、Ok/Cancelボタンを持つ小さなフォームを作りました。Ok "ボタンをクリックすると、次の行が追加される。


どうすれば直りますか?

void OnChartEvent(const int id,         // イベントID
                  const long& lparam,   // 長いイベント型のパラメータ
                  const double& dparam, // double event型のパラメータ
                  const string& sparam  // 文字列イベント型のパラメータ
                 )
{
  // すべてのアカウントを閉じる
  if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"ClosePos",0)!=-1)) {
    int MB=MessageBox("Close All Positions\nAccount Profit= "+DoubleToString(AccountInfoDouble(ACCOUNT_PROFIT),2),
                      "Close All Positions?", MB_OKCANCEL|MB_ICONQUESTION);
    if(MB==1)
      ClosePosSortProfit("", -1, -1, clrGray);
  }
}
 
Nextor 「 すべてのポジションを閉じる」というボタンがあるパネルを作りました。このボタンをクリックすると、「よろしいですか?はい/いいえ。どのように実装しますか?

現在CAppDialogを継承して、Ok/Cancelボタンを持つ小さなフォームを作りました。Ok "ボタンをクリックすると、次の行が追加される。


どうすれば直りますか?

多分、この コメントが役に立つと思います。
 
Nextor 「 すべてのポジションを閉じる」というボタンがあるパネルを作りました。このボタンをクリックすると、「よろしいですか?はい/いいえ。どのように実装しますか?

現在CAppDialogを継承して、Ok/Cancelボタンを持つ小さなフォームを作りました。Ok "ボタンをクリックすると、次の行が追加される。


どうすれば直りますか?

Close On Chart Panelの例を参考に、クリック・ハンドラに'MessageBox'呼び出しを挿入します。

Close On Chart Panel Dialog.mqh'ファイルに以下の変更を加える

//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton1(void)
  {
   int answer=MessageBox("Close all Sell?","Close all Sell",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.ClosePositions(POSITION_TYPE_SELL);
     }
  }
//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton2(void)
  {
   int answer=MessageBox("Close all Buy?","Close all Buy",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.ClosePositions(POSITION_TYPE_BUY);
     }
  }
//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton3(void)
  {
   int answer=MessageBox("Close all Profit?","Close all Profit",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.CloseProfitPositions();
     }
  }
//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton4(void)
  {
   int answer=MessageBox("Close all Loss?","Close all Loss",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.CloseLossPositions();
     }
  }


結果


Close On Chart Panel
Close On Chart Panel
  • www.mql5.com
Советник-утилита. Панель на базе класса CDialog. Кнопки на базе класса СButton. Четыре кнопки для закрытия BUY, SELL, всех прибыльных, всех убыточных. Работа по текущему символу
 

こんにちは、素晴らしいチュートリアルをありがとうございます。

私のパネルでは、1つのボタンをクリックすると、もう1つのボタンは無効と非表示になるはずですが、非表示ボタンの領域をクリックすると非表示になります。

私のコードをここに書きました。

インジケータ

//+------------------------------------------------------------------+
//|Indicator_Q_Test.mq4
//| Copyright 2020, MetaQuotes Software Corp.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include  <WinUser32.mqh>
#include "PanelDialog_Q.mqh"
CPanelDialogQ ExtDialog;
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- インジケータ・バッファのマッピング

   if(!ExtDialog.CreateQ(0,"Question",0,100,100,400,230,"This the test Question?"))
      return(INIT_FAILED);
//--- アプリケーションの実行
   if(!ExtDialog.Run())
      return(INIT_FAILED);
 
      

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }

//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
      ExtDialog.ChartEvent(id,lparam,dparam,sparam);

  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   ExtDialog.Destroy(reason);


  }

クラス:

//+------------------------------------------------------------------+
//|PanelDialog.mqh
//| Copyright 2009-2015, MetaQuotes Software Corp.|
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Edit.mqh>
#include <Controls\ListView.mqh>
#include <Controls\ComboBox.mqh>
#include <Controls\SpinEdit.mqh>
#include <Controls\RadioGroup.mqh>
#include <Controls\CheckGroup.mqh>
#include <Controls\Label.mqh>
#include <Controls\Scrolls.mqh>
//+------------------------------------------------------------------+
|定義|
//+------------------------------------------------------------------+
//--- インデントとギャップ
#define  INDENT_LEFT_ScrollQ                         (11)      // 左からインデント (ボーダーの幅を考慮) (スクロールバーのみ)
#define  INDENT_LEFTQ                         (11)      // 左からインデントする(ボーダーの幅を考慮する)
#define  INDENT_TOPQ                          (11)      // 上からインデント(ボーダーの幅に余裕を持たせる)
#define  INDENT_RIGHTQ                        (11)      // 右からインデントする(ボーダーの幅を考慮する)
#define  INDENT_BOTTOMQ                       (11)      // 下からインデントする(ボーダーの幅を考慮する)
#define  CONTROLS_GAP_XQ                      (80)      // X座標によるギャップ
#define  CONTROLS_GAP_YQ                      (40)      // Y座標によるギャップ
//--- ボタン用
#define  BUTTON_WIDTHQ                        (60)     // X座標によるサイズ
#define  BUTTON_HEIGHTQ                       (20)      // Y座標によるサイズ
//--- 表示エリア

#define  EDIT_HEIGHTQ                         (20)      // Y座標によるサイズ
#define  GROUP_WIDTHQ                         (150)     // X座標によるサイズ
#define  LIST_HEIGHTQ                         (379)     // Y座標によるサイズ
#define  RADIO_HEIGHTQ                        (56)      // Y座標によるサイズ
#define  CHECK_HEIGHTQ                        (93)      // Y座標によるサイズ
//+------------------------------------------------------------------+
//| クラス CPanelDialog|
//| 使い方: SimplePanelアプリケーションのメインダイアログ。
//+------------------------------------------------------------------+
class CPanelDialogQ : public CAppDialog
  {
private:

   CLabel            m_Label_Q_text;


   CButton           m_button_Yes;
   CButton           m_button_No;




   //****************************************************


public:
                     CPanelDialogQ(void);
                    ~CPanelDialogQ(void);
   //--- 作成
   virtual bool      CreateQ(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2,string QText);
   //--- チャート・イベント・ハンドラ
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:

   //--- 依存コントロールを作成する

   bool              CreateLabel_Q_text(string QT);

   bool              CreateButton_Yes(void);
   bool              CreateButton_No(void);


   void              OnClick_button_Yes(void);
   void              OnClick_button_No(void);


  };
//+------------------------------------------------------------------+
//| イベントハンドリング|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CPanelDialogQ)

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
ON_EVENT(ON_CLICK,m_button_Yes,OnClick_button_Yes)
ON_EVENT(ON_CLICK,m_button_No,OnClick_button_No)

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
CPanelDialogQ::CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| デストラクタ|
//+------------------------------------------------------------------+
CPanelDialogQ::~CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
|作成|
//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateQ(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2,string QText)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- 依存コントロールを作成する

   if(!CreateLabel_Q_text(QText))
      return(false);
   if(!CreateButton_Yes())
      return(false);
   if(!CreateButton_No())
      return(false);

//--- 成功
   return(true);
  }


//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateLabel_Q_text(string QT)
  {
//--- 座標
   int x1=INDENT_LEFTQ;
   int y1=INDENT_TOPQ;
   int x2=ClientAreaWidth()-(INDENT_RIGHTQ+BUTTON_WIDTHQ+CONTROLS_GAP_XQ);
   int y2=y1+EDIT_HEIGHTQ;

//--- 作成
   if(!m_Label_Q_text.Create(m_chart_id,"QT",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_Label_Q_text.Text(QT))
      return(false);
   if(!m_Label_Q_text.FontSize(12))
      return(false);
   if(!m_Label_Q_text.Color(clrBlack))
      return(false);
   if(!m_Label_Q_text.ColorBorder(clrBlack))
      return(false);
   if(!m_Label_Q_text.ColorBackground(clrBlack))
      return(false);
// if(!m_edit.ReadOnly(true))
// return(false);
   if(!Add(m_Label_Q_text))
      return(false);

   m_Label_Q_text.Alignment(WND_ALIGN_WIDTH,INDENT_LEFTQ,0,INDENT_RIGHTQ+BUTTON_WIDTHQ+CONTROLS_GAP_XQ,0);
//--- 成功
   return(true);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateButton_Yes(void)
  {
//--- 座標
   int x1=INDENT_LEFTQ;
   int y1=INDENT_TOPQ+CONTROLS_GAP_YQ;
   int x2=x1+BUTTON_WIDTHQ;
   int y2=y1+BUTTON_HEIGHTQ;
//--- 作成
   if(!m_button_Yes.Create(m_chart_id,m_name+"Yes",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button_Yes.Text("Yes"))
      return(false);
   if(!Add(m_button_Yes))
      return(false);
   m_button_Yes.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHTQ+CONTROLS_GAP_XQ*2,0);
//--- 成功
   return(true);
  }





//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateButton_No(void)
  {
//--- 座標
   int x1=INDENT_LEFTQ+CONTROLS_GAP_XQ;
   int y1=INDENT_TOPQ+CONTROLS_GAP_YQ;
   int x2=x1+BUTTON_WIDTHQ;
   int y2=y1+BUTTON_HEIGHTQ;
//--- 作成
   if(!m_button_No.Create(m_chart_id,m_name+"NO",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button_No.Text("NO"))
      return(false);
   if(!Add(m_button_No))
      return(false);
   m_button_No.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHTQ+CONTROLS_GAP_XQ*1,0);
//--- 成功
   return(true);
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void CPanelDialogQ::OnClick_button_Yes(void)
  {

   Print("OnClick_button_Yes", "Last Error: ",GetLastError());

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void CPanelDialogQ::OnClick_button_No(void)
  {

   Print("OnClick_button_No", "Last Error: ",GetLastError());

m_button_Yes.Hide();
m_button_Yes.Disable();
m_button_Yes.Deactivate();

  }
//+------------------------------------------------------------------+