Diskussion zum Artikel "DoEasy. Steuerung (Teil 31): Scrollen des Inhalts des ScrollBar-Steuerelements"

 

Neuer Artikel DoEasy. Steuerung (Teil 31): Scrollen des Inhalts des ScrollBar-Steuerelements :

In diesem Artikel werde ich die Funktionsweise des Scrollens des Inhalts des Containers mithilfe der Schaltflächen der horizontalen Bildlaufleiste implementieren.

Kompilieren Sie den EA und starten Sie ihn auf einem Chart:


Wie Sie sehen können, funktioniert der Bildlauf mit den Pfeiltasten gut. Wenn wir versuchen, den Schieberegler mit der Maus zu bewegen, „widersteht“ er, was natürlich ist - wir haben noch keine Verarbeitung der Schiebereglerverschiebung, aber wir haben bereits eine Neuberechnung seiner Größe und Koordinaten. Wenn wir also versuchen, den Schieberegler mit der Maus zu verschieben, wird er durch die Methode zum Festlegen seiner Koordinaten an die Position zurückgebracht, die der Position des Containerinhalts in seinem sichtbaren Bereich entspricht. Dieses Verhalten wird in den folgenden Artikeln näher erläutert.

Autor: Artyom Trishkin

 

Für solche Arbeiten wird ein Denkmal errichtet werden wahrscheinlich auf mql5, Nachkommen))) Was ist eine Datei defines.mqh wert, in 4k Zeilen. Wenn man sich den Unterschied zwischen 70 Teilen und 131 Teilen ansieht, ist es erstaunlich, wie viel Arbeit darin steckt )))

Ich fand einen kleinen Fehler, in der Datei trading.mqh, SetPrices, hat die Sichtbarkeit privat, nicht geschützt, die Nachkommen können die Funktion nicht verwenden. Von der Datei TradingControl.mqh, CreatePReqClose(), gibt es Fehler der Verwendung.


 private:
  template <typename PR,typename SL,typename TP,typename PL> 
   bool                 SetPrices(const ENUM_ORDER_TYPE action,const PR price,const SL sl,const TP tp,const PL limit,const string source_method,CSymbol *symbol_obj);
 
BillionerClub #:

Für solche Arbeiten wird ein Denkmal errichtet werden wahrscheinlich auf mql5, Nachkommen))) Was ist eine Datei defines.mqh wert, in 4k Zeilen. Wenn man sich den Unterschied zwischen 70 Teilen und 131 Teilen anschaut , ist es erstaunlich, wie viel Arbeit es ist )))

Ich fand einen kleinen Fehler, in der Datei trading.mqh, SetPrices, hat die Sichtbarkeit privat, nicht geschützt, die Nachkommen können die Funktion nicht verwenden. Von der Datei TradingControl.mqh, CreatePReqClose(), gibt es Fehler der Verwendung.


Ja. Dieser Fehler war mein Versehen und der Fehler des alten Compilers, der ihn übersehen hat. In den neuesten Versionen des Compilers wurde der Fehler erkannt und ich habe ihn behoben. In den neueren Versionen der Bibliothek befinden sich die Methoden im geschützten Bereich, nicht im privaten Bereich

 

COrder vs. CChart

Warum ein Formular in der Klasse COrder erstellen?

 
BillionerClub #:

Warum ein Formular in der Klasse COrder erstellen?

Es kann in jeder Klasse der Bibliothek erstellt werden. Es ermöglicht Ihnen, Ihr eigenes Bildmaterial für jedes Objekt zu erstellen
 

Wäre es nicht besser, eine Struktur zu erstellen und Strings in ein CharArray-Array zu verwandeln?

   ulong             m_ticket;                                    // Ticket des ausgewählten Auftrags/Geschäfts (MQL5)
   long              m_long_prop[ORDER_PROP_INTEGER_TOTAL];       // Ganzzahlige Eigenschaften
   double            m_double_prop[ORDER_PROP_DOUBLE_TOTAL];      // Wesentliche Eigenschaften
   string            m_string_prop[ORDER_PROP_STRING_TOTAL];      // String-Eigenschaften
 
//--- Erzeugt ein neues Diagrammobjekt und gibt einen Zeiger auf das Diagrammkontrollobjekt zurück
   CChartObjectsControl *CreateNewStdGraphObjectAndGetCtrlObj(const long chart_id,
                                                              const string name,
                                                              int subwindow,
                                                              const ENUM_OBJECT type_object,
                                                              const datetime time1,
                                                              const double price1,
                                                              const datetime time2=0,
                                                              const double price2=0,
                                                              const datetime time3=0,
                                                              const double price3=0,
                                                              const datetime time4=0,
                                                              const double price4=0,
                                                              const datetime time5=0,
                                                              const double price5=0)
                       {
                        //--- Wenn das Objekt mit der Diagramm-ID und dem Namen bereits in der Sammlung vorhanden ist - melden Sie es und geben Sie NULL zurück
                        if(this.IsPresentGraphObjInList(chart_id,name))
                          {
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_GR_OBJ_ALREADY_EXISTS)," ChartID ",(string)chart_id,", ",name);
                           return NULL;
                          }
                        //--- Wenn ein neues grafisches Standardobjekt nicht erstellt werden konnte - dies melden und NULL zurückgeben
                        if(!CreateNewStdGraphObject(chart_id,name,type_object,subwindow,time1,price1,time2,price2,time3,price3,time4,price4,time5,price5))
                          {
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_STD_OBJ_ERR_FAILED_CREATE_STD_GRAPH_OBJ),StdGraphObjectTypeDescription(type_object));
                           CMessage::ToLog(::GetLastError(),true);
                           return NULL;
                          }
                        //--- Wenn das Zeitplan-Kontrollobjekt nicht erhalten werden konnte - melden Sie es
                        CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
                        if(ctrl==NULL)
                           ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_FAILED_GET_CTRL_OBJ),(string)chart_id);
                        //--- Rückgabe eines Zeigers auf das Zeitplan-Kontrollobjekt oder NULL, falls ein Fehler beim Empfang des Objekts auftritt
                        return ctrl;
                       }

Ich habe versucht, ein einfaches Objekt (Textbeschriftung) zu erstellen, aber es ist mir nicht gelungen.

Wie sollte das erstellte Objekt nach CreateNewStdGraphObject() in m_list_charts_control gelangen, um beim nächsten Aufruf ein Objekt ungleich Null zu erhalten?

CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
 
Oder was ist in m_list_charts_control? Ich habe dort 0 Elemente.
 
//--- Erzeugt ein grafisches Objekt "Text Label".
   bool              CreateTextLabel(const long chart_id,const string name,const int subwindow,const bool extended,
                                     const int x,const int y,
                                     const string text,const int size,const ENUM_BASE_CORNER corner,
                                     const ENUM_ANCHOR_POINT anchor_point,const double angle)
                       {
                        string nm=this.m_name_program+"_"+name;
                        ENUM_OBJECT type_object=OBJ_LABEL;
                        CChartObjectsControl *ctrl=this.CreateNewStdGraphObjectAndGetCtrlObj(chart_id,nm,subwindow,type_object,0,0);
                        if(ctrl==NULL)
                           return false; 

Gibt false zurück, bevor die Eigenschaftseinstellung erreicht wird.

 
Ich habe es durch Hinzufügen von RefreshByChartID(chart_id) nach dem Erstellen...
 
//+------------------------------------------------------------------+
//| Gibt das Balkenobjekt nach Zeit in der Zeitreihe zurück |
//+------------------------------------------------------------------+
CBar *CSeriesDE::GetBar(const datetime time)
  {
   CBar *obj=new CBar(); 
   if(obj==NULL)
      return NULL;
   obj.SetSymbolPeriod(this.m_symbol,this.m_timeframe,time);
   this.m_list_series.Sort(SORT_BY_BAR_TIME);
   int index=this.m_list_series.Search(obj);
   delete obj;
   return this.m_list_series.At(index);
  }

Hier wird die Zeitreihe für mich nicht sortiert.... Die Methode Sort() in CArray sollte separat in einer geerbten Klasse implementiert werden, um Objekte zu sortieren, oder?