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

 
leonerd CArray sollte separat in einer geerbten Klasse implementiert werden, um Objekte zu sortieren, oder?

Nein. Es gibt eine Sort()-Methode in CArrayObj:

//+------------------------------------------------------------------+
Suche nach der Position eines Elements in einem sortierten Array //|
//+------------------------------------------------------------------+
int CArrayObj::Search(const CObject *element) const
  {
   int pos;
//--- prüfen
   if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1)
      return(-1);
//--- Suche
   pos=QuickSearch(element);
   if(m_data[pos].Compare(element,m_sort_mode)==0)
      return(pos);
//--- nicht gefunden
   return(-1);
  }
//+------------------------------------------------------------------+

Compare() Methode innerhalb der Methode, die Sie in geerbten Klassen außer Kraft setzen müssen.

In der Klasse CBar, deren Objekte in der Liste gespeichert sind, in der wir den gewünschten Balken suchen, ist die Methode Compare() bereits überschrieben (wie auch in allen Klassen von Bibliotheksobjekten):

//+------------------------------------------------------------------+
//| Vergleicht CBar-Objekte anhand der angegebenen Eigenschaft miteinander.
//+------------------------------------------------------------------+
int CBar::Compare(const CObject *node,const int mode=0) const
  {
   const CBar *bar_compared=node;
//--- Vergleich der ganzzahligen Eigenschaften von zwei Balken
   if(mode<BAR_PROP_INTEGER_TOTAL)
     {
      long value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_INTEGER)mode);
      long value_current=this.GetProperty((ENUM_BAR_PROP_INTEGER)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
//--- Vergleich der realen Eigenschaften von zwei Stäben
   else if(mode<BAR_PROP_DOUBLE_TOTAL+BAR_PROP_INTEGER_TOTAL)
     {
      double value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_DOUBLE)mode);
      double value_current=this.GetProperty((ENUM_BAR_PROP_DOUBLE)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
//--- Vergleich der Zeichenketteneigenschaften von zwei Balken
   else if(mode<BAR_PROP_DOUBLE_TOTAL+BAR_PROP_INTEGER_TOTAL+BAR_PROP_STRING_TOTAL)
     {
      string value_compared=bar_compared.GetProperty((ENUM_BAR_PROP_STRING)mode);
      string value_current=this.GetProperty((ENUM_BAR_PROP_STRING)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
   return 0;
  }
//+------------------------------------------------------------------+

Die Struktur der Objektsuche in der Bibliothek ist korrekt organisiert.

Woran scheitern Sie? Vielleicht liegt es einfach daran, dass Sie die Bibliothek nicht von Anfang an studiert haben?

 
Artyom Trishkin #:


Was funktioniert nicht? Vielleicht liegt es daran, dass Sie nicht von Anfang an mit der Bibliothek begonnen haben?

Hallo. Ich will mich nicht beschweren, natürlich habe ich nicht alle Ihre Artikel gelesen. Ich bezweifle, dass es welche gab. Aber einfache Dinge funktionieren nicht und es ist nicht einmal beschrieben, wie sie funktionieren sollen.

Hier haben Sie Standard-Grafikelemente. Übrigens gibt es für viele grundlegende Elemente (in diesem Fall Edit) nicht einmal Beispiele.

Also, CreateEditField() funktioniert nicht. Es stürzt in der Methode CreateNewStdGraphObjectAndGetCtrlObj() ab. Hier:

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);
CChartObjectsControl *CGraphElementsCollection::GetChartObjectCtrlObj(const long chart_id)
  {
//--- In einer Schleife durch die Gesamtzahl der Objekte in der Liste
   for(int i=0;i<this.m_list_charts_control.Total();i++)
     {
      //--- Abrufen eines Zeigers auf das nächste Objekt
      CChartObjectsControl *obj=this.m_list_charts_control.At(i);
      //--- Wenn der Zeiger nicht ermittelt werden konnte - zum nächsten gehen
      if(obj==NULL)
         continue;
      //--- Wenn der Identifikator des Objektdiagramms mit dem gesuchten identisch ist - Rückgabe des Zeigers auf das Objekt in der Liste
      if(obj.ChartID()==chart_id)
         return obj;
     }
//--- Das Objekt wurde nicht gefunden - NULL zurückgeben
   return NULL;
  }

Tja, und m_list_charts_control ist leer... dementsprechend wird auch nichts hinzugefügt und die Methode gibt nichts zurück.

Generell gibt es genug Fehler. Ich habe das Gefühl, dass niemand die Bibliothek in der Praxis benutzt. Nehmen Sie ein Werkzeug mit dem einzigen erlaubten Typ der Füllung IOC. Nun, es wird nicht funktionieren. Es ist nicht korrekt definiert. Ich musste eine Menge Methoden bearbeiten.... Sie gehen einfach durch Ihre Handelsmethode. Außerdem korrigiert die Ausgangsmethode in der Initialisierung die Füllung, aber die Handelsmethode nimmt sie nicht auf.

CTrading::OpenPosition() Methode

this.m_request.type_filling=(type_filling>WRONG_VALUE ? type_filling : trade_obj.GetTypeFilling());

Ok, wir haben die richtige Art der Befüllung gefunden, wenn sie nicht explizit in der Order angegeben ist.

Aber dann übergeben wir die ursprüngliche Variable an die nächste Methode. Was ist der Sinn? Oder ich verstehe etwas nicht...

res=trade_obj.OpenPosition(type,this.m_request.volume,this.m_request.sl,this.m_request.tp,magic,comment,deviation,type_filling);
 
leonerd #:

Hallo. Ich will mich nicht beschweren, natürlich habe ich nicht alle Ihre Artikel gelesen. Ich bezweifle, dass es welche gab. Aber einfache Dinge funktionieren nicht und es wird nicht einmal beschrieben, wie sie funktionieren sollten.

Hier haben Sie Standard-Grafikelemente. Übrigens haben Sie für viele grundlegende Elemente (in diesem Fall Edit) nicht einmal Beispiele.

Also, CreateEditField() funktioniert nicht. Es stürzt in der Methode CreateNewStdGraphObjectAndGetCtrlObj() ab. Hier ist es:

Nun, m_list_charts_control ist leer... entsprechend wird nichts hinzugefügt und die Methode gibt nichts zurück.

Generell gibt es genug Fehler. Ich habe das Gefühl, dass niemand die Bibliothek in der Praxis benutzt. Nehmen Sie ein Werkzeug mit dem einzigen erlaubten Typ der Füllung IOC. Nun, es wird nicht funktionieren. Es ist nicht richtig definiert. Ich musste eine Menge Methoden bearbeiten.... Sie gehen einfach durch Ihre Handelsmethode. Und die ursprüngliche Methode in der Initialisierung korrigiert die Füllung, aber die Handelsmethode nimmt sie nicht auf.

CTrading::OpenPosition() Methode

Ok, wir haben die richtige Art der Befüllung gefunden, wenn sie nicht explizit in der Order angegeben ist.

Aber dann übergeben wir die ursprüngliche Variable an die nächste Methode. Was ist der Sinn? Oder ich verstehe etwas nicht...

Hängt diese Diskussion irgendwie mit diesem Artikel zusammen? Nein.
Welcher Artikel ist die Frage?
Behandeln wir sie in seiner Diskussion.
PS: Ich kann mich nicht daran erinnern, dass ich eine Eingabefeldklasse für die Bibliothek erstellt habe. CreateEditField() - woher haben Sie das?
 
Artyom Trishkin #:
Hat diese Diskussion irgendetwas mit diesem speziellen Artikel zu tun? Nein.
Um welchen Artikel geht es in den Fragen?
Behandeln wir sie in dieser Diskussion.
PS: Ich kann mich nicht daran erinnern, dass ich eine Eingabefeldklasse für die Bibliothek erstellt habe. CreateEditField() - woher haben Sie das?

CreateEditField() in Engine.mqh

 
leonerd #:

CreateEditField() in Engine.mqh

Ich kann es mir von meinem Telefon aus nicht ansehen)
Ich werde Ihnen später antworten, wenn ich den Code sehe.
 
leonerd #:
Nun, CreateEditField() funktioniert nicht. Es stürzt in der Methode CreateNewStdGraphObjectAndGetCtrlObj() ab.

Warum mischen Sie sich in private Methoden ein? Sie werden nur benötigt, damit die Bibliothek funktioniert.

Der Benutzer braucht öffentliche Methoden. Der Endbenutzer braucht die Arbeit der internen Methoden nicht.

Wenn Sie verstehen wollen, wie das alles funktioniert, dann sind die Artikel, die diese ganze Küche beschreiben, für diesen Zweck geschrieben. Es ist nicht ganz klar, was und wie Sie tun wollen. Du sagst es nicht, du gibst keine Beispiele, du zeigst nur auf eine Zeile aus einer großen Anzahl von ihnen und sagst, dass sie nicht funktioniert....

leonerd #:
Im Allgemeinen gibt es genug Verbindungen. Ich habe das Gefühl, dass niemand die Bibliothek in der Praxis benutzt.

Wenn man die Beschreibung nicht liest und versucht, interne Methoden zu modifizieren und für sich zu nutzen, dann hat nicht der Autor genug Fehler, sondern derjenige, der sie modifiziert.

Und, ja, die Bibliothek ist noch in der Entwicklung.

Ich werde mir den Fülltyp ansehen, danke.

Aber es ist besser, das in der Diskussion der entsprechenden Artikel zu besprechen - so kann man die Beschreibung auf einmal sehen, anstatt über eine Sache in der Diskussion über etwas anderes zu reden.

 
А зачем Вы в приватные методы лезете? Они нужны только для работы библиотеки.
Ich habe keine Lust, dort hineinzugehen. Wenn alles funktionieren würde, würde ich es nicht einmal öffnen.
 
leonerd #:
Ich habe keine Lust, dort hineinzugehen. Wenn alles funktionieren würde, würde ich es nicht einmal öffnen.

Was funktioniert nicht? Der Code, bitte. Nur zu sagen, dass es nicht funktioniert, ist nicht produktiv.

 
Artyom Trishkin #:

Was funktioniert bei Ihnen nicht? Den Code, bitte. Nur zu sagen, dass es nicht funktioniert, ist nicht produktiv.

Ich stimme zu, dass es nicht produktiv ist. Deshalb habe ich in diesem Kommentar so viele Details wie möglich angegeben https://www.mql5.com/ru/forum/438481/page2#comment_53551638.

Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar""
Обсуждение статьи "DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar""
  • 2023.06.19
  • Artyom Trishkin
  • www.mql5.com
Опубликована статья DoEasy. Элементы управления (Часть 31): Прокрутка содержимого элемента управления "ScrollBar" : Автор: Artyom Trishkin...
 
leonerd #:
Ich habe in diesem Kommentar möglichst viele Details angegeben.

Maximale Details sind Code, den man kompilieren und ausführen kann, um zu sehen, was nicht funktioniert, und um die Ursache zu finden und zu melden.

Ohne Tests werden die Artikel nicht veröffentlicht. In Tests funktioniert alles. Deshalb frage ich jetzt zum dritten Mal: Was machen Sie da und was funktioniert nicht? Den Code, bitte.