Diskussion zum Artikel "Wie erstellt man ein grafisches Panel beliebiger Komplexität?" - Seite 12

 
Vladimir Karputov #:

Es ist verboten. Das Panel ist mit der Karte verbunden.

Ich danke Ihnen vielmals. Ich verstehe.

Darf ich bitte noch eine Frage stellen?

Ich möchte ein Panel erstellen, um eine Tabelle wie diese anzuzeigen






















Aber ich kann nur das unten stehende Steuerelement finden, bedeutet das, dass das Panel die Erstellung der Tabelle nicht unterstützen kann, danke.

CLabel

Steuerelement, das auf dem grafischen Objekt "Text label" basiert

CBmpButton

Steuerelement, das auf dem grafischen Objekt "Bitmap-Label" basiert

CButton

Steuerelement, basierend auf dem grafischen Objekt "Button

CEdit

Control, basierend auf dem grafischen Objekt "Edit field

CPanel

Control, basierend auf dem Grafikobjekt "Rectangle label

CPicture

Control, basierend auf "Bitmap-Label"

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 # :

Ich danke Ihnen vielmals. Ich verstehe.

Darf ich bitte noch eine Frage stellen?

Ich möchte ein Panel erstellen, das eine Tabelle wie die folgende anzeigt






















Aber ich kann nur das Steuerelement unten zu finden, ist, dass bedeuten, Panel kann nicht unterstützen, um die Tabelle zu erstellen, ich danke Ihnen.

CLabel

Steuerelement, das auf dem grafischen Objekt "Text label" basiert

CBmpButton

Steuerelement, das auf dem grafischen Objekt "Bitmap-Label" basiert

CButton

Steuerelement, basierend auf dem grafischen Objekt "Button

CEdit

Control, basierend auf dem grafischen Objekt "Edit field

CPanel

Control, basierend auf dem Grafikobjekt "Rectangle label

CPicture

Control, basierend auf "Bitmap-Label"

Sie müssen die Tabelle selbst erstellen. Suchen Sie nach Beispielen in Artikeln und CodeBase.

 
Vladimir Karputov #:

Sie müssen die Tabelle selbst erstellen. Suchen Sie nach Beispielen in Artikeln und CodeBase.

Ok, vielen Dank. Ich denke, ja.

Ich werde versuchen, sie in Artikel und Codebase zu finden.

Nochmals vielen Dank für Ihre Unterstützung .

 
Wie
 

Ich versuche, eine vertikale Bildlaufleiste ohne Verknüpfung mit dem Panel zu erstellen, nur auf das Diagramm, aber es funktioniert nicht aus irgendeinem Grund.

Zum Beispiel mit einem Kontrollkästchen, reagiert dieser Code auf einen Mausklick. Das Häkchen erscheint und verschwindet.

#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);
}
//+------------------------------------------------------------------+


Aber bei einer vertikalen Bildlaufleiste - keine Reaktion auf Mausklicks.

#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);
}
//+------------------------------------------------------------------+

Können Sie mir bitte sagen, wer weiß, wie man dieses kombinierte Element in einem Diagramm zum Laufen bringt?

 

Können Sie mir sagen, wie man ein Dialogfeld aufruft?
Ich habe zum Beispiel ein Panel erstellt, in dem es eine Schaltfläche "Alle Positionen schließen" gibt. Wenn ich auf diese Schaltfläche klicke, sollte ein Dialogfeld mit der Frage "Sind Sie sicher? Ja/Nein. Wie kann ich das implementieren?

Derzeit erbe ich von CAppDialog und habe ein kleines Formular mit den Schaltflächen Ok/Abbrechen erstellt. Wenn ich auf die Schaltfläche "Ok" klicke, habe ich eine Zeile hinzugefügt

gDialogForm.Destroy();
ChartRedraw();

Aber das Dialogformular bleibt immer noch auf dem Bildschirm.
Wie kann ich das beheben?

 
Nextor Dialogfeld aufruft?
Ich habe zum Beispiel ein Panel erstellt, in dem es eine Schaltfläche "Alle Positionen schließen" gibt. Wenn ich auf diese Schaltfläche klicke, sollte ein Dialogfeld mit der Frage "Sind Sie sicher? Ja/Nein. Wie kann ich das implementieren?

Derzeit erbe ich von CAppDialog und habe ein kleines Formular mit den Schaltflächen "Ok/Cancel" erstellt. Wenn ich auf die Schaltfläche "Ok" klicke, habe ich eine Zeile hinzugefügt

Aber das Dialogformular bleibt immer noch auf dem Bildschirm.
Wie kann man das beheben?

void OnChartEvent(const int id,         // Ereignis-ID
                  const long& lparam,   // Parameter vom Typ long event
                  const double& dparam, // Parameter vom Typ double event
                  const string& sparam  // Parameter vom Typ string events
                 )
{
  // Alle Konten schließen
  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 Dialogfeld aufruft?
Ich habe zum Beispiel ein Panel erstellt, in dem es eine Schaltfläche "Alle Positionen schließen" gibt. Wenn ich auf diese Schaltfläche klicke, sollte ein Dialogfeld mit der Frage "Sind Sie sicher? Ja/Nein. Wie kann ich das implementieren?

Derzeit erbe ich von CAppDialog und habe ein kleines Formular mit den Schaltflächen "Ok/Cancel" erstellt. Wenn ich auf die Schaltfläche "Ok" klicke, habe ich eine Zeile hinzugefügt

Aber das Dialogformular bleibt immer noch auf dem Bildschirm.
Wie kann man das beheben?

Vielleicht hilft dieser Kommentar
 
Nextor Dialogfeld aufruft?
Ich habe zum Beispiel ein Panel erstellt, in dem es eine Schaltfläche "Alle Positionen schließen" gibt. Wenn ich auf diese Schaltfläche klicke, sollte ein Dialogfeld mit der Frage "Sind Sie sicher? Ja/Nein. Wie kann ich das implementieren?

Derzeit erbe ich von CAppDialog und habe ein kleines Formular mit den Schaltflächen "Ok/Cancel" erstellt. Wenn ich auf die Schaltfläche "Ok" klicke, habe ich eine Zeile hinzugefügt

Aber das Dialogformular bleibt immer noch auf dem Bildschirm.
Wie kann man das beheben?

Nehmen Sie das Beispiel "Close On Chart Panel" und fügen Sie einen "MessageBox"-Aufruf in die Click-Handler ein.

Nehmen Sie in der Datei 'Close On Chart Panel Dialog.mqh' diese Änderungen vor:

//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
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);
     }
  }
//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
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);
     }
  }
//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
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();
     }
  }
//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
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();
     }
  }


Ergebnis:


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

Hallo, danke für Ihr tolles Tutorial

Ich versuche, meine eigenen zu machen, in meinem Panel durch einen Klick auf eine Schaltfläche die andere sollte deaktivieren und verstecken, wird es verstecken, wenn ich in den Bereich der versteckten Schaltfläche klicken es immer noch funktionieren

Ich habe meine Codes hier, wenn Sie mir helfen könnten, das wäre großartig

Indikator:

//+------------------------------------------------------------------+
//|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;
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Zuordnung von Indikatorpuffern

   if(!ExtDialog.CreateQ(0,"Question",0,100,100,400,230,"This the test Question?"))
      return(INIT_FAILED);
//--- Anwendung ausführen
   if(!ExtDialog.Run())
      return(INIT_FAILED);
 
      

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion|
//+------------------------------------------------------------------+
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[])
  {
//---
   
//--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }

//+------------------------------------------------------------------+
//| ChartEvent-Funktion|
//+------------------------------------------------------------------+
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);


  }

Klasse:

//+------------------------------------------------------------------+
//|PanelDialog.mqh |
//| Copyright 2009-2015, MetaQuotes Software Corp. |
//| http://www.mql5.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>
//+------------------------------------------------------------------+
//| definiert|
//+------------------------------------------------------------------+
//--- Einzüge und Lücken
#define  INDENT_LEFT_ScrollQ                         (11)      // Einzug von links (unter Berücksichtigung der Breite des Rahmens) (nur für Bildlaufleiste)
#define  INDENT_LEFTQ                         (11)      // Einzug von links (unter Berücksichtigung der Randbreite)
#define  INDENT_TOPQ                          (11)      // Einzug von oben (unter Berücksichtigung der Randbreite)
#define  INDENT_RIGHTQ                        (11)      // Einzug von rechts (unter Berücksichtigung der Randbreite)
#define  INDENT_BOTTOMQ                       (11)      // Einzug von unten (unter Berücksichtigung der Randbreite)
#define  CONTROLS_GAP_XQ                      (80)      // Abstand durch X-Koordinate
#define  CONTROLS_GAP_YQ                      (40)      // Abstand durch Y-Koordinate
//--- für Schaltflächen
#define  BUTTON_WIDTHQ                        (60)     // Größe nach X-Koordinate
#define  BUTTON_HEIGHTQ                       (20)      // Größe nach Y-Koordinate
//--- für den Anzeigebereich

#define  EDIT_HEIGHTQ                         (20)      // Größe nach Y-Koordinate
#define  GROUP_WIDTHQ                         (150)     // Größe nach X-Koordinate
#define  LIST_HEIGHTQ                         (379)     // Größe nach Y-Koordinate
#define  RADIO_HEIGHTQ                        (56)      // Größe nach Y-Koordinate
#define  CHECK_HEIGHTQ                        (93)      // Größe nach Y-Koordinate
//+------------------------------------------------------------------+
//| Klasse CPanelDialog|
//| Verwendung: Hauptdialog der SimplePanel-Anwendung |
//+------------------------------------------------------------------+
class CPanelDialogQ : public CAppDialog
  {
private:

   CLabel            m_Label_Q_text;


   CButton           m_button_Yes;
   CButton           m_button_No;




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


public:
                     CPanelDialogQ(void);
                    ~CPanelDialogQ(void);
   //--- erstellen
   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);
   //--- Diagramm-Ereignishandler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:

   //--- abhängige Steuerelemente erstellen

   bool              CreateLabel_Q_text(string QT);

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


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


  };
//+------------------------------------------------------------------+
//| Ereignisbehandlung|
//+------------------------------------------------------------------+
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)
//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
CPanelDialogQ::CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| Destruktor|
//+------------------------------------------------------------------+
CPanelDialogQ::~CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| Erstellen|
//+------------------------------------------------------------------+
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);
//--- abhängige Steuerelemente erstellen

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

//--- erfolgreich
   return(true);
  }


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

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

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

//--- erstellen
   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);
//--- erfolgreich
   return(true);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateButton_Yes(void)
  {
//--- Koordinaten
   int x1=INDENT_LEFTQ;
   int y1=INDENT_TOPQ+CONTROLS_GAP_YQ;
   int x2=x1+BUTTON_WIDTHQ;
   int y2=y1+BUTTON_HEIGHTQ;
//--- erstellen
   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);
//--- erfolgreich
   return(true);
  }





//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateButton_No(void)
  {
//--- Koordinaten
   int x1=INDENT_LEFTQ+CONTROLS_GAP_XQ;
   int y1=INDENT_TOPQ+CONTROLS_GAP_YQ;
   int x2=x1+BUTTON_WIDTHQ;
   int y2=y1+BUTTON_HEIGHTQ;
//--- erstellen
   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);
//--- erfolgreich
   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();

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