CControlsDialog::CreateCheckGroup1(void)

 

Hallo,


ich probiers mal, weis nicht ob ich mich klar genug ausdrücke,

ich bin ja ein Mensch, dessen Grundkompetenz Faulheit ist. darum versuche ich mir auch das Traden so angenehm wie möglich zu machen.

Da ich meistens über einen VPS mit dem IPad trade, mann muss ja auch arbeiten, habe ich mir immer Buttons erzeugt, jetzt bin ich gerade dabei, mir die Funktionen in ein Panel zu legen

bei den Textfeldern war es ja kein Problem die Werte zu übernehmen,

aber hat einer von euch eine Idee, wie ich die Check Boxen, bzw die Radio Boxen vorbelegen kann? 

was mir bei der Sache nicht klar ist, ich hab das mit allen möglichen Varianten probiert. Eigentlich dachte ich, wenn ich beim Create den Value vorgebe, dann übernimmt er diesen. soweit war diese Idee dann schon wieder am Ende


bool CControlsDialog::CreateCheckGroup1(void)
  {
   int x1=INDENT_LEFT;
   int y1=INDENT_TOP+
          (BUTTON_HEIGHT+CONTROLS_GAP_Y)+
          (BUTTON_HEIGHT+CONTROLS_GAP_Y)+
          (RADIO_HEIGHT+CONTROLS_GAP_Y);

   int x2=x1+(GROUP_WIDTH/3)*2;
   int y2=y1+EDIT_HEIGHT;


//--- create
   if(!m_check_group1.Create(m_chart_id,m_name+"CheckGroup1",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!Add(m_check_group1))
      return(false);
//--- fill out with strings
   m_check_group1.AddItem("Trailing");


   if(use_Trailing_Stop)
     {
      m_check_group1.Value(true);
     }
//--- succeed
   return(true);
  }


ich habs auch mit Enable, IsEnable,... probiert, aber irgendwie komme ich nicht auf einen grünen Zweig.

hat jemand eine Idee? ist jetzt nicht weltbewegend, die Erde dreht sich weiter, aber ich denke, irgendwie muss ich die ja auch vorbelegen können


lg

amando

 

Ich gehe bei so einem Problem immer mit dem Debugger los...

Klick auf ein Check und schau mit dem Debugger welchen Wert er auf true setzt.

Dann kannst du ihn selber in einer "Init" Routine nach dem erzeugen selber setzen.


meist einer der private vars .....m_states ?

private:
   //--- dependent controls
   CCheckBox         m_rows[];              // array of the row objects
   //--- set up
   int               m_offset;              // index of first visible row in array of rows
   int               m_total_view;          // number of visible rows
   int               m_item_height;         // height of visible row
   //--- data
   CArrayString      m_strings;             // array of rows
   CArrayLong        m_values;              // array of values
   CArrayInt         m_states;              // array of states
   long              m_value;               // current value
   int               m_current;             // index of current row in array of rows

Gruß

 
Christian:

Ich gehe bei so einem Problem immer mit dem Debugger los...

Klick auf ein Check und schau mit dem Debugger welchen Wert er auf true setzt.

Dann kannst du ihn selber in einer "Init" Routine nach dem erzeugen selber setzen.


Gruß

das mit der Init Routine hab ich probiert, das ist auch sowas was ich nicht verstehe,

wollte schon die textfelder mit der OnInit auf Werte setzen, aber der kennt die Felder nicht in der Init, drum hab ichs in die Create Funktion geschrieben.

ist quasi das gleiche auf umwegen 

 

Hast du dich wirklich in OOP Konzepte eingelesen ?

Object erzeugen , member füllen ...sagt dir das was ?

 
Christian:

Hast du dich wirklich in OOP Konzepte eingelesen ?

Object erzeugen , member füllen ...sagt dir das was ?

zwischen Eingelesen und Verstanden ist noch ein Unterschied ;-) ich bin dran. Es wird, dauert nur noch etwas. 

bin mal froh, das ich das Konzept aus CTrade und Co verstanden habe.

 

Nun gut :-) ....such mal nach dem member der geändert wird wenn du auf einen check klickst.

 
Christian:

Nun gut :-) ....such mal nach dem member der geändert wird wenn du auf einen check klickst.

danke, probier ich morgen, ich geh mal ins bett ;-)

 

So geht das (Beispiel Controls.mq5/ControlsDialog.mqh)

//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton1(void)
  {
   m_edit.Text(__FUNCTION__);
   m_radio_group.Value(1);          // index beginnt bei 1
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton2(void)
  {
   m_edit.Text(__FUNCTION__);
   m_check_group.Check(0,1);        // index beginnt bei 0
  }

ist am Anfang eine furchtbare Sucherei weil F1 hier nicht funktinoert.

Dokumentation und Beispiele findet man hier https://www.mql5.com/de/docs/standardlibrary/controls

Und die Ereignisbehandlung wird durch Macros für den Einsteiger unkenntlich gemacht:

EVENT_MAP_BEGIN(CControlsDialog)
   ON_EVENT(ON_CLICK,m_button1,OnClickButton1)
   ON_EVENT(ON_CLICK,m_button2,OnClickButton2)
   ON_EVENT(ON_CLICK,m_button3,OnClickButton3)
   ON_EVENT(ON_CHANGE,m_spin_edit,OnChangeSpinEdit)
   ON_EVENT(ON_CHANGE,m_date,OnChangeDate)
   ON_EVENT(ON_CHANGE,m_list_view,OnChangeListView)
   ON_EVENT(ON_CHANGE,m_combo_box,OnChangeComboBox)
   ON_EVENT(ON_CHANGE,m_radio_group,OnChangeRadioGroup)
   ON_EVENT(ON_CHANGE,m_check_group,OnChangeCheckGroup)
EVENT_MAP_END(CAppDialog)

Durch Auflösung der Macros wird das schon verständlicher:

bool CControlsDialog::OnEvent(const int id,const long& lparam,const double& dparam,const string& sparam) 
{
   if(id==(ON_CLICK+CHARTEVENT_CUSTOM) && lparam==m_button1.Id()) { OnClickButton1(); return(true); }
   if(id==(ON_CLICK+CHARTEVENT_CUSTOM) && lparam==m_button2.Id()) { OnClickButton2(); return(true); }
   if(id==(ON_CLICK+CHARTEVENT_CUSTOM) && lparam==m_button3.Id()) { OnClickButton3(); return(true); }

   if(id==(ON_CHANGE+CHARTEVENT_CUSTOM) && lparam==m_spin_edit.Id()) { OnChangeSpinEdit(); return(true); }
   ON_EVENT(ON_CHANGE,m_date,OnChangeDate)                        // und so weiter, den Rest spare ich mir
   ON_EVENT(ON_CHANGE,m_list_view,OnChangeListView)
   ON_EVENT(ON_CHANGE,m_combo_box,OnChangeComboBox)
   ON_EVENT(ON_CHANGE,m_radio_group,OnChangeRadioGroup)
   ON_EVENT(ON_CHANGE,m_check_group,OnChangeCheckGroup)
   return(CAppDialog::OnEvent(id,lparam,dparam,sparam)); 
}

Ich habe ein Tool namens 'Spy' geschrieben, das funktioniert ähnlich wie der Windows-Spy. Lauscht auf alle Events und gibt die mit Print() aus.
Will ich nächstes Jahrin in der Codebase veröffentlichen. Zum Erstellen von Dialogen unverzichtbar.

Bei Interesse bitte PN.

Dokumentation zu MQL5: Standardbibliothek / Panels und Dialoge
Dokumentation zu MQL5: Standardbibliothek / Panels und Dialoge
  • www.mql5.com
Dieser Abschnitt enthält die technischen Details der Arbeit mit Klassen für die Erstellung von Anzeigeplatten und Steuerungsdialoge und die Beschreibungen der relevanten Komponenten der Standardbibliothek MQL5. Durch die Verwendung der Klassen für die Erstellung der Anzeigeplatten und Steuerungsdialoge sparen Sie Zeit bei der Entwicklung von...
 
amando:

danke, probier ich morgen, ich geh mal ins bett ;-)

Ergebnisse ?
 
Christian:
Ergebnisse ?

sorry, war ein wenig stressig um die Weihnachtszeit.

ich bin wieder mal über meine Unkenntnis gestolpert. Man muss ja prinzipell unterscheiden zwischen 

  • CCheckGroup
  • CCheckBox

Ich habe das ganze fälschlicherweise auf die Group aufgebaut, obwohl ich eigentlich nur die Box als Einzelwert verwenden will (seht man im Screenshot im ersten Post.

Die CCheckGroup muss man die Werte ähnlich der CRadioGroup setzen, mit dem Unterschied, das man hier mehrere Werte Gleichzeitig verwenden kann.

Ich habe das ganze jetzt auf de CCheckBox umgeschrieben, und da ist das setzen der Werte ganz einfach.


   int x1=INDENT_LEFT;
   int y1=INDENT_TOP+
          (BUTTON_HEIGHT+CONTROLS_GAP_Y)+
          (BUTTON_HEIGHT+CONTROLS_GAP_Y)+
          (RADIO_HEIGHT+CONTROLS_GAP_Y);

   int x2=x1+(GROUP_WIDTH/3)*2;
   int y2=y1+EDIT_HEIGHT;


   if(!m_check_box1.Create(m_chart_id,m_name+"CheckBox1",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_check_box1.Text("Trailing"))
      return(false);
   if(!Add(m_check_box1))
      return(false);
      
   if(use_Trailing_Stop)  m_check_box1.Checked(true);
   else m_check_box1.Checked(false);
   Comment(__FUNCTION__+" : Checked="+IntegerToString(m_check_box1.Checked()));
//--- succeed 
   return(true);

mit 

m_check_box1.Checked(true)


geht das setzen der Werte gleich in der Create Funktion mit.


btw, kennst Du ein gutes Buch für OPP Einsteiger?


lg

amando

 
amando:

btw, kennst Du ein gutes Buch für OPP Einsteiger?

Nimm einen EA aus der Codebase mit OOP oder, noch einfacher, den MACD Sample.mq5 aus \MQL\Experts\Examples und lass ihn im Debugger (mit historischen Daten) laufen.

Da siehst Du, wann und wie in OOP die Ausführungen der Befehle, Funktionen und Methoden funktionieren.

Gleichzeitig siehst Du, wie OOP aufgebaut wird und das alle mit einem ziemlich gut kommentierten Code!

Sonst such erstmal hier (die Lupe) nach OOP unter den Artikeln - da gibt's viel für Anfänger mit Fokus auf mql5 sonst Google, aber da müsstest Du nach C++ suchen, das wäre noch am nächsten.

Grund der Beschwerde: