Diskussion zum Artikel "Grafische Interfaces VII: Das Tab-Control (Kapitel 2)" - Seite 3

 

Wie kann ich CLabel zu Registerkarten hinzufügen, wenn ich CLabel Element erstellen und wollen zu Registerkarten hinzufügen Compiler gibt mir diese Fehler:


CLabel m_overview_titlte_label;

bool CMainPanel::CreateOverviewTitleLabel(const string text)
  {

//--- Übergabe des Panel-Objekts
   m_overview_title_label.WindowPointer(m_window);
//--- An die vierte Registerkarte der ersten Gruppe von Registerkarten anhängen
   m_main_panel_tabs.AddToElementsArray(0,m_overview_title_label);  
   m_main_panel_tabs.AddToElementsArray( 
//--- Koordinaten
   int x=m_window.X()+OVERVIE_TITLE_LABEL_GAP_X;
   int y=m_window.Y()+OVERVIE_TITLE_LABEL_GAP_Y;
//--- Eigenschaften vor der Erstellung festlegen
   m_overview_title_label.XSize(140);
   m_overview_title_label.YSize(18);
   //m_overview_title_label.
//--- Kontrolle erstellen
   if(!m_overview_title_label.Create(m_chart_id,text,m_subwin,x,y))
      return(false);
//--- Hinzufügen des Objekts zu dem gemeinsamen Array von Objektgruppen
   //CWndContainer::AddToElementsArray(0,m_overview_title_label);
   return(true);
  }


Compiler Fehler:

'WindowPointer' - Funktion nicht definiert MainPanel.mqh 233 27

'm_overview_title_label' - Parameterumwandlung nicht erlaubt MainPanel.mqh 235 43

m_overview_title_label' - Variable des gleichen Typs erwartet MainPanel.mqh 235 43

 
Martin Fischer Funktion wie WindowPointer().
Ich kann diese Objekte erstellen, aber ich kann sie nicht an das Fenster anhängen.

Die
funktioniert in diesem Fall nicht...

2.)
Ist die CComboBox ein statisches Objekt. Ist es möglich, die Liste der Elemente in der

ComboBox-Listview nach der Erstellung der ComboBox zu ändern?

Vielen Dank!

Ich hatte das gleiche Problem, ich habe es gelöst, indem ich eine Include-Datei erstellt habe und meine Label-Klasse geschrieben und diese verwendet habe. Sie müssen diese Datei in Include\EasyAndFastGUI\Controls\MyLabel.mqh erstellen.

Dieser Code ist:

//+------------------------------------------------------------------+
//|MyLabel.mqh |
//|Urheberrecht 2023, Sassiz.Wurzel |
//|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"
//+------------------------------------------------------------------+
//| Klasse zur Erstellung eines Kontrollkästchens|
//+------------------------------------------------------------------+
class MyLabel : public CElement
  {
private:
   //--- Zeiger auf das Formular, an das das Element angehängt ist
   CWindow          *m_wnd;
   //--- Objekte zur Erstellung eines Kontrollkästchens

   CLabel            m_label;

   //--- Text des Ankreuzfeldes
   string            m_label_text;
   //--- Ränder der Textetiketten
   int               m_label_x_gap;
   int               m_label_y_gap;
   //--- Farben der Textbeschriftung in verschiedenen Zuständen
   color             m_label_color;
   color             m_label_color_off;
   color             m_label_color_hover;
   color             m_label_color_locked;
   color             m_label_color_array[];
   //--- Prioritäten beim Drücken der linken Maustaste
   int               m_zorder;
   int               m_area_zorder;

   //---
public:
                     MyLabel(void);
                    ~MyLabel(void);
   //--- Methoden zur Erstellung eines Kontrollkästchens
   bool              CreateLabel(const long chart_id,const int subwin,const string text,const int x,const int y);
   //---
private:
   bool              CreateLabel2(void);
   //---
public:
   //--- (1) Speichert den Formularzeiger, (2) gibt den Zustand des Kontrollkästchens zurück/setzt ihn
   void              WindowPointer(CWindow &object)                 { m_wnd=::GetPointer(object);            }

   //--- (1) Hintergrundfarbe, (2) Ränder für die Textbeschriftung

   void              LabelXGap(const int x_gap)                     { m_label_x_gap=x_gap;                   }
   void              LabelYGap(const int y_gap)                     { m_label_y_gap=y_gap;                   }
   //--- Farbe des Textes in verschiedenen Zuständen
   void              LabelColor(const color clr)                    { m_label_color=clr;                     }

   //--- (1) Beschreibung des Kontrollkästchens, (2) Rückgabe/Setzen des Zustands der Schaltfläche des Kontrollkästchens
   string            LabelText(void)                          const { return(m_label.Description());         }

   //--- Ändern der Farbe
   void              ChangeObjectsColor(void);
   //---
public:
   //--- Diagramm-Ereignishandler
   virtual void      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   //--- Zeitschaltuhr
   virtual void      OnEventTimer(void);
   //--- Verschieben des Elements
   virtual void      Moving(const int x,const int y);
   //--- (1) Anzeigen, (2) Ausblenden, (3) Zurücksetzen, (4) Löschen
   virtual void      Show(void);
   virtual void      Hide(void);
   virtual void      Reset(void);
   virtual void      Delete(void);
   //--- (1) Setzen, (2) Zurücksetzen der Prioritäten beim Drücken der linken Maustaste
   virtual void      SetZorders(void);
   virtual void      ResetZorders(void);
   //--- Zurücksetzen der Farbe
   virtual void      ResetColors(void);
   virtual void      SetText(string text);
   virtual void      SetFontSize(int fontSize);
   //---
private:
   //--- Handhabung des Drucks auf das Element
   bool              OnClickLabel(const string clicked_object);
  };
//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
MyLabel::MyLabel(void) :      
                             m_label_x_gap(20),
                             m_label_y_gap(2),
                             m_label_color(clrBlack)
                             
  {
//--- Speichern des Namens der Elementklasse in der Basisklasse
   CElement::ClassName(CLASS_NAME);
//--- Prioritäten für den Klick mit der linken Maustaste festlegen
   m_zorder      =0;
   m_area_zorder =1;
  }
//+------------------------------------------------------------------+
//| Destruktor|
//+------------------------------------------------------------------+
MyLabel::~MyLabel(void)
  {
  }
//+------------------------------------------------------------------+
//| Ereignisbehandlung|
//+------------------------------------------------------------------+
void MyLabel::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Behandlung des Ereignisses der Cursorbewegung
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      //--- Verlassen, wenn das Element ausgeblendet ist
      if(!CElement::IsVisible())
         return;
      //--- Verlassen, wenn die Nummern der Unterfenster nicht übereinstimmen
      if(CElement::m_subwin!=CElement::m_mouse.SubWindowNumber())
         return;
      //--- Überprüfung des Fokus über Element
      CElement::MouseFocus(m_mouse.X()>X() && m_mouse.X()<X2() && m_mouse.Y()>Y() && m_mouse.Y()<Y2());
      return;
     }
//--- Behandlung des Klicks mit der linken Maustaste auf das Objekt
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      //--- Drücken Sie auf das Kontrollkästchen
      if(OnClickLabel(sparam))
         return;
     }
  }
//+------------------------------------------------------------------+
//| Timer|
//+------------------------------------------------------------------+
void MyLabel::OnEventTimer(void)
  {
//--- Wenn das Formular nicht gesperrt ist
   if(!m_wnd.IsLocked())
      //--- Ändern der Farbe der Elementobjekte
      ChangeObjectsColor();
  }
//+------------------------------------------------------------------+
//| Erstellt eine Gruppe von Checkbox-Objekten|
//+------------------------------------------------------------------+
bool MyLabel::CreateLabel(const long chart_id,const int subwin,const string text,const int x,const int y)
  {
//--- Verlassen, wenn kein Formularzeiger vorhanden ist
   if(!CElement::CheckWindowPointer(::CheckPointer(m_wnd)))
      return(false);
//--- Initialisierung von Variablen
   m_id         =m_wnd.LastId()+1;
   m_chart_id   =chart_id;
   m_subwin     =subwin;
   m_x          =x;
   m_y          =y;
   m_label_text =text;
//--- Ränder vom Rand
   CElement::XGap(CElement::X()-m_wnd.X());
   CElement::YGap(CElement::Y()-m_wnd.Y());
//--- Erstellen eines Elements

   if(!CreateLabel2())
      return(false);
//--- Das Element ausblenden, wenn das Fenster ein Dialogfenster ist oder minimiert wurde
   if(m_wnd.WindowType()==W_DIALOG || m_wnd.IsMinimized())
      Hide();
//---
   return(true);
  }


//+------------------------------------------------------------------+
//| Erzeugt die Beschriftung des Kontrollkästchens|
//+------------------------------------------------------------------+
bool MyLabel::CreateLabel2(void)
  {
//--- Bildung des Objektnamens
   string name=CElement::ProgramName()+"_lable_"+(string)CElement::Id();
//--- Koordinaten
   int x =CElement::X()+m_label_x_gap;
   int y =CElement::Y()+m_label_y_gap;
//--- Textfarbe je nach Zustand
   color label_color=clrBlack;//(m_check_button_state) ? m_label_color : m_label_color_off;
//--- Das Objekt einstellen
   if(!m_label.Create(m_chart_id,name,m_subwin,x,y))
      return(false);
//--- Eigenschaften einstellen
   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");
//--- Ränder vom Rand
   m_label.XGap(x-m_wnd.X());
   m_label.YGap(y-m_wnd.Y());
//--- Initialisierung des Gradienten-Arrays
   CElement::InitColorArray(label_color,m_label_color_hover,m_label_color_array);
//--- Speichern des Objektzeigers
   CElement::AddToArray(m_label);
   return(true);
  }
//+------------------------------------------------------------------+
//| Bewegliche Elemente|
//+------------------------------------------------------------------+
void MyLabel::Moving(const int x,const int y)
  {
//--- Verlassen, wenn das Element ausgeblendet ist
   if(!CElement::IsVisible())
      return;
//--- Speichern von Einzügen in den Elementfeldern
   CElement::X(x+XGap());
   CElement::Y(y+YGap());
//--- Speicherung von Koordinaten in den Feldern der Objekte
   m_label.X(x+m_label.XGap());
   m_label.Y(y+m_label.YGap());
//--- Aktualisierung der Koordinaten von grafischen Objekten
   m_label.X_Distance(m_label.X());
   m_label.Y_Distance(m_label.Y());
  }
//+------------------------------------------------------------------+
//| Ändern der Objektfarbe, wenn der Mauszeiger darüber schwebt.
//+------------------------------------------------------------------+
void MyLabel::ChangeObjectsColor(void)
  {
//--- Verlassen, wenn das Element blockiert ist

//---
   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);
  }
//+------------------------------------------------------------------+
//| Zeigt Combobox|
//+------------------------------------------------------------------+
void MyLabel::Show(void)
  {
//--- Verlassen, wenn das Element bereits sichtbar ist
   if(CElement::IsVisible())
      return;
//--- Alle Objekte sichtbar machen
   for(int i=0; i<CElement::ObjectsElementTotal(); i++)
      CElement::Object(i).Timeframes(OBJ_ALL_PERIODS);
//--- Zustand der Sichtbarkeit
   CElement::IsVisible(true);
  }
//+------------------------------------------------------------------+
//| Ausblenden der Combobox|
//+------------------------------------------------------------------+
void MyLabel::Hide(void)
  {
//--- Verlassen, wenn das Element bereits sichtbar ist
   if(!CElement::IsVisible())
      return;
//--- Alle Objekte ausblenden
   for(int i=0; i<CElement::ObjectsElementTotal(); i++)
      CElement::Object(i).Timeframes(OBJ_NO_PERIODS);
//--- Zustand der Sichtbarkeit
   CElement::IsVisible(false);
  }
//+------------------------------------------------------------------+
//| Neuzeichnen|
//+------------------------------------------------------------------+
void MyLabel::Reset(void)
  {
//--- Lassen, wenn dies ein Dropdown-Element ist
   if(CElement::IsDropdown())
      return;
//--- Ausblenden und Einblenden
   Hide();
   Show();
  }
//+------------------------------------------------------------------+
//| Löschung|
//+------------------------------------------------------------------+
void MyLabel::Delete(void)
  {
//--- Entfernen von Objekten
   m_label.Delete();
//--- Leeren des Arrays der Objekte
   CElement::FreeObjectsArray();
//--- Initialisierung von Variablen mit Standardwerten
   CElement::MouseFocus(false);
   CElement::IsVisible(true);
  }
//+------------------------------------------------------------------+
//| Seth die Prioritäten|
//+------------------------------------------------------------------+
void MyLabel::SetZorders(void)
  {
   m_label.Z_Order(m_zorder);
  }
//+------------------------------------------------------------------+
//| Die Prioritäten zurücksetzen|
//+------------------------------------------------------------------+
void MyLabel::ResetZorders(void)
  {
   m_label.Z_Order(0);
  }
//+------------------------------------------------------------------+
//| Farbe der Elementobjekte zurücksetzen|
//+------------------------------------------------------------------+
void MyLabel::ResetColors(void)
  {

//--- Zurücksetzen der Farbe
   m_label.Color(clrBlack);
//--- Den Fokus auf Null setzen
   CElement::MouseFocus(false);
  }

//+------------------------------------------------------------------+
//| Klick auf den Elementkopf|
//+------------------------------------------------------------------+
bool MyLabel::OnClickLabel(const string clicked_object)
  {

//--- Der Mauszeiger befindet sich derzeit über dem Element
   m_label.Color(m_label_color_hover);
//--- Senden Sie eine Nachricht darüber
   ::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);
}

Dann erstellen Sie ein Objekt aus der MyLabel-Klasse wie folgt und verwenden Sie es:

   //---Etikett
   MyLabel           m_overview_title_label;

Then:

//+------------------------------------------------------------------+
//| Erstellt OverviewTitleLabel|
//+------------------------------------------------------------------+
bool CMainPanel::CreateOverviewTitleLabel(const string text)
  {

//--- Übergabe des Panel-Objekts
   m_overview_title_label.WindowPointer(m_window);
//--- An die vierte Registerkarte der ersten Gruppe von Registerkarten anhängen
   m_main_panel_tabs.AddToElementsArray(0,m_overview_title_label);  
//--- Koordinaten
   int x=m_window.X()+OVERVIE_TITLE_LABEL_GAP_X;
   int y=m_window.Y()+OVERVIE_TITLE_LABEL_GAP_Y;
//--- Eigenschaften vor der Erstellung festlegen
   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.
//--- Kontrolle erstellen
   if(!m_overview_title_label.CreateLabel(m_chart_id,m_subwin,text,x,y))
      return(false);
//--- Hinzufügen des Objekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0,m_overview_title_label);
   return(true);
  }
 
Wenn wir die Anzahl der Registerkarten erhöhen, sei es vertikal oder horizontal, gibt es keine Möglichkeit zum Scrollen, was dazu führt, dass sich das Fenster über seine Grenzen hinaus ausdehnt und seine Effizienz verringert.