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.
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.
#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,constlong a_chart_id,constint a_subwin, // Erstellung von Objektenconstint a_x,constint 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 aktualisierenbool ReInit(CWindow &a_form,CList &a_pair,CTabs &a_tabs,string &a_text[], // Neuinitialisierung der Objektregisterkartenint &a_width[],constlong a_chart_id,constint a_subwin,constint a_x,constint 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,constlong a_chart_id,constint a_subwin,constint a_x,constint 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//--- Koordinatenint _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))
// returnfalse;//---returntrue;
}
/*!
\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);
elsethis.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 Tabelleint _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[],constlong a_chart_id,
constint a_subwin,
constint a_x,
constint a_y) {
a_tabs.Delete(); // Löschen Sie die Registerkarten aus dem Objekt//--- Arrays von Werten neu initialisierenint _total = a_pair.Total();
::ArrayResize(a_text, _total);
::ArrayResize(a_width, _total);
//--- Füllen der Arrays mit Registerkartennamenint _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ügenfor(int i = 0, _size = ArraySize(m_text); i < _size; ++i)
a_tabs.AddTab(a_text[i], a_width[i]);
//--- Koordinatenint _x = a_form.X() + a_x;
int _y = a_form.Y() + a_y;
//--- ein Steuerelement erstellenif(!a_tabs.CreateTabs(a_chart_id, a_subwin, _x, _y))
returnfalse;
//---returntrue;
}
//+------------------------------------------------------------------+#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.
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
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 .
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.
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.
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 ))
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 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.
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.
so funktioniert es:
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.
so funktioniert es:
Danke für das Beispiel. Interessant.
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
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 .
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.
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.
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 ))