Diskussion zum Artikel "Grafische Interfaces XI: Integration der graphischen Standardbibliothek (build 16)" - Seite 7

 

Ich habe es reproduziert. Ich muss die Größe des Panels ändern, wenn sich der Schieberegler am oberen Rand des Panels befindet. Danach hängt der Schieberegler und alle Elemente auf dem Bedienfeld.

[Gelöscht]  

Hallo

hat jemand die Ursache für die Störung im obigen Beitrag gefunden?

Ich bekomme den Fehler"array out of range in 'WndEvents.mqh' (287,72)"

 
Спартак Угланов:

Hallo

Hat jemand die Ursache für die Störung im obigen Beitrag gefunden?

Ich bekomme den Fehler "array out of range in 'WndEvents.mqh' (287,72)"

eine Prüfung auf Bereichsüberschreitung einfügen und das war's.

[Gelöscht]  
Konstantin:

setzen Sie dort einfach einen Out-of-Bounds-Check ein und das war's.

Das ist eine interessante Idee, aber wie?


      int available_elements_total=CWndContainer::AvailableElementsTotal(m_active_window_index);
      int ass = ArraySize(m_wnd[m_active_window_index].m_available_elements);
      Print("ass = ",ass," available_elements_total = ",available_elements_total);
      for(int e=0; e<available_elements_total; e++)
        {
         CElement *el=m_wnd[m_active_window_index].m_available_elements[e];


Bei 12 Elementen sollte es theoretisch keine Bereichsüberschreitung geben.

(TradePanelTest Beispiel aus der Artikelserie)

 
Спартак Угланов:

Das ist eine interessante Idee, aber wie?



Bei 12 Elementen sollte es theoretisch keine Überschreitung der Reichweite geben.

(TradePanelTest Beispiel aus der Artikelserie)

Wenn ein Fehler auftritt, bedeutet dies, dass ein Fehler vorliegt. Führen Sie den Test mit einem Debugger aus, um zu sehen, was dort vor sich geht.

[Gelöscht]  
Konstantin:

Nun, wenn der Fehler vorhanden ist, bedeutet das, dass er da ist. Führen Sie ihn mit einem Debugger aus, das ist der sicherste Weg, um zu sehen, was da los ist.

Ich habe das Projekt in einen Ordner mit einem anderen Namen verschoben und die Indikator-Datei umbenannt, es funktioniert ohne Fehler.

Ich wurde am Montag geboren :O)

 
Anatoli Kazharski:


 

In den letzten Builds haben wir dem Compiler eine Meldung für die Fälle hinzugefügt, in denen eine Vorgängermethode in einem Nachkomme überladen wird:

deprecated behavior, hidden method calling will be disabled in a future MQL compiler version    

Beispiel

struct SFoo
  {
   static void func(int)
     {
      Print(__FUNCSIG__);
     }
  };
 
struct SBar : SFoo
  {
   static void func(double)
     {
      Print(__FUNCSIG__);
     }     
  };

void OnStart()
  {
   SBar::func(_Digits);       // !!! wird SFoo::func(int) genannt - das ist angemessener.
  }

In diesem Fall wird die Funktion func(int) des Vorfahren SFoo in der Nachfolgeklasse SBar aufgerufen, weil der Compiler sie in der Nachfolgeklasse nicht gefunden hat. Die Nachfolgeklasse hat nur die Funktion func(double), und der Compiler versucht, eine Funktion mit einem geeigneten Parameter im Vererbungsbaum zu finden.

Das heißt, der MQL5-Compiler führt eine Überladung durch, anstatt die Methode im Nachfahren zu überschreiben. Zu Beginn der Sprachentwicklung wurde diese Lockerung des MQL5-Compilers nicht als kritisch angesehen. Sie kann sich aber in Zukunft ändern, so dass es jetzt eine ausdrückliche Warnung an die Entwickler von MQL5-Programmen gibt, dies zu berücksichtigen und ihren Code zu korrigieren.

Streng genommen ist Overriding ein etwas weiter gefasster Begriff. Sie können den Unterschied zwischen Overloading und Overriding im Internet unter
nachlesen.

 
MetaQuotes Software Corp.:

Ich verstehe nichts, aber es ist sehr interessant! Der Compiler schimpft auf mehrere Funktionen, hier ist eine davon, wo mag er sie nicht?

//+------------------------------------------------------------------+
//| Die Verfügbarkeit des Elements|
//+------------------------------------------------------------------+
void CElement::IsAvailable(const bool state)
  {
//--- Beenden, wenn bereits eingestellt
   if(state==CElementBase::IsAvailable())
      return;
//--- Setzen
   CElementBase::IsAvailable(state);
//--- Andere Elemente
   int elements_total=ElementsTotal();
   for(int i=0; i<elements_total; i++)
      m_elements[i].IsAvailable(state);
//--- Prioritäten für Klicks mit der linken Maustaste festlegen
   if(state)
      SetZorders();
   else
      ResetZorders();
  }
 
Pavel Kolchin:

Ich verstehe nichts, aber es ist sehr interessant! Der Compiler schimpft auf mehrere Funktionen, hier ist eine davon, wo mag er sie nicht?

Denn es gibt auch

bool              IsAvailable(void)                         const { return(m_is_available);               }


Ich habe versucht, es zu ändern

   virtual void      Set Available(const bool state)                  { m_is_available=state;                 }
   bool              IsAvailable(void)                         const { return(m_is_available);               }

es ist ok )

Und das Gleiche wird mit den anderen gemacht werden müssen )