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

 

Bei der Durchführung der Aufgabe des dynamischen Hinzufügens/Entfernens von Registerkarten und des Hinzufügens/Entfernens von Diagrammen zum Array der Registerkarten bin ich auf das Problem gestoßen, dass es nicht möglich ist, den Namen der Registerkarten in der Klasse CTabs zu ermitteln. In diesem Zusammenhang schlage ich dem Entwickler vor, diese Klasse mit einer Methode zu ergänzen, um den Namen der Registerkarte zu erhalten:

   //--- Setzt (1) den Text (Tab-Name) auf den angegebenen Index (2) получает текст (имя вкладки) по указанному индексу
   void              Text(const uint index,const string text);                     // diese Methode ist
   string            Text(const uint index) { return m_tab[index].text; }  // das ist nicht genug
Das Hinzufügen dieser Methode ist notwendig, da es selbst bei einer Vererbung von der CTabs-Klasse, um die fehlenden Methoden zu ergänzen, unmöglich ist, die überladene Text-Methode zu implementieren, da das m_tab[] -Objekt im geschützten Bereich der Klasse liegt. Und die Klasse zu bearbeiten, um sie sich selbst anzupassen, verstößt gegen das OOP-Prinzip.
 
Konstantin:

...

Wird alles tun, was Sie über in früheren Beiträgen schrieb.
 
Fügen Sie Bilder zu den EasyAndFastGUI/MQL5/Images/EasyAndFastGUI/Icons/bmp16 Bibliothek. Für "zweibeinige" Arbitrageure wird nicht nur für mich nützlich sein))
Dateien:
 
Anatoli Kazharski:
@Pavel Kolchin, um zu verhindern, dass Pfeile von Geschäften über dem Panel hängen, verwenden Sie die Methode CWndEvents::ResetWindow().
Wo soll ich sie einfügen?
 
Pavel Kolchin:
wohin damit?
Versuchen Sie OnTrade().
 
Anatoli Kazharski:
Versuchen Sie OnTrade().


Das geht nicht, es schlägt fehl.

In der Menüdatei gibt es kein solches Ereignis, aber wenn Sie es in die Hauptdatei einfügen, schlägt es fehl.

 
Pavel Kolchin:


Ich kann nicht, es schlägt fehl

In der Menüdatei gibt es kein solches Ereignis, aber wenn Sie es in die Hauptdatei einfügen, schlägt es fehl.

Sie müssen eine Methode CProgram::OnTradeEvent() in der benutzerdefinierten Anwendungsklasse erstellen.

Und in der Hauptdatei sollte sie in der Funktion OnTrade() aufgerufen werden:

//+------------------------------------------------------------------+
//| Funktion Handel|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   program.OnTradeEvent();
  }

//---

Ich habe zum Beispiel diesen Inhalt der CProgram::OnTradeEvent()-Methode:

//+------------------------------------------------------------------+
//| Ereignis der Handelstransaktion|
//+------------------------------------------------------------------+
void CProgram::OnTradeEvent(void)
  {
//--- Senden eines Handelsereignisses an alle Charts
   m_events.SendEventToAllCharts(0,ON_TRADE_EVENT,0,0.0,m_program_name);
//--- Festlegen der Transaktionen der letzten Position
   if(m_show_deals.CheckButtonState())
      if(m_vdeals.ShowDealsLastPosition())
         ResetWindow();
//--- Überprüfung der Stop-Loss-Distanz
   if(m_trailing_stop.CheckButtonState())
      m_ctrade.CheckStopLossSize(::Symbol());
//--- Nullstellung von Variablen für Handelsoperationen
   m_ctrade.ZeroCalcPositionVariables();
//--- Initialisierung des Balance-Arrays und Aktualisierung der Serien im Diagramm
   InitBalanceArray();
   m_line_chart.SeriesUpdate(0,m_balance_data,"Balance",clrCornflowerBlue);
  }
 
Anatoli Kazharski:


Noch ein bisschen mehr draufgeben
public:
   //--- Handel
   void              OnTradeEvent(void);
und alles funktioniert )
 
Ich kann nicht herausfinden, wie ich Element_2, z.B. eine Tabelle, an den unteren Rand von Element_1, z.B. die gleiche Tabelle, binden kann, d.h. Element_1 liegt über Element_2. Daraus ergibt sich die Notwendigkeit, dass bei einer Größenänderung des Diagramms die untere Begrenzung von Element_1 verschoben wird und die obere Begrenzung von Element_2 nachgeschoben wird. Die Bibliothek verfügt über die Methoden AutoYResizeMode und AutoYResizeBottomOffset, aber ich kann nicht herausfinden, wie man die Verschiebung der oberen Grenzen implementiert.
 
Konstantin:
Ich kann nicht herausfinden, wie ich Element_2, z.B. eine Tabelle, an den unteren Rand von Element_1, z.B. dieselbe Tabelle, binden kann, d.h. Element_1 liegt über Element_2. Daraus ergibt sich die Notwendigkeit, dass bei einer Größenänderung des Diagramms die untere Begrenzung von Element_1 verschoben wird und die obere Begrenzung von Element_2 nachgeschoben wird. Es gibt in der Bibliothek die Methoden AutoYResizeMode und AutoYResizeBottomOffset, aber ich kann nicht herausfinden, wie man die Verschiebung der oberen Begrenzungen implementiert.

Es gibt auch Methoden zum Binden von Elementen:

   //--- Modus (get/set) der Bindung eines Elements an (1) den rechten und (2) den unteren Rand des Fensters
   bool              AnchorRightWindowSide(void)               const { return(m_anchor_right_window_side);   }
   void              AnchorRightWindowSide(const bool flag)          { m_anchor_right_window_side=flag;      }
   bool              AnchorBottomWindowSide(void)              const { return(m_anchor_bottom_window_side);  }
   void              AnchorBottomWindowSide(const bool flag)         { m_anchor_bottom_window_side=flag;     }

//---

Versuchen Sie, das Problem in Kombination mit diesen Eigenschaften zu lösen.