Diskussion zum Artikel "Graphische Interfaces VI: Das Checkbox Control, Das Edit Control und deren gemischte Typen (Kapitel 1)"

 

Neuer Artikel Graphische Interfaces VI: Das Checkbox Control, Das Edit Control und deren gemischte Typen (Kapitel 1) :

Dieser Artikel ist der Anfang des 6. Teils dieser Serie, welche der Entwicklung einer Bibliothek für die Erzeugung von grafischen Interfaces im Metatrader-Terminal gewidmet ist. In dem ersten Kapitel werden wir das Checkbox-Control, dass Edit-Control und deren gemischte Typen besprechen.

Das Checkbox-Control

Die Checkbox wird für die Verwaltung und Steuerung von Parameter entworfen, die nur zwei Zustände annehmen können. Hierfür wird ein Button mit zwei Icons verwendet, damit der aktuelle Status des Parameters, mit welchem dieses Control verbunden wurde, angezeigt werde kann. Das Icon mit dem Check-Symbol bedeutet, dass der Parameter aktiviert ist (an). Das Icon ohne dem Check-Symbol bedeutet, dass der Parameter deaktiviert ist (aus) Neben dem Button befindet sich eine kurze Beschriftung. 

Dieses Element wird aus drei grafischen Objekten zusammengesetzt. :Diese sind:

  1. Hintergrund
  2. Icon (Button)
  3. Text Label

Abbildung  1. Die zusammengesetzten Teile des Checkbox-Controls

Abbildung 1. Die zusammengesetzten Teile des Checkbox-Controls

Autor: Anatoli Kazharski

 

Aber "Zwinkern" beim Erreichen von Extremwerten funktioniert nicht in Indikatoren - Sleep()...

Anatoly, schreiben Sie einen weiteren Verbesserungswunsch auf: Verzögerung sollte über Timer organisiert werden, zumal Sie bereits fast alles dafür haben.

 
Artyom Trishkin:

Aber das "Zwinkern" beim Erreichen extremer Werte funktioniert nicht in Indikatoren - Sleep() ...

Anatoly, schreiben Sie noch einen Verbesserungswunsch auf: Die Verzögerung sollte über einen Timer organisiert werden, zumal Sie schon fast alles dafür haben.

Ich habe es aufgeschrieben. Die Liste wird immer länger. Vielen Dank dafür. )
 
Beeindruckend.... :)
 

Anatoly, die von Ihnen erstellte Bibliothek ist in einem hohen Grad der Bereitschaft, und ich habe beschlossen, zu versuchen, ein kleines Projekt für mich mit ihm zu schaffen. Ich schreibe in diesem Thema, damit es klar ist, auf welches Element sich die Frage bezieht. Für das Eingabefeld (SpinEdit) ist es notwendig, Werte mit einer Genauigkeit von zwei Zehnteln einzugeben. Ich habe die entsprechenden Eigenschaften (StepValue und StepDigits) in der Prozedur der Felderstellung gesetzt (siehe den Code unten):

...
   m_spin_edit_Depo.MaxValue(10000000);
   m_spin_edit_Depo.MinValue(0);
   m_spin_edit_Depo.StepValue(0,01);
   m_spin_edit_Depo.SetDigits(2);
   m_spin_edit_Depo.SetValue(v);
...

Und nach der Kompilierung bekam ich einen Fehler: 'StepValue' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden.

Wenn die Anzahl der Zeichen für einen Wert kleiner als 1 ist, dann kann logischerweise auch die Schrittweite kleiner als 1 sein. Gleichzeitig erfolgt im Code der Klasse die Prüfung des eingegebenen Wertes nur auf Nicht-Negativität.

...

   //--- Шаг значения

   double            StepValue(void)                          const { return(m_step_value);               }
   void              StepValue(const double value)                  { m_step_value=(value<=0)? 1 : value; }
...

Die Frage ist, dass es mir nicht klar ist, woher der Fehler kommt.

Dann habe ich eine Frage oder einen Wunsch. Was wäre, wenn wir den Minimal-/Maximalwert nicht kontrollieren müssen und er nur durch die Größe der Variablen vom Typ double begrenzt ist, die zum Speichern verwendet wird? So wie ich den Code verstanden habe, ist die Festlegung der Mindest-/Maximalwerte obligatorisch. Ist es möglich, meinen Wunsch in die Liste der Verbesserungen aufzunehmen? D.h. Wenn die Mindest-/Maximalwerte für ein Feld nicht angegeben werden, wird die Kontrolle der eingegebenen Werte nur bei ihrem Eintritt in den Bereich der Variablen vom Typ double durchgeführt.

 
Pavel Trofimov:

Und nach der Kompilierung erhielt ich folgenden Fehler: 'StepValue' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden.

...

Die Frage ist, dass es mir nicht klar ist, woher der Fehler kommt.

Sie haben einen Tippfehler. Verwenden Sie einen Punkt "." als Trennzeichen. :

   m_spin_edit_Depo.StepValue(0. 01);

//---

Als nächstes habe ich eine Frage oder einen Wunsch. Was ist, wenn ich den minimalen/maximalen Wert nicht kontrollieren muss und er nur durch die Größe der Variablen vom Typ doublebegrenzt ist, die für seine Speicherung verwendet wird ? So wie ich den Code verstanden habe, ist die Einstellung der Mindest-/Maximalwerte obligatorisch. Ist es möglich, meinen Wunsch in die Liste der Verbesserungen aufzunehmen? D.h. Wenn die Mindest-/Maximalwerte für ein Feld nicht angegeben werden, erfolgt die Kontrolle der eingegebenen Werte nur bei ihrem Eintritt in den Bereich der Variablen vom Typ double.

Sie können das Maximum und Minimum jetzt zwangsweise festlegen. Zum Beispiel so:

   m_spin_edit_Depo.MaxValue(DBL_MAX);
   m_spin_edit_Depo.MinValue(-DBL_MAX);
 
Anatoli Kazharski:

Sie haben einen Tippfehler. Verwenden Sie einen Punkt "." als Trennzeichen. :

//---

Sie können das Maximum und das Minimum vorerst erzwingen. So, das war's:

Vielen Dank für den Hinweis auf den Tippfehler. In meinem Code sind meine Augen "seifig". Und was das erzwungene Setzen von Maximum und Minimum angeht - das ist in Ordnung. Ich werde es für mich aufschreiben. Nochmals herzlichen Dank!
[Gelöscht]  

Hallo Sir, ich interessiere mich für Ihren Artikel, aber ich bin noch ein Neuling in Sachen GUI und mql,
können Sie mir bitte sagen, wie man den Wert von Spin edit erhält, damit er in den EA eingelesen werden kann.

Mit freundlichen Grüßen

 
Hidayat Nur Wahit:

Hallo Sir ich bin interessant auf Ihren Artikel, aber ich noch Neuling über GUI und mql,
können Sie bitte sagen Sie mir, wie man Wert von Spin bearbeiten, so dass es an die EA gelesen werden kann.

Mit freundlichen Grüßen

Zum Beispiel, aus einem Artikel in CProgram::OnEvent() Event-Handler:

void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Событие нажатия на текстовой метке
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      //--- Если нажали на первом чекбоксе
      if(lparam==m_checkbox1.Id())
        {
         m_checkbox2.CheckBoxState(m_checkbox1.CheckButtonState());
         m_spin_edit1.SpinEditState(m_checkbox1.CheckButtonState());
         
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }

      if(lparam==m_checkbox3.Id())
        {
         m_checkboxedit1.CheckBoxEditState(m_checkbox3.CheckButtonState());
         
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }

      if(lparam==m_checkbox4.Id())
        {
         m_checkcombobox1.CheckComboBoxState(m_checkbox4.CheckButtonState());
        }

      if(lparam==m_checkbox5.Id())
        {
         m_slider1.SliderState(m_checkbox5.CheckButtonState());
         m_dual_slider1.SliderState(m_checkbox5.CheckButtonState());
         
         Print("m_slider1.GetValue(): ",m_slider1.GetValue());
         Print("m_dual_slider1.GetLeftValue(): ",m_dual_slider1.GetLeftValue());
         Print("m_dual_slider1.GetRightValue(): ",m_dual_slider1.GetRightValue());
        }
     }

   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      
      if(lparam==m_spin_edit1.Id())
        {
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
        
      if(lparam==m_checkboxedit1.Id())
        {
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }
      
      if(lparam==m_slider1.Id())
        {
         Print("m_slider1.GetValue(): ",m_slider1.GetValue());
        }
        
      if(lparam==m_dual_slider1.Id())
        {
         Print("m_dual_slider1.GetLeftValue(): ",m_dual_slider1.GetLeftValue());
         Print("m_dual_slider1.GetRightValue(): ",m_dual_slider1.GetRightValue());
        }
     }

   if(id==CHARTEVENT_CUSTOM+ON_CLICK_INC || id==CHARTEVENT_CUSTOM+ON_CLICK_DEC)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      
      if(lparam==m_spin_edit1.Id())
        {
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
        
      if(lparam==m_checkboxedit1.Id())
        {
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }
     }
  }
[Gelöscht]  
Anatoli Kazharski:

Zum Beispiel aus einem Artikel in CProgram::OnEvent() event handler:

Thank's Sir und jetzt es gut den Wert zu lesen, und wird auf meine EA anwenden.

Regard's
 

Lieber Anatoli Kazharski, vielen Dank für diese großartige Bibliothek!

Ich liebe das Look & Feel der resultierenden Schnittstellen.

Als ich anfing, die Test Library 10.mq5 an meine persönlichen Bedürfnisse anzupassen, dachte ich, es wäre erwähnenswert, dass es mir wirklich geholfen hat, die Methode

void CSpinEdit::LabelText(const string new_text)

zur Klasse CSpinEdit hinzuzufügen, die nichts anderes tut, als jeden Aufruf von CLabel::Description(const string new_text) aufzuschieben. Der Grund dafür ist, dass ich ein CSpinEdit für verschiedene Arten von Werten in Abhängigkeit vom Zustand einer CComboBox verwende. Nach dem Ändern der Beschriftung mit LabelText(text) und der Auswahl des entsprechenden Bearbeitungsformats werden die Werte wie gewünscht nach dem Aufruf von

void CSpinEdit::ChangeValue(const double value)

Nochmals vielen Dank und herzliche Grüße