Diskussion zum Artikel "Graphisches Interface X: Textauswahl im mehrzeiligen Textfeld (build 13)" - Seite 5

 
Pavel Kolchin:
@Pavel Kolchin, um zu verhindern, dass Pfeile aus Geschäften über dem Panel hängen, verwenden Sie die Methode CWndEvents::ResetWindow().
 
Anatoli Kazharski:

ja, aber es gibt ein Problem, bei längerem Gebrauch erscheint ein Fehler ohne Grund, das Löschen des EA-Subfensters bewirkt, dass der EA gelöscht wird

img

 
Pavel Kolchin:

ja, aber es gibt ein Problem, wenn es lange Zeit benutzt wird, erscheint ein Fehler ohne Grund, das Löschen des EA-Unterfensters führt zum Löschen des EA

Setzen Sie in der Datei Defines.mqh den Parameter EXPERT_IN_SUBWINDOW auf false:

//+------------------------------------------------------------------+
//|Definiert.mqh |
//| Copyright 2015, MetaQuotes Software Corp. | |
//|http://www.mql5.com |
//+------------------------------------------------------------------+
//--- Experte im Fenstermodus
#define  EXPERT_IN_SUBWINDOW false

//---

Für Expert Advisors, deren grafische Oberfläche sich im Hauptfenster des Charts befindet, sollte der Wert dieses Parameters false sein.

 
Anatoli Kazharski:

Setzen Sie in der Datei Defines.mqh den Parameter EXPERT_IN_SUBWINDOW auf false:


Es ist klar, es gibt eine Funktion, die funktioniert funktioniert funktioniert funktioniert funktioniert (mehrere Tage) und dann nimmt und scheitert.


//+------------------------------------------------------------------+
//| Überprüfen und Aktualisieren der Nummer des Expert Advisor-Fensters |
//+------------------------------------------------------------------+
void CWndEvents::CheckExpertSubwindowNumber(void)
  {
//--- Beenden, wenn es sich nicht um einen Experten handelt
   if(PROGRAM_TYPE!=PROGRAM_EXPERT)
      return;
//--- Ermitteln der Anzahl der Unterfenster im Diagramm
   int subwindows_total=(int)::ChartGetInteger(m_chart_id,CHART_WINDOWS_TOTAL);
//--- Beenden, wenn sich die Anzahl der Unterfenster und die Anzahl der Indikatoren nicht geändert haben
   if(subwindows_total==m_subwindows_total)
      return;
//--- Speichern der aktuellen Anzahl von Unterfenstern
   m_subwindows_total=subwindows_total;
//--- Prüfen, ob ein Experten-Unterfenster vorhanden ist
   bool is_subwindow=false;
//--- Suchen Sie das Unterfenster des Experten.
   for(int sw=0; sw<subwindows_total; sw++)
     {
      //--- Anhalten der Schleife, wenn es ein Experten-Unterfenster gibt
      if(is_subwindow)
         break;
      //--- Wie viele Indikatoren sich in diesem Fenster/Teilfenster befinden
      int indicators_total=::ChartIndicatorsTotal(m_chart_id,sw);
      //--- Gehen wir alle Indikatoren im Fenster durch 
      for(int i=0; i<indicators_total; i++)
        {
         //--- Abrufen der Kurzbezeichnung des Indikators
         string indicator_name=::ChartIndicatorName(m_chart_id,sw,i);
         //--- Wenn es sich nicht um ein Experten-Unterfenster handelt, wechseln Sie zum nächsten Fenster
         if(indicator_name!=m_subwindow_shortname)
            continue;
         //--- Beachten Sie, dass das EA-Unterfenster
         is_subwindow=true;
         //--- Wenn sich die Nummer des Teilfensters geändert hat, dann 
         // wir müssen die neue Zahl in allen Elementen des Hauptformulars speichern
         if(sw!=m_subwin)
           {
            //--- Nummer des Unterfensters speichern
            m_subwin=sw;
            //--- Speichern wir sie auch in allen Elementen des Hauptformulars der Schnittstelle
            int elements_total=CWndContainer::ElementsTotal(0);
            for(int e=0; e<elements_total; e++)
               m_wnd[0].m_elements[e].SubwindowNumber(m_subwin);
           }
         //---
         break;
        }
     }
//--- Wenn das Unterfenster "Expert Advisor" nicht gefunden wird, löschen Sie den Expert Advisor
   if(!is_subwindow)
     {
      ::Print(__FUNCTION__," > Das Löschen eines EA-Subfensters führt zum Löschen des EAs!");
      //--- Entfernen des Expert Advisors aus dem Diagramm
      ::ExpertRemove();
     }
  }
 
Pavel Kolchin:


es ist klar, dass es eine Funktion gibt, die ein paar Tage lang funktioniert und dann nicht mehr.

Sie verwenden nicht die neueste Version der Bibliothek oder haben Änderungen an ihr vorgenommen. Am Anfang der Methode sollte diese Bedingung stehen:

//--- Beenden, wenn (1) es sich nicht um einen EA handelt oder (2) sich die EA-GUI im Hauptfenster befindet
   if(PROGRAM_TYPE!=PROGRAM_EXPERT || !EXPERT_IN_SUBWINDOW)
      return;

//---

Und das haben Sie:

//--- Beenden, wenn es sich nicht um einen Experten handelt
   if(PROGRAM_TYPE!=PROGRAM_EXPERT)
      return;
 
Anatoli Kazharski:

Sie verwenden nicht die aktuellste Version der Bibliothek oder haben Änderungen an ihr vorgenommen. Am Anfang dieser Methode sollte diese Bedingung stehen:

Ja, ich denke, das wäre besser)

Version 10.2, also mit allen Menüpunkten, die ich brauche, und mit mt4-Unterstützung.

Gibt es noch andere kritische Änderungen seither, die die Arbeit beeinflussen könnten?

 
Pavel Kolchin:

...

gab es seither weitere kritische Änderungen, die die Leistung beeinträchtigen könnten?

Das ist auf Anhieb schwer zu sagen. Es wird ständig etwas hinzugefügt und korrigiert.
 

Es ist wünschenswert, dem Formular einen Mechanismus für das Hinzufügen von Objekten auf dem Prinzip der "Fabrik", wie in Qt, oder etwas Ähnliches und vorzugsweise mit Orientierung relativ zueinander hinzuzufügen:

- rechts

- links

- oben

- unten

 
Konstantin:

Es ist wünschenswert, dem Formular einen Mechanismus für das Hinzufügen von Objekten auf dem Prinzip der "Fabrik", wie in Qt, oder etwas Ähnliches und vorzugsweise mit Orientierung relativ zueinander hinzuzufügen:

- rechts

- links

- oben

- unten

Bitte beschreiben Sie es im Detail. Ich weiß nicht, wie es in Qt ist.

Jetzt können Elemente relativ zum Formular positioniert werden: rechts, links, oben, unten. Nur das Formular kann ein Elternelement sein. In der nächsten Version wird es möglich sein, jedes andere Element als Elternelement zu setzen. Dies wird die Verwaltung und Positionierung von Elementen noch einfacher machen.

 
Anatoli Kazharski:

Beschreiben Sie es ausführlicher. Ich weiß nicht, wie es in Qt ist.

Jetzt können Elemente relativ zum Formular positioniert werden: rechts, links, oben, unten. Nur das Formular kann ein übergeordnetes Element sein. In der nächsten Version wird es möglich sein, jedes andere Element als Elternelement zu setzen. Dies wird die Verwaltung und Positionierung von Elementen noch einfacher machen.


in Qt ist eine Fabrikfunktion:

QWidgetAction *createWidget();

und so werden die Tests zur Erstellung von Widgets durchgeführt:

QWidget * widget() {
   static QWidget * inst = new QWidget;
   return inst;
}

und im Allgemeinen über QWidget hier sind alle Informationen.

Nun können Elemente relativ zum Formular positioniert werden : rechts, links, oben, unten.

Ich verstehe das nicht ganz, ist diese Positionierung des Elements relativ zu den Rändern und sie können sowohl hinter dem Formular als auch innerhalb des Formulars platziert werden?

Zum Beispiel, es gibt ein Formular, wir positionieren ein Element relativ zum linken Rand des Formulars weiter links?