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

 
Anatoli Kazharski:

Fügen Sie Registerkarten hinzu, bevor Sie ein Element erstellen. Sehen Sie sich die Beispiele in den Artikeln über dieses oder jenes Element an. Wenn etwas nicht erwähnt wird, bedeutet das, dass diese Funktion noch nicht existiert.

Das Hinzufügen und Löschen nach dem Erstellen eines Elements funktioniert jetzt nur in Listen und Tabellen.

D.h. in dieser Klasse ist die CreateTabs-Methode grundlegend für die Erstellung von Tabs? Und ist es beim Ändern der Anzahl der Tabs korrekt, wenn wir die Delete-Methode verwenden und danach die CreateTabs-Methode? Oder müssen alle Eigenschaften nach der Delete-Methode erneut angegeben werden, wie bei der ersten Erstellung?
 
Konstantin:
D.h. in dieser Klasse ist die Methode CreateTabs grundlegend für die Erstellung von Registerkarten? Wenn man die Anzahl der Registerkarten ändert, wäre es dann richtig, die Delete-Methode zu verwenden und danach die CreateTabs-Methode zu verwenden? Oder müssen alle Eigenschaften nach der Delete-Methode erneut angegeben werden, wie bei der ersten Erstellung?

Ja. Wir geben zuerst die Eigenschaften an und erstellen dann das Element.

Im Moment gibt es keinen Mechanismus zum korrekten Löschen von Elementen zur Laufzeit. Sie verbleiben in der allgemeinen Liste der Elemente. Aber versuchen Sie es so, wie Sie es in Ihrer Frage beschrieben haben. Ich habe diesen Weg noch nicht getestet.

 
Anatoli Kazharski:

Ja, wir legen zuerst die Eigenschaften fest und erstellen dann das Element.

Im Moment gibt es keinen Mechanismus zum korrekten Löschen von Elementen zur Laufzeit. Sie verbleiben in der allgemeinen Liste der Elemente. Aber versuchen Sie es so, wie Sie es in Ihrer Frage beschrieben haben. Ich habe es noch nicht auf diese Weise getestet.

))) Ich probiere es schon, wenn alles klappt, werde ich ein Beispiel posten.
 

so funktioniert es:

#ifndef __TBLTABS_MQH__
#define __TBLTABS_MQH__

#include "..\\..\\..\\v1.00\\lib\\define.mqh"

#include <Arrays\List.mqh>
#include <EasyAndFastGUI\WndEvents.mqh>

//+------------------------------------------------------------------+
class CTblTabs
  {
private:
   int      m_x;
   int      m_y;
   long     m_chart_id;
   int      m_subwin;
   string   m_text[];
   int      m_width[];
   CTabs    m_tabs;
   CWindow  *m_form;

public:
                     CTblTabs(void);
                    ~CTblTabs(void);
   bool              Create(CWindow &a_form,const long a_chart_id,const int a_subwin,     // Erstellung von Objekten
                              const int a_x,const int a_y);
   void              OnLinkProgram(CList &a_pair);                                        // Kommunikation mit dem Programm
   CTabs*            GetTbl(void) { return &m_tabs; }

private:
   void              UpdateTabs(CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[]);   // Tabellenwerte aktualisieren
   bool              ReInit(CWindow &a_form,CList &a_pair,CTabs &a_tabs,string &a_text[],       // Neuinitialisierung der Objektregisterkarten
                              int &a_width[],const long a_chart_id,const int a_subwin,const int a_x,const int a_y);
  };
//+------------------------------------------------------------------+
/*!
 \brief Designer
*/
CTblTabs::CTblTabs(void) : m_x(0), m_y(0), m_chart_id(0), m_subwin(0), m_form(NULL) { }
/*!
 \brief Destructor
*/
CTblTabs::~CTblTabs(void) {
   m_form = NULL;
}
/*!
 \brief Erstellen eines Objekts
 \param CWindow &a_form - Formularobjekt
 \param const long a_chart_id - Diagramm-ID
 \param const int a_subwin - Diagramm-Unterfenster
 \param const int a_x - X-Koordinate
 \param const int a_y - Y-Koordinate
 \return true if successful, otherwise false
*/
bool CTblTabs::Create(CWindow &a_form,const long a_chart_id,const int a_subwin,const int a_x,const int a_y) {
   m_x = a_x;
   m_y = a_y;
   m_chart_id = a_chart_id;
   m_subwin   = a_subwin;
   m_form     = &a_form;

   //--- Arrays mit Text und Breite für Registerkarten
   //::ArrayResize(m_text, 1);
   //m_text[0] = "NULL_NULL";
   //::ArrayResize(m_width, 1);
   //m_width[0] = 65;

   m_tabs.WindowPointer(a_form);       // Speichern des Zeigers auf das Formular

   //--- Koordinaten
   int _x = a_form.X() + m_x;
   int _y = a_form.Y() + m_y;

   //--- Abmessungen
   m_tabs.XSize(400);
   m_tabs.YSize(200);

   //--- Eigenschaften
   m_tabs.TabYSize(20);
   m_tabs.PositionMode(TABS_TOP);
   m_tabs.AutoXResizeMode(true);
   m_tabs.AutoYResizeMode(true);
   m_tabs.AutoXResizeRightOffset(200);
   m_tabs.AutoYResizeBottomOffset(23);
   m_tabs.TabBorderColor(clrLightSteelBlue);
   m_tabs.SelectedTab((m_tabs.SelectedTab() == WRONG_VALUE) ? 0 : m_tabs.SelectedTab());


   //--- Registerkarten mit den angegebenen Eigenschaften hinzufügen
   //for(int i = 0, _size = ArraySize(m_text); i < _size; ++i)
   // m_tabs.AddTab(m_text[i], m_width[i]);

   //--- ein Steuerelement erstellen
   //if(!m_tabs.CreateTabs(a_chart_id, a_subwin, _x, _y))
   //   return false;

//---
   return true;
}
/*!
 \brief Verbindung mit dem Programm
 \param CList &a_pair - Zeiger auf die Liste der Handelspaare mit Signalen
*/
void CTblTabs::OnLinkProgram(CList &a_pair) {
   if(a_pair.Total() != m_tabs.TabsTotal())
      this.ReInit(m_form, a_pair, m_tabs, m_text, m_width, m_chart_id, m_subwin, m_x, m_y);
   else
      this.UpdateTabs(a_pair, m_tabs, m_text, m_width);
}
//+------------------------------------------------------------------+
/*!
 \brief Registerwerte aktualisieren
 \param CList &a_pair - Zeiger auf die Liste der Handelspaare mit Signalen
 \param CTabs &a_tabs - Tabellenobjekt
 \param string &a_text[] - Array mit Tabs Name
 \param int &a_width[] - Array mit Tabs Breite Größe
*/
void CTblTabs::UpdateTabs(CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[]) {
   int _total = a_tabs.TabsTotal();
   //--- Zerlegen der Daten in eine Tabelle
   int _count = 0;
   for(CWrapUnitPair *_unit = a_pair.GetFirstNode(); _unit != NULL; _count++, _unit = a_pair.GetNextNode())
      a_tabs.Text(_count, _unit.data_tt[0].ticker + " " + _unit.data_tt[1].ticker);

}
/*!
 \brief Reinitialisierung des Objekts tabs
 \param CWindow &a_form - Formularobjekt
 \param CList &a_pair - Zeiger auf die Liste der Handelspaare mit Signalen
 \param CTabs &a_tabs - Tabellenobjekt
 \param string &a_text[] - Array mit den Namen der Tabs
 \param int &a_width[] - Array mit der Breite der Tabs
 \param const long a_chart_id - Chart ID
 \param const int a_subwin - Chart Subwindow
 \param const int a_x - X-Koordinate
 \param const int a_y - Y-Koordinate
 \return true bei Erfolg, sonst false
*/
bool CTblTabs::ReInit(CWindow &a_form,CList &a_pair,CTabs &a_tabs,string &a_text[],int &a_width[],const long a_chart_id,
                                                                                  const int a_subwin,
                                                                                  const int a_x,
                                                                                  const int a_y) {

   a_tabs.Delete();     // Löschen Sie die Registerkarten aus dem Objekt

   //--- Arrays von Werten neu initialisieren
   int _total = a_pair.Total();
   ::ArrayResize(a_text, _total);
   ::ArrayResize(a_width, _total);

   //--- Füllen der Arrays mit Registerkartennamen
   int _count = 0;
   for(CWrapUnitPair *_unit = a_pair.GetFirstNode(); _unit != NULL; _count++, _unit = a_pair.GetNextNode()) {
      a_text[_count]  = _unit.data_tt[0].ticker + " " + _unit.data_tt[1].ticker;
      a_width[_count] = 65;
   }

   //--- Registerkarten mit den angegebenen Eigenschaften hinzufügen
   for(int i = 0, _size = ArraySize(m_text); i < _size; ++i)
      a_tabs.AddTab(a_text[i], a_width[i]);

   //--- Koordinaten
   int _x = a_form.X() + a_x;
   int _y = a_form.Y() + a_y;

   //--- ein Steuerelement erstellen
   if(!a_tabs.CreateTabs(a_chart_id, a_subwin, _x, _y))
      return false;
//---
   return true;
}
//+------------------------------------------------------------------+

#endif // __TBLTABS_MQH__

Ich habe farblich hervorgehoben, was in der Klassenerstellungsmethode nicht mehr benötigt wird, da es im Wesentlichen in der ReInit-Methode verwendet wird .

Alle Ereignis- und Interaktionsmechanismen werden in der Hauptformklasse des Programms beschrieben.


 
Konstantin:

so funktioniert es:

Danke für das Beispiel. Interessant.

 
Anatoli Kazharski:

Danke für das Beispiel. Interessant.


Ich habe einen Fehler gefunden - wenn keine Registerkarten vorhanden sind, stürzt das Programm beim Ändern der Größe des Diagramms (Formular) mit dem Fehler array out of range in 'Tabs.mqh' (821,21) ab

 
Konstantin:

einen Fehler gefunden - wenn keine Registerkarten vorhanden sind, stürzt das Programm beim Ändern der Größe des Diagramms (Formular) mit dem Fehler array out of range in 'Tabs.mqh' (821,21) ab .

Im nächsten Update wird es eine Korrektur geben.
 

Beim Erstellen von Objekten (Formularelementen) wird die Methode CWndContainer::AddToElementsArray(0, m_object); verwendet. Gibt es einen Mechanismus, um ein bestimmtes Objekt korrekt aus diesem Container zu entfernen?

Dies ist beim Erstellen/Löschen von Diagrammen erforderlich, wenn der obige Mechanismus zum Hinzufügen/Löschen von Registerkarten verwendet wird.

 
Konstantin:

Beim Erstellen von Objekten (Formularelementen) wird die Methode CWndContainer::AddToElementsArray(0, m_object); verwendet. Gibt es einen Mechanismus, um ein bestimmtes Objekt korrekt aus diesem Container zu entfernen?

Dies ist beim Erstellen/Löschen von Diagrammen erforderlich, wenn der obige Mechanismus zum Hinzufügen/Löschen von Registerkarten verwendet wird.

Dies ist noch nicht implementiert worden.

 
Anatoli Kazharski:

Dies ist noch nicht implementiert.

es wäre logischer, die Löschung auf Anfrage des Klassenbenutzers vorzunehmen, da die Arbeit mit Objekten in Dynamics die Schnittstelle mehr animiert, für meine Aufgabe werde ich die Anzahl der Charts durch die Anzahl der Tickerpaare eingeben, aber da ich 702 Tickerpaare auf der Grundlage von 27 Tickern habe, ist es nicht schwer zu berechnen, was die Bremsen sein werden, wenn man zu einem anderen Markt geht, wo es viel mehr Ticker gibt ))

Ich werde übrigens auch prüfen, wie viel Speicherplatz eine solche Anzahl von Tickerpaaren verbraucht ))