Die Methoden X(const int x) und Y(const int y) beeinflussen die Position der Tabelle im Formular in keiner Weise, sie befindet sich immer in der linken oberen Ecke.
Die relativen Koordinaten werden bei der Erstellung von Elementen in einer benutzerdefinierten Klasse festgelegt :
//--- Ein Steuerelement erstellenif(!m_canvas_table.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
return(false);
wenn es zwei Tabellen gibt, ist der erste Parameter immer 0 oder ist es eine Seriennummer von identischen Objekten?
Der erste Parameter ist die Nummer des Formulars, an das das Objekt angehängt ist. Vielleicht fügen Sie ein und dieselbe Tabelle in die gemeinsame Liste der Elemente ein.
Anatoli Kazharski: Der erste Parameter ist die Nummer des Formulars, an das das Element angehängt ist. Vielleicht fügen Sie der gemeinsamen Liste der Elemente die gleiche Tabelle hinzu.
Was meinen Sie mit der gemeinsamen Liste? Wo ist sie getrennt?
Hier ist die Methode zur Erstellung in der Formularklasse:
/*!
\brief Objekt erstellen
\param const string a_name - Programmname
\param const uint a_pause - Pause für die Aktualisierung der Statuszeile
\return true bei Erfolg, sonst false
*/bool CMainForm::Create(conststring a_name,constuint a_pause) {
m_counter500.SetParameters(16, a_pause);
m_counter16.SetParameters(16, 16);
if(!CreateForm(m_form, a_name))
returnfalse;
if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
returnfalse;
if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
returnfalse;
if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
returnfalse;
//--- Hinzufügen des Tabellenobjekts zu dem gemeinsamen Array von Objektgruppen
CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());
CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());
m_chart.Redraw();
//---returntrue;
}
GetTbl Methode gibt einen Zeiger auf CCanvasTable m_table zurück
Hier ist die create-Methode in der Formular-Klasse:
Die Methode GetTbl gibt einen Zeiger auf CCanvasTable m_table zurück .
//--- Ein Steuerelement erstellenif(!m_canvas_table2.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
return(false);
//--- Hinzufügen des Objekts zu dem gemeinsamen Array von Objektgruppen
CWndContainer::AddToElementsArray(0,m_canvas_table2);
/*!
\brief Objekt erstellen
\param const string a_name - Programmname
\param const uint a_pause - Pause für die Aktualisierung der Statuszeile
\return true bei Erfolg, sonst false
*/bool CMainForm::Create(conststring a_name,constuint a_pause) {
m_counter500.SetParameters(16, a_pause);
m_counter16.SetParameters(16, 16);
if(!CreateForm(m_form, a_name))
returnfalse;
if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
returnfalse;
if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
returnfalse;
//--- Hinzufügen des Tabellenobjekts zu dem gemeinsamen Array von ObjektgruppenCWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
returnfalse;
//--- Hinzufügen des Tabellenobjekts zu dem gemeinsamen Array von ObjektgruppenCWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());
m_chart.Redraw();
//---returntrue;
}
und alles funktionierte, es stellt sich heraus, dass sofort nach dem Erstellen eines Objekts sollte es in einem Container platziert werden und erst dann ein anderes Objekt erstellen ))
Nein, ich habe Tabellen in anderen Klassen, ich verwende modulare Programmierung )), so dass es bequemer ist, die Funktionalität zu verwalten - Hauptformularklasse, Tabellenklasse 1, Tabellenklasse 2 usw. Am Ende sind alle Elemente in der Hauptformularklasse als separate vorgefertigte Objekte zusammengefasst.
Nein, ich habe Tabellen in anderen Klassen, ich verwende modulare Programmierung )), so dass es bequemer ist, die Funktionalität zu verwalten - Hauptformularklasse, Tabellenklasse 1, Tabellenklasse 2 usw. Am Ende werden alle Elemente in der Hauptformularklasse als separate fertige Objekte gesammelt.
Einverstanden. Viele Benutzer dieser Bibliothek tun dies, aber ich komme nicht an sie heran. )
Anatoli Kazharski: Ich stimme zu. Viele Nutzer dieser Bibliothek tun das, aber ich komme einfach nicht an sie heran. )
Übrigens, es gibt ein Problem:
CWndEvents::CWndEvents(void) : m_chart_id(0),
m_subwin(0),
m_active_window_index(0),
m_indicator_shortname(""),
m_program_name(PROGRAM_NAME),
m_subwindow_handle(INVALID_HANDLE),
m_subwindow_shortname(""),
m_subwindows_total(1)
{
//--- Starten Sie den Timerif(!::MQLInfoInteger(MQL_TESTER))
::EventSetMillisecondTimer(TIMER_STEP_MSC);
//--- Abrufen der ID des aktuellen Diagramms
m_chart.Attach();
//--- Verfolgung von Mausereignissen einschalten
m_chart.EventMouseMove(true);
//--- Befehlszeilenaufruf für Leertaste und Eingabetaste deaktivieren
m_chart.SetInteger(CHART_QUICK_NAVIGATION,false);
//--- Nummer des Teilfensters bestimmen
DetermineSubwindow();
}
Die ausgewählte Zeile erlaubt es nicht, im Tester zu arbeiten. Es ist besser, eine Auswahl wie diese zu treffen:
enum ENUM_GRAPHICS {
GRAPHICS_NO = 0, // keine Notwendigkeit für Grafiken
GRAPHICS_REAL = 1, // Charts für den realen Handel
GRAPHICS_TEST = 2// Grafiken für Tests
};
/*!
Gibt einen Hinweis auf das laufende Programm
*/
ENUM_GRAPHICS CCheck::GetGraphics(void) { return m_graphics; }
//-----------------------------------------------------------------------------+/*!
Vorzeichen der Grafikanzeige
\Rückgabe des Vorzeichens der Programmoperation aus der Aufzählung ENUM_GRAPHICS
*/
ENUM_GRAPHICS CCheck::CheckGraphicsDisplay(void) {
if(MQLInfoInteger(MQL_OPTIMIZATION) || (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)))
m_graphics = GRAPHICS_NO;
elseif(!MQLInfoInteger(MQL_OPTIMIZATION) && !MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE))
m_graphics = GRAPHICS_REAL;
elseif(MQLInfoInteger(MQL_VISUAL_MODE))
m_graphics = GRAPHICS_TEST;
//---return m_graphics;
}
und im Programm eine Auswahl wie diese zu treffen:
//--- Einstellung für OnTimer()uint _pause = 0;
if(in_param.graphics == GRAPHICS_REAL)
_pause = 500; // 500 mselseif(in_param.graphics == GRAPHICS_TEST)
_pause = 60000; // 1 Minuteif(!main_form.Create(name_mts, _pause)) {
::Print(__FUNCTION__," > Fehler bei der Erstellung einer GUI!");
returnINIT_FAILED;
}
oder verwenden Sie einfach Flags, um eine Auswahl zu treffen
Die Methoden X(const int x) und Y(const int y) beeinflussen die Position der Tabelle im Formular in keiner Weise, sie befindet sich immer in der linken oberen Ecke.
Die relativen Koordinaten werden bei der Erstellung von Elementen in einer benutzerdefinierten Klasse festgelegt :
//---
Was ist die Aufgabe?
Relative Koordinaten werden festgelegt , wenn Elemente in einer benutzerdefinierten Klasse erstellt werden:
//---
Was ist die Aufgabe?
zwei Tabellen horizontal zu platzieren, x_gap,y_gap ändert die Position des horizontalen Scrollens und das war's ((.
PS. so, es scheint, verschoben haben, aber aus irgendeinem Grund zwei Tabellen verschoben werden ))
und in der Methode:
CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());wenn es zwei Tabellen gibt, ist der erste Parameter immer 0 oder ist es eine Seriennummer von identischen Objekten?
Aus irgendeinem Grund verschiebt sich die erste Tabelle hartnäckig unter die zweite Tabelle.
...
PS. also, es scheint sich verschoben zu haben, aber aus irgendeinem Grund haben sich zwei Tabellen verschoben ))
und in der Methode:
CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());wenn es zwei Tabellen gibt, ist der erste Parameter immer 0 oder ist es eine Seriennummer von identischen Objekten?
Der erste Parameter ist die Nummer des Formulars, an das das Element angehängt ist. Vielleicht fügen Sie der gemeinsamen Liste der Elemente die gleiche Tabelle hinzu.
Was meinen Sie mit der gemeinsamen Liste? Wo ist sie getrennt?
Hier ist die Methode zur Erstellung in der Formularklasse:
GetTbl Methode gibt einen Zeiger auf CCanvasTable m_table zurück
...
Ist das das von Ihnen gewünschte Ergebnis?
//---
Ich habe ein Beispiel im Archiv angehängt:
Hier ist die create-Methode in der Formular-Klasse:
Die Methode GetTbl gibt einen Zeiger auf CCanvasTable m_table zurück .
Wollen Sie ein solches Ergebnis?
//---
Im Archiv ist ein Beispiel beigefügt:
Ich habe es so gemacht:
und alles funktionierte, es stellt sich heraus, dass sofort nach dem Erstellen eines Objekts sollte es in einem Container platziert werden und erst dann ein anderes Objekt erstellen ))
Nein, ich habe Tabellen in anderen Klassen, ich verwende modulare Programmierung )), so dass es bequemer ist, die Funktionalität zu verwalten - Hauptformularklasse, Tabellenklasse 1, Tabellenklasse 2 usw. Am Ende sind alle Elemente in der Hauptformularklasse als separate vorgefertigte Objekte zusammengefasst.
Nein, ich habe Tabellen in anderen Klassen, ich verwende modulare Programmierung )), so dass es bequemer ist, die Funktionalität zu verwalten - Hauptformularklasse, Tabellenklasse 1, Tabellenklasse 2 usw. Am Ende werden alle Elemente in der Hauptformularklasse als separate fertige Objekte gesammelt.
Ich stimme zu. Viele Nutzer dieser Bibliothek tun das, aber ich komme einfach nicht an sie heran. )
Übrigens, es gibt ein Problem:
Die ausgewählte Zeile erlaubt es nicht, im Tester zu arbeiten. Es ist besser, eine Auswahl wie diese zu treffen:
und im Programm eine Auswahl wie diese zu treffen:
oder verwenden Sie einfach Flags, um eine Auswahl zu treffen