Diskussion zum Artikel "Grafische Interfaces X: Erweitertes Management von Listen und Tabellen Code Optimierung (build 7)" - Seite 9

 

Nun, Tol, danke für den Hinweis:

//--- Spalten
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- Ermitteln der aktuellen Position des Schiebereglers für die vertikale Bildlaufleiste
      v=m_scrollv.CurrentPos()+t;
      //--- Zeilen
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- Daten der Offset-Tabelle
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- Anpassung für die hervorgehobene Zeile
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
            //--- Anpassen von (1) Werten, (2) Hintergrundfarbe, (3) Textfarbe und (4) Textausrichtung in Zellen
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }
Es funktioniert also alles wie es soll ;)
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

EasyAndFastGUI-Bibliothek

Viktor Glovluk, 2017.01.26 10:42 AM.

Liebe Forumsmitglieder, bitte helfen Sie mir!

Auf der Grundlage dieser Bibliothek von Anatoli Kazharski , versucht, eine Eule zu schweißen und wollte einen Datensatz in der Datei Zustände der Checkboxen und Werte der Eingabefelder zu organisieren! Aber um nicht jedes Mal ALLE Werte aufzuzeichnen, kann ich nicht verstehen, wie man das Element, das angeklickt wurde, zu bestimmen! In der Benutzeranwendung gibt es einen Event-Handler, und der Parameter lparam ist nur für den Index des Elements zuständig, aber wie man das Element durch diesen Index findet, der dann mit ihm arbeiten würde, kann ich nicht verstehen!

Vielen Dank im Voraus!


 

Viktor Glovluk, 2017.01.26 10:42

Liebe Forumsmitglieder, bitte helfen Sie mir!

Auf der Grundlage dieser Bibliothek von Anatoli Kazharski , versuche ich, eine Eule zu schweißen und wollte einen Datensatz in der Datei Zustände der Kontrollkästchen und Werte der Eingabefelder zu organisieren! Aber um nicht jedes Mal ALLE Werte aufzuzeichnen, kann ich nicht verstehen, wie man das Element bestimmt, das angeklickt wurde! In der Benutzeranwendung gibt es einen Event-Handler, und der Parameter lparam ist nur für den Index des Elements zuständig, aber wie man das Element durch diesen Index findet, der dann mit ihm arbeiten würde, kann ich nicht verstehen!

Vielen Dank im Voraus!

Das Anklicken der Checkboxen kann durch das Ereignis mit der Kennung ON_CLICK_LABEL verfolgt werden.

In lparam kommt der Wert des Elementbezeichners.

Beispiel:

//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Klick-Ereignis auf die Textbeschriftung
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      //--- Wenn Sie das erste Kästchen angeklickt haben
      if(lparam==m_checkbox1.Id())
        {
         //---
        }
     }
  }
 

Ist das wirklich die einzige Möglichkeit?

//--- Wenn Sie auf das erste Kontrollkästchen geklickt haben

if(lparam==m_checkbox1.Id())

Wurde bereits beantwortet, nachdem ich diesen Beitrag verlassen habe! Vielen Dank dafür! Und ich muss durch alle Kontrollkästchen und Eingabefelder gehen? Und als Beispiel, wenn es einen "Haufen" von ihnen gibt? Kein Array, das alle Indizes der Elemente speichert? Dann durch diesen Index, um die notwendigen Werte zu erhalten (z.B. angeklickte oder nicht angeklickte Checkbox, Wert im Eingabefeld)!
 
Viktor Glovluk:

Ist das der einzige Weg?

Wie wollen Sie es haben? Klären.
 
Viktor Glovluk:

...

Was ist ein Beispiel, wenn es einen "Haufen" von ihnen gibt? Es gibt kein Array, das alle Indizes der Elemente speichert? Dann durch diesen Index, um die notwendigen Werte zu erhalten (z.B. angeklickte oder nicht angeklickte Checkbox, Wert im Eingabefeld)!

Schauen Sie sich den Inhalt der Klasse CWndContainer an. Sie sind dort alle in der WindowElements-Struktur gespeichert. Auf sie kann von der Benutzerklasse aus zugegriffen werden.

   //--- Struktur von Arrays von Elementen
   struct WindowElements
     {
      //--- Gesamte Anordnung aller Objekte
      CChartObject     *m_objects[];
      //--- Gesamte Anordnung aller Elemente
      CElementBase     *m_elements[];

      //--- Persönliche Arrays von Elementen:
      // Array von Kontextmenüs
      CContextMenu     *m_context_menus[];
      //--- Array der Hauptmenüs
      CMenuBar         *m_menu_bars[];
      //--- Tooltips
      CTooltip         *m_tooltips[];
      //--- Array von Dropdown-Listen verschiedener Typen
      CElementBase     *m_drop_lists[];
      //--- Array von Bildlaufleisten
      CElementBase     *m_scrolls[];
      //--- Array von Tabellen mit Textbeschriftungen
      CElementBase     *m_labels_tables[];
      //--- Array von Tabellen aus Eingabefeldern
      CElementBase     *m_tables[];
      //--- Array mit gezeichneten Tabellen
      CElementBase     *m_canvas_tables[];
      //--- Array von Registerkarten
      CTabs            *m_tabs[];
      //--- Array von Registerkarten mit Bildern
      CIconTabs        *m_icon_tabs[];
      //--- Array von Kalendern
      CCalendar        *m_calendars[];
      //--- Array von Dropdown-Kalendern
      CDropCalendar    *m_drop_calendars[];
      //--- Baumlisten
      CTreeView        *m_treeview_lists[];
      //--- Datei-Navigatoren
      CFileNavigator   *m_file_navigators[];
      //--- Standardgrafiken (Grafikobjekte)
      CStandardChart   *m_sub_charts[];
      //--- Bilderschieber
      CPicturesSlider  *m_pictures_slider[];
      //--- Zeit
      CTimeEdit        *m_time_edits[];
      //--- Mehrzeilige Felder
      CTextBox         *m_text_boxes[];
     };
   //--- Array von Element-Arrays für jedes Fenster
   WindowElements    m_wnd[];
 

Je weiter weg, desto besser! :)

Wieder bin ich auf Event-Handler-Implementierungen gestoßen, die ich nicht verstehe! Wenn man eine benutzerdefinierte Anwendung erstellt, soll man die GUI durch eine Klasse verbinden:

//--- Anschluss der Klasse "Trade Panel
#include "Menu.mqh"
CProgram program;

Aber wie fängt man dann das Drücken von Knöpfen ab, wie bekommt man den Status von Checkboxen und die Werte von Eingabefeldern, wenn sie in der privaten Zone der CProgram-Klasse liegen? Sollte ich das, was ich brauche, in den öffentlichen Bereich verschieben, oder habe ich etwas falsch verstanden?

 
Viktor Glovluk:

...

aber wie fängt man dann Tastendrücke ab, wie erhält man die Zustände der Kontrollkästchen und Werte von Eingabefeldern, ...

Im CProgram-Handler.

//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Klick-Ereignis auf die Textbeschriftung
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

Alle Artikel haben MQL-Anwendungsbeispiele, die zeigen, wie man Ereignisse von Steuerelementen behandelt.

 
Anatoli Kazharski:

Im CProgram-Handler.

//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Klick-Ereignis auf die Textbeschriftung
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

Alle Artikel haben MQL-Anwendungsbeispieldateien, die zeigen, wie man Steuerereignisse behandelt.

Im CProgram Handler ist es klar, aber dieser Handler ist für die Schnittstelle, richtig? Man sollte keine Handelslösungen in ihn hineinschieben! Ich verstehe sehr wenig von OOP, mein ganzes Wissen stammt aus Ihren Artikeln, ich kann also dumm sein! :)

Wie kann ich zum Beispiel im Expert Advisor die Eröffnung einer Order implementieren, deren Lotness im Eingabefeld festgelegt ist? Ich muss den Wert dieses Feldes im EA selbst erhalten!

 
Viktor Glovluk:

Im CProgram Handler ist es klar, aber dieser Handler ist für die Schnittstelle, richtig? Sie sollten keine Handelslösungen in ihn hineinschieben!

Warum eigentlich nicht? Doch, Sie können. Es ist eine Klasse Ihrer MQL-Anwendung (Indikator oder Expert Advisor). Alles ist dasselbe.

Sie können den Wert aus dem Eingabefeld wie folgt abrufen:

m_spin_edit1.GetValue()